@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waterline.js","sources":["../../../src/render/sdf/waterline.ts"],"sourcesContent":["import type {\r\n BindGroup,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n Texture2D,\r\n Texture2DArray\r\n} from '@zephyr3d/device';\r\nimport type { Nullable, Vector3 } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport { getDevice } from '../../app/api';\r\nimport { fetchSampler } from '../../utility/misc';\r\nimport { declareDynamicSDFUniforms, declareGlobalSDFUniforms, sampleGlobalSDF } from '../../shaders/sdf';\r\nimport type { ClipmapTerrain } from '../../scene/terrain-cm/terrain-cm';\r\nimport type { GlobalSDF } from './global_sdf';\r\nimport { buildSDFProgram } from './sdf_programs';\r\n\r\n/** Seed coordinate meaning \"no seed yet\". */\r\nconst NO_SEED = -1e5;\r\nconst WORKGROUP = 8;\r\n/** Gaussian smoothing of the shore coordinates, in cells: half width and sigma. */\r\nconst SMOOTH_RADIUS = 4;\r\nconst SMOOTH_SIGMA = 2;\r\n/** Field value within which the bed model is used, and its coefficient bound. */\r\nconst SMOOTH_MODEL_REACH = 4;\r\nconst SMOOTH_MODEL_CLAMP = 1000;\r\n/** Jump-flooded distance, in metres, over which the bed model hands over to it. */\r\nconst SMOOTH_BLEND_START = 1;\r\nconst SMOOTH_BLEND_END = 4;\r\n/** Horizontal field gradient below which the bed counts as flat. */\r\nconst WATERLINE_MIN_SLOPE = 0.02;\r\n/** Bound of the linear model coefficients, within half float range. */\r\nconst WATERLINE_MODEL_CLAMP = 10000;\r\n/** Distance a terrain source reports off its height map: open water, well past the bed model's reach. */\r\nconst TERRAIN_OFF_MAP = 1e4;\r\n\r\n/**\r\n * What a {@link WaterlineField} is built from: a signed distance to the solid\r\n * ground at a world position, negative inside it, which the seed pass samples\r\n * at the rest level and half a cell above.\r\n * @public\r\n */\r\nexport interface WaterlineSource {\r\n /** Identifies the seed program the source builds into. */\r\n readonly label: string;\r\n /** Goes up whenever the ground may have changed. */\r\n readonly version: number;\r\n /** Declares the uniforms {@link WaterlineSource.sampleDistance} reads, in bind group 0. */\r\n declareUniforms(scope: PBGlobalScope): void;\r\n /** Sets the uniforms {@link WaterlineSource.declareUniforms} declared. */\r\n applyBindGroup(bindGroup: BindGroup): void;\r\n /** Signed distance to the ground at a world position. */\r\n sampleDistance(scope: PBInsideFunctionScope, pos: PBShaderExp): PBShaderExp;\r\n}\r\n\r\n/**\r\n * The global scene field as a waterline source: static geometry and the\r\n * terrain, without the dynamic instances.\r\n * @internal\r\n */\r\nexport class SDFWaterlineSource implements WaterlineSource {\r\n readonly label = 'SDF';\r\n private readonly _global: GlobalSDF;\r\n constructor(global: GlobalSDF) {\r\n this._global = global;\r\n }\r\n get version() {\r\n return this._global.staticVersion;\r\n }\r\n declareUniforms(scope: PBGlobalScope) {\r\n declareGlobalSDFUniforms(scope, 0, this._global.levels);\r\n // Unsampled, declared for GlobalSDF.applyBindGroup\r\n declareDynamicSDFUniforms(scope, 0);\r\n }\r\n applyBindGroup(bindGroup: BindGroup) {\r\n this._global.applyBindGroup(bindGroup);\r\n }\r\n sampleDistance(scope: PBInsideFunctionScope, pos: PBShaderExp) {\r\n return sampleGlobalSDF(scope, pos, this._global.levels);\r\n }\r\n}\r\n\r\n/**\r\n * A terrain's height map as a waterline source: the distance above the\r\n * surface over its slope, exact on a plane, as the global field composites\r\n * the terrain. Only the terrain, so nothing standing on a beach bends its\r\n * shoreline. Off the height map, or with no terrain, everything is water.\r\n * @internal\r\n */\r\nexport class TerrainWaterlineSource implements WaterlineSource {\r\n readonly label = 'Terrain';\r\n private _terrain: Nullable<ClipmapTerrain>;\r\n private _version: number;\r\n private _key: string;\r\n private readonly _region: Vector4;\r\n /** (height scale, world y, 1 / width, 1 / height) */\r\n private readonly _params: Vector4;\r\n private _dummy: Nullable<Texture2D>;\r\n constructor() {\r\n this._terrain = null;\r\n this._version = 0;\r\n this._key = '';\r\n this._region = new Vector4(0, 0, 0, 0);\r\n this._params = new Vector4(0, 0, 1, 1);\r\n this._dummy = null;\r\n }\r\n get terrain() {\r\n return this._terrain;\r\n }\r\n get version() {\r\n return this._version;\r\n }\r\n /** Sets the terrain and notices changes to it; call before the field updates. */\r\n setTerrain(terrain: Nullable<ClipmapTerrain>) {\r\n this._terrain = terrain;\r\n const heightMap = terrain?.heightMap ?? null;\r\n let key = '';\r\n if (terrain && heightMap) {\r\n const r = terrain.worldRegion;\r\n this._region.setXYZW(r.x, r.y, r.z, r.w);\r\n this._params.setXYZW(\r\n Math.abs(terrain.scale.y),\r\n terrain.worldMatrix.m13,\r\n 1 / heightMap.width,\r\n 1 / heightMap.height\r\n );\r\n key = `${heightMap.uid}:${terrain.heightVersion}:${[...this._region, ...this._params].join(',')}`;\r\n } else {\r\n this._region.setXYZW(0, 0, 0, 0);\r\n }\r\n if (key !== this._key) {\r\n this._key = key;\r\n this._version++;\r\n }\r\n }\r\n declareUniforms(scope: PBGlobalScope) {\r\n const pb = scope.$builder;\r\n scope.wlHeightMap = pb.tex2D().uniform(0);\r\n // (min x, min z, max x, max z); empty for no terrain\r\n scope.wlTerrainRegion = pb.vec4().uniform(0);\r\n scope.wlTerrainParams = pb.vec4().uniform(0);\r\n }\r\n applyBindGroup(bindGroup: BindGroup) {\r\n const heightMap = this._terrain?.heightMap ?? null;\r\n bindGroup.setTexture('wlHeightMap', heightMap ?? this.getDummy(), fetchSampler('clamp_linear_nomip'));\r\n bindGroup.setValue('wlTerrainRegion', this._region);\r\n bindGroup.setValue('wlTerrainParams', this._params);\r\n }\r\n sampleDistance(scope: PBInsideFunctionScope, pos: PBShaderExp) {\r\n const pb = scope.$builder;\r\n pb.func('wlTerrainHeight', [pb.vec2('xz')], function () {\r\n this.$l.uv = pb.div(\r\n pb.sub(this.xz, this.wlTerrainRegion.xy),\r\n pb.sub(this.wlTerrainRegion.zw, this.wlTerrainRegion.xy)\r\n );\r\n this.$return(\r\n pb.add(\r\n pb.mul(pb.textureSampleLevel(this.wlHeightMap, this.uv, 0).r, this.wlTerrainParams.x),\r\n this.wlTerrainParams.y\r\n )\r\n );\r\n });\r\n pb.func('wlTerrainDistance', [pb.vec3('p')], function () {\r\n this.$if(\r\n pb.or(\r\n pb.any(pb.lessThanEqual(this.wlTerrainRegion.zw, this.wlTerrainRegion.xy)),\r\n pb.or(\r\n pb.any(pb.lessThan(this.p.xz, this.wlTerrainRegion.xy)),\r\n pb.any(pb.greaterThan(this.p.xz, this.wlTerrainRegion.zw))\r\n )\r\n ),\r\n function () {\r\n this.$return(pb.float(TERRAIN_OFF_MAP));\r\n }\r\n );\r\n this.$l.h = this.wlTerrainHeight(this.p.xz);\r\n // Central differences one height map texel apart, in world units\r\n this.$l.cell = pb.mul(\r\n pb.sub(this.wlTerrainRegion.zw, this.wlTerrainRegion.xy),\r\n this.wlTerrainParams.zw\r\n );\r\n this.$l.hx = pb.sub(\r\n this.wlTerrainHeight(pb.add(this.p.xz, pb.vec2(this.cell.x, 0))),\r\n this.wlTerrainHeight(pb.sub(this.p.xz, pb.vec2(this.cell.x, 0)))\r\n );\r\n this.$l.hz = pb.sub(\r\n this.wlTerrainHeight(pb.add(this.p.xz, pb.vec2(0, this.cell.y))),\r\n this.wlTerrainHeight(pb.sub(this.p.xz, pb.vec2(0, this.cell.y)))\r\n );\r\n this.$l.grad = pb.div(pb.vec2(this.hx, this.hz), pb.mul(this.cell, 2));\r\n this.$return(pb.div(pb.sub(this.p.y, this.h), pb.sqrt(pb.add(1, pb.dot(this.grad, this.grad)))));\r\n });\r\n return scope.wlTerrainDistance(pos) as PBShaderExp;\r\n }\r\n dispose() {\r\n this._dummy?.dispose();\r\n this._dummy = null;\r\n }\r\n /** @internal */\r\n private getDummy() {\r\n if (!this._dummy) {\r\n this._dummy = getDevice().createTexture2D('r16f', 1, 1, { mipmapping: false })!;\r\n }\r\n return this._dummy;\r\n }\r\n}\r\n\r\n/** Bind groups of one level's build: each dispatch of a frame needs its own uniforms. */\r\ninterface LevelBindGroups {\r\n seed: BindGroup;\r\n jfa: BindGroup[];\r\n wetJfa: BindGroup[];\r\n resolve: BindGroup;\r\n smooth: [BindGroup, BindGroup];\r\n}\r\n\r\n/**\r\n * Options of a {@link WaterlineField}.\r\n * @public\r\n */\r\nexport interface WaterlineFieldOptions {\r\n /** Levels, each twice the cell size of the one before at the same number of cells. Default 1. */\r\n levels?: number;\r\n /** Cells along each side of a level, a power of two. Default 256. */\r\n resolution?: number;\r\n /** Cell size of the finest level in world units. Default 0.5. */\r\n cellSize?: number;\r\n /**\r\n * Levels rebuilt in one update at most, the finest first; the rest wait for\r\n * the next. Default all.\r\n */\r\n maxRebuilds?: number;\r\n}\r\n\r\n/**\r\n * Horizontal distance to the waterline around the camera: on square grids at\r\n * the rest level of a body of water, the distance in world units from each\r\n * cell to the nearest point where the ground pierces that level.\r\n *\r\n * Unlike the 3D distance to the nearest solid (the water depth over a gently\r\n * shelving bed), this measures shoreline bands outwards from where the ground\r\n * meets the water.\r\n *\r\n * Built on the GPU from a {@link WaterlineSource}: the global clipmap (static\r\n * geometry and the terrain; dynamic instances, a boat or a car wading in, are\r\n * not shores and would ring themselves with shore waves and foam) or the\r\n * terrain alone. One or more levels, all centred on the camera, each twice the\r\n * cell size of the one before. Per level:\r\n *\r\n * 1. Seed: a cell whose centre is inside the ground at the water level is its own nearest shore.\r\n * 2. Jump flooding, log2(resolution) passes, carries the nearest seed across the grid.\r\n * 3. Resolve, into an rgba16f texture:\r\n * - x: distance to the nearest seed, the waterline at the rest level;\r\n * - y, z: a linear model of the ground around the cell, A and B with the horizontal distance\r\n * to the waterline at a height `level + dy` being `A + B * dy`;\r\n * - w: the field value at the cell at the rest level, telling how far the linear model holds.\r\n * 4. Smooth, into a layer of {@link WaterlineField.smoothTexture}.\r\n *\r\n * The linear model lets the waterline follow the waves (a surface raised by dy moves the edge\r\n * dy / tan(a) inland on a slope of angle a). From the field value s and its gradient g at the rest\r\n * level, the ground near the cell is the plane s + g.(p - p0) = 0, crossed at height dy\r\n * (s + g.y * dy) / |g.xz| away horizontally: A = s / |g.xz|, B = g.y / |g.xz|. Exact for a planar\r\n * bed; farther from the shore the jump-flooded distance is used.\r\n *\r\n * The jump-flooded distance is accurate to about half a cell. A level only sees\r\n * the shores on its own grid, so near its edge the nearest one may lie off it.\r\n * WebGPU only.\r\n *\r\n * @public\r\n */\r\nexport class WaterlineField {\r\n readonly levels: number;\r\n readonly resolution: number;\r\n readonly cellSize: number;\r\n readonly maxRebuilds: number;\r\n private readonly _source: WaterlineSource;\r\n private _level: Nullable<number>;\r\n private _requested: boolean;\r\n private _seedA: Nullable<Texture2D>;\r\n private _seedB: Nullable<Texture2D>;\r\n /** Seeds in the water, flooded for the distance inland from it; and the pass between. */\r\n private _wetA: Nullable<Texture2D>;\r\n private _wetB: Nullable<Texture2D>;\r\n /** (field at the rest level, field half a cell above) per cell. */\r\n private _probe: Nullable<Texture2D>;\r\n private _result: Nullable<Texture2D>;\r\n /** Smoothed shore coordinates, a layer per level, see {@link WaterlineField.smoothTexture}. */\r\n private _smooth: Nullable<Texture2DArray>;\r\n private _smoothTemp: Nullable<Texture2D>;\r\n private _smoothHProgram: Nullable<GPUProgram>;\r\n private _smoothVProgram: Nullable<GPUProgram>;\r\n private _seedProgram: Nullable<GPUProgram>;\r\n private _jfaProgram: Nullable<GPUProgram>;\r\n private _resolveProgram: Nullable<GPUProgram>;\r\n private _bindGroups: LevelBindGroups[];\r\n /** Per level: (origin x, origin z, cell size, resolution) as last built; 0 cells before it is. */\r\n private readonly _regions: Vector4[];\r\n /** Per level: source version, origin x, origin z and water level it was last built at. */\r\n private readonly _builtAt: [number, number, number, number][];\r\n constructor(source: WaterlineSource, options?: WaterlineFieldOptions) {\r\n this._source = source;\r\n this.levels = Math.max(1, Math.min(8, Math.floor(options?.levels ?? 1)));\r\n this.resolution = Math.max(16, 2 ** Math.round(Math.log2(options?.resolution ?? 256)));\r\n this.cellSize = Math.max(1e-3, options?.cellSize ?? 0.5);\r\n this.maxRebuilds = Math.max(1, Math.floor(options?.maxRebuilds ?? this.levels));\r\n this._level = null;\r\n this._requested = false;\r\n this._seedA = null;\r\n this._seedB = null;\r\n this._wetA = null;\r\n this._wetB = null;\r\n this._probe = null;\r\n this._result = null;\r\n this._smooth = null;\r\n this._smoothTemp = null;\r\n this._smoothHProgram = null;\r\n this._smoothVProgram = null;\r\n this._seedProgram = null;\r\n this._jfaProgram = null;\r\n this._resolveProgram = null;\r\n this._bindGroups = [];\r\n this._regions = Array.from({ length: this.levels }, () => new Vector4(0, 0, 0, 0));\r\n this._builtAt = Array.from({ length: this.levels }, () => [NaN, NaN, NaN, NaN]);\r\n }\r\n /** Grids built so far, a level each, for diagnosis. */\r\n get rebuilds() {\r\n return this._rebuilds;\r\n }\r\n private _rebuilds = 0;\r\n /** What the field is built from. */\r\n get source() {\r\n return this._source;\r\n }\r\n /** World Y the field is built at, or null before anything asked for it. */\r\n get level() {\r\n return this._level;\r\n }\r\n /** True once the finest level has been built. */\r\n get ready() {\r\n return this._regions[0].w > 0;\r\n }\r\n /**\r\n * Smooth shore coordinates per cell, an rgba16f array with a layer per\r\n * level, for effects that build geometry on them (see ShoreWaveGenerator):\r\n * (signed distance to the waterline, negative inland; B of the bed model;\r\n * height of the bed over the rest level; 0). The first two are\r\n * Gaussian-filtered over two cells; the bed height is the cell's own, so it\r\n * matches the ground. Null before the finest level is built.\r\n */\r\n get smoothTexture() {\r\n return this.ready ? this._smooth : null;\r\n }\r\n /**\r\n * (rest-level distance, model A, model B, field at the rest level) per cell\r\n * of the level built last, rgba16f: for a field of a single level, that level.\r\n */\r\n get texture() {\r\n return this._result;\r\n }\r\n /** (origin x, origin z, cell size, resolution) of the finest level, for sampling. */\r\n get region() {\r\n return this._regions[0];\r\n }\r\n /** (origin x, origin z, cell size, resolution) per level; 0 cells for a level not built yet. */\r\n get regions(): readonly Vector4[] {\r\n return this._regions;\r\n }\r\n /**\r\n * Asks for the field at a water level this frame. Without a request in a\r\n * frame it is not rebuilt; with several, the last one wins.\r\n */\r\n request(level: number) {\r\n this._level = level;\r\n this._requested = true;\r\n }\r\n /** Rebuilds the levels around the camera that moved or went stale, when requested. */\r\n update(cameraPos: Vector3) {\r\n if (!this._requested || this._level === null) {\r\n return;\r\n }\r\n this._requested = false;\r\n this.ensureResources();\r\n const version = this._source.version;\r\n let budget = this.maxRebuilds;\r\n // Finest first: it is the one the camera moves out of soonest and the one\r\n // seen up close; a coarser level waiting a frame keeps its old grid, which\r\n // its region still describes\r\n for (let i = 0; i < this.levels && budget > 0; i++) {\r\n const h = this.cellSize * 2 ** i;\r\n const n = this.resolution;\r\n // Snapped to cells, so the grid does not swim as the camera moves\r\n const ox = (Math.floor(cameraPos.x / h) - n / 2) * h;\r\n const oz = (Math.floor(cameraPos.z / h) - n / 2) * h;\r\n const at = this._builtAt[i];\r\n if (\r\n this._regions[i].w > 0 &&\r\n at[0] === version &&\r\n at[1] === ox &&\r\n at[2] === oz &&\r\n at[3] === this._level\r\n ) {\r\n continue;\r\n }\r\n at[0] = version;\r\n at[1] = ox;\r\n at[2] = oz;\r\n at[3] = this._level;\r\n this.buildLevel(i, ox, oz, h);\r\n this._regions[i].setXYZW(ox, oz, h, n);\r\n this._rebuilds++;\r\n budget--;\r\n }\r\n }\r\n dispose() {\r\n this._seedA?.dispose();\r\n this._seedB?.dispose();\r\n this._wetA?.dispose();\r\n this._wetB?.dispose();\r\n this._probe?.dispose();\r\n this._result?.dispose();\r\n this._smooth?.dispose();\r\n this._smoothTemp?.dispose();\r\n this._seedA = this._seedB = this._wetA = this._wetB = null;\r\n this._probe = this._result = this._smoothTemp = null;\r\n this._smooth = null;\r\n for (const bgs of this._bindGroups) {\r\n bgs.seed.dispose();\r\n bgs.resolve.dispose();\r\n for (const bg of [...bgs.jfa, ...bgs.wetJfa, ...bgs.smooth]) {\r\n bg.dispose();\r\n }\r\n }\r\n this._bindGroups = [];\r\n for (const r of this._regions) {\r\n r.setXYZW(0, 0, 0, 0);\r\n }\r\n }\r\n /** Builds one level into its layer of the smoothed array. @internal */\r\n private buildLevel(index: number, ox: number, oz: number, h: number) {\r\n const device = getDevice();\r\n const n = this.resolution;\r\n const groups = n / WORKGROUP;\r\n const bgs = this._bindGroups[index];\r\n // Seed\r\n const seedBG = bgs.seed;\r\n seedBG.setValue('grid', new Vector4(ox, oz, h, this._level!));\r\n seedBG.setTexture('seedOut', this._seedA!);\r\n seedBG.setTexture('wetOut', this._wetA!);\r\n seedBG.setTexture('probeOut', this._probe!);\r\n this._source.applyBindGroup(seedBG);\r\n device.setProgram(this._seedProgram);\r\n device.setBindGroup(0, seedBG);\r\n device.compute(groups, groups, 1);\r\n // Jump flooding, halving the step down to one cell, from the shore and from the water side\r\n const flood = (a: Texture2D, b: Texture2D, bindGroups: BindGroup[]) => {\r\n let src = a;\r\n let dst = b;\r\n let pass = 0;\r\n for (let step = n / 2; step >= 1; step >>= 1, pass++) {\r\n const bg = bindGroups[pass];\r\n bg.setValue('step', new Vector4(step, n, 0, 0));\r\n bg.setTexture('seedIn', src, fetchSampler('clamp_nearest_nomip'));\r\n bg.setTexture('seedOut', dst);\r\n device.setProgram(this._jfaProgram);\r\n device.setBindGroup(0, bg);\r\n device.compute(groups, groups, 1);\r\n const t = src;\r\n src = dst;\r\n dst = t;\r\n }\r\n return src;\r\n };\r\n const seeds = flood(this._seedA!, this._seedB!, bgs.jfa);\r\n const wet = flood(this._wetA!, this._wetB!, bgs.wetJfa);\r\n // Resolve\r\n const rbg = bgs.resolve;\r\n rbg.setValue('grid', new Vector4(ox, oz, h, n));\r\n rbg.setTexture('seedIn', seeds, fetchSampler('clamp_nearest_nomip'));\r\n rbg.setTexture('probeIn', this._probe!, fetchSampler('clamp_nearest_nomip'));\r\n rbg.setTexture('result', this._result!);\r\n device.setProgram(this._resolveProgram);\r\n device.setBindGroup(0, rbg);\r\n device.compute(groups, groups, 1);\r\n // Smooth, separably: the first pass also turns the result into the signed distance\r\n for (let pass = 0; pass < 2; pass++) {\r\n const bg = bgs.smooth[pass];\r\n bg.setValue('smoothPass', new Vector4(pass, n, h, index));\r\n bg.setTexture('wetIn', wet, fetchSampler('clamp_nearest_nomip'));\r\n bg.setTexture(\r\n 'src',\r\n pass === 0 ? this._result! : this._smoothTemp!,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n bg.setTexture('dst', pass === 0 ? this._smoothTemp! : this._smooth!);\r\n device.setProgram(pass === 0 ? this._smoothHProgram : this._smoothVProgram);\r\n device.setBindGroup(0, bg);\r\n device.compute(groups, groups, 1);\r\n }\r\n }\r\n /** @internal */\r\n private ensureResources() {\r\n if (this._seedProgram) {\r\n return;\r\n }\r\n const device = getDevice();\r\n const n = this.resolution;\r\n const tex = (format: 'rg32f' | 'rgba16f') =>\r\n device.createTexture2D(format, n, n, { mipmapping: false, writable: true })!;\r\n this._seedA = tex('rg32f');\r\n this._seedB = tex('rg32f');\r\n this._wetA = tex('rg32f');\r\n this._wetB = tex('rg32f');\r\n this._probe = tex('rg32f');\r\n this._result = tex('rgba16f');\r\n this._result.name = `@Waterline${this._source.label}`;\r\n this._smoothTemp = tex('rgba16f');\r\n this._smooth = device.createTexture2DArray('rgba16f', n, n, this.levels, {\r\n mipmapping: false,\r\n writable: true\r\n })!;\r\n this._smooth.name = `@Waterline${this._source.label}Smooth`;\r\n const source = this._source;\r\n this._seedProgram = buildSDFProgram({\r\n label: `WaterlineSeed${source.label}`,\r\n workgroupSize: [WORKGROUP, WORKGROUP, 1],\r\n compute(pb) {\r\n // (origin x, origin z, cell size, water level)\r\n this.grid = pb.vec4().uniform(0);\r\n this.seedOut = pb.texStorage2D.rg32float().storage(0);\r\n this.wetOut = pb.texStorage2D.rg32float().storage(0);\r\n this.probeOut = pb.texStorage2D.rg32float().storage(0);\r\n source.declareUniforms(this);\r\n pb.main(function () {\r\n this.$l.id = this.$builtins.globalInvocationId.xy;\r\n this.$l.xz = pb.add(this.grid.xy, pb.mul(pb.add(pb.vec2(this.id), pb.vec2(0.5)), this.grid.z));\r\n this.$l.d = source.sampleDistance(this, pb.vec3(this.xz.x, this.grid.w, this.xz.y));\r\n // Half a cell up, for the vertical slope of the field\r\n this.$l.dUp = source.sampleDistance(\r\n this,\r\n pb.vec3(this.xz.x, pb.add(this.grid.w, pb.mul(this.grid.z, 0.5)), this.xz.y)\r\n );\r\n pb.textureStore(this.probeOut, this.id, pb.vec4(this.d, this.dUp, 0, 0));\r\n pb.textureStore(\r\n this.seedOut,\r\n this.id,\r\n this.$choice(\r\n pb.lessThan(this.d, 0),\r\n pb.vec4(pb.vec2(this.id), 0, 0),\r\n pb.vec4(NO_SEED, NO_SEED, 0, 0)\r\n )\r\n );\r\n pb.textureStore(\r\n this.wetOut,\r\n this.id,\r\n this.$choice(\r\n pb.lessThan(this.d, 0),\r\n pb.vec4(NO_SEED, NO_SEED, 0, 0),\r\n pb.vec4(pb.vec2(this.id), 0, 0)\r\n )\r\n );\r\n });\r\n }\r\n })!;\r\n this._jfaProgram = buildSDFProgram({\r\n label: 'WaterlineJFA',\r\n workgroupSize: [WORKGROUP, WORKGROUP, 1],\r\n compute(pb) {\r\n // (step, resolution, 0, 0)\r\n this.step = pb.vec4().uniform(0);\r\n this.seedIn = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.seedOut = pb.texStorage2D.rg32float().storage(0);\r\n pb.main(function () {\r\n this.$l.id = pb.ivec2(this.$builtins.globalInvocationId.xy);\r\n this.$l.n = pb.int(this.step.y);\r\n this.$l.s = pb.int(this.step.x);\r\n this.$l.p = pb.vec2(this.id);\r\n this.$l.best = pb.textureLoad(this.seedIn, this.id, 0).xy;\r\n this.$l.bestD = pb.dot(pb.sub(this.best, this.p), pb.sub(this.best, this.p));\r\n for (let dy = -1; dy <= 1; dy++) {\r\n for (let dx = -1; dx <= 1; dx++) {\r\n if (dx === 0 && dy === 0) {\r\n continue;\r\n }\r\n this.$l.q = pb.add(this.id, pb.mul(pb.ivec2(dx, dy), this.s));\r\n this.$if(\r\n pb.and(\r\n pb.all(pb.greaterThanEqual(this.q, pb.ivec2(0))),\r\n pb.all(pb.lessThan(this.q, pb.ivec2(this.n)))\r\n ),\r\n function () {\r\n this.$l.c = pb.textureLoad(this.seedIn, this.q, 0).xy;\r\n this.$l.cd = pb.dot(pb.sub(this.c, this.p), pb.sub(this.c, this.p));\r\n this.$if(pb.lessThan(this.cd, this.bestD), function () {\r\n this.best = this.c;\r\n this.bestD = this.cd;\r\n });\r\n }\r\n );\r\n }\r\n }\r\n pb.textureStore(this.seedOut, pb.uvec2(this.id), pb.vec4(this.best, 0, 0));\r\n });\r\n }\r\n })!;\r\n this._resolveProgram = buildSDFProgram({\r\n label: 'WaterlineResolve',\r\n workgroupSize: [WORKGROUP, WORKGROUP, 1],\r\n compute(pb) {\r\n // (origin x, origin z, cell size, resolution)\r\n this.grid = pb.vec4().uniform(0);\r\n this.seedIn = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.probeIn = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.result = pb.texStorage2D.rgba16float().storage(0);\r\n pb.main(function () {\r\n this.$l.id = this.$builtins.globalInvocationId.xy;\r\n this.$l.p = pb.vec2(this.id);\r\n this.$l.seed = pb.textureLoad(this.seedIn, pb.ivec2(this.id), 0).xy;\r\n this.$l.v = pb.sub(this.p, this.seed);\r\n this.$l.len = pb.length(this.v);\r\n // A seed is a whole solid cell: the shore is half a cell nearer than its centre\r\n this.$l.dist = pb.mul(pb.max(pb.sub(this.len, 0.5), 0), this.grid.z);\r\n // No shore anywhere on the grid: as far as the grid reaches\r\n this.dist = this.$choice(\r\n pb.lessThan(this.seed.x, NO_SEED * 0.5),\r\n pb.mul(this.grid.w, this.grid.z),\r\n this.dist\r\n );\r\n // Gradient of the field at the rest level: horizontally from the neighbouring\r\n // cells (one-sided at the grid edge), vertically from the probe above\r\n this.$l.ip = pb.ivec2(this.id);\r\n this.$l.last = pb.sub(pb.int(this.grid.w), 1);\r\n this.$l.probe = pb.textureLoad(this.probeIn, this.ip, 0).xy;\r\n this.$l.xl = pb.max(pb.sub(this.ip.x, 1), 0);\r\n this.$l.xr = pb.min(pb.add(this.ip.x, 1), this.last);\r\n this.$l.zl = pb.max(pb.sub(this.ip.y, 1), 0);\r\n this.$l.zr = pb.min(pb.add(this.ip.y, 1), this.last);\r\n this.$l.gx = pb.div(\r\n pb.sub(\r\n pb.textureLoad(this.probeIn, pb.ivec2(this.xr, this.ip.y), 0).x,\r\n pb.textureLoad(this.probeIn, pb.ivec2(this.xl, this.ip.y), 0).x\r\n ),\r\n pb.mul(pb.float(pb.sub(this.xr, this.xl)), this.grid.z)\r\n );\r\n this.$l.gz = pb.div(\r\n pb.sub(\r\n pb.textureLoad(this.probeIn, pb.ivec2(this.ip.x, this.zr), 0).x,\r\n pb.textureLoad(this.probeIn, pb.ivec2(this.ip.x, this.zl), 0).x\r\n ),\r\n pb.mul(pb.float(pb.sub(this.zr, this.zl)), this.grid.z)\r\n );\r\n this.$l.gy = pb.div(pb.sub(this.probe.y, this.probe.x), pb.mul(this.grid.z, 0.5));\r\n // A flat bed never meets the water: the model then says far away\r\n this.$l.gh = pb.max(pb.length(pb.vec2(this.gx, this.gz)), WATERLINE_MIN_SLOPE);\r\n this.$l.a = pb.clamp(pb.div(this.probe.x, this.gh), -WATERLINE_MODEL_CLAMP, WATERLINE_MODEL_CLAMP);\r\n this.$l.b = pb.clamp(pb.div(this.gy, this.gh), -WATERLINE_MODEL_CLAMP, WATERLINE_MODEL_CLAMP);\r\n pb.textureStore(this.result, this.id, pb.vec4(this.dist, this.a, this.b, this.probe.x));\r\n });\r\n }\r\n })!;\r\n this._smoothHProgram = buildSmoothProgram(false);\r\n this._smoothVProgram = buildSmoothProgram(true);\r\n const passes = Math.log2(n);\r\n for (let i = 0; i < this.levels; i++) {\r\n this._bindGroups.push({\r\n seed: device.createBindGroup(this._seedProgram.bindGroupLayouts[0]),\r\n jfa: Array.from({ length: passes }, () =>\r\n device.createBindGroup(this._jfaProgram!.bindGroupLayouts[0])\r\n ),\r\n wetJfa: Array.from({ length: passes }, () =>\r\n device.createBindGroup(this._jfaProgram!.bindGroupLayouts[0])\r\n ),\r\n resolve: device.createBindGroup(this._resolveProgram.bindGroupLayouts[0]),\r\n smooth: [\r\n device.createBindGroup(this._smoothHProgram.bindGroupLayouts[0]),\r\n device.createBindGroup(this._smoothVProgram.bindGroupLayouts[0])\r\n ]\r\n });\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * One pass of the separable smoothing: horizontal from the resolved field\r\n * into a scratch texture, or vertical from it into a level's layer.\r\n */\r\nfunction buildSmoothProgram(toArray: boolean) {\r\n return buildSDFProgram({\r\n label: toArray ? 'WaterlineSmoothV' : 'WaterlineSmoothH',\r\n workgroupSize: [WORKGROUP, WORKGROUP, 1],\r\n compute(pb) {\r\n // (pass: 0 horizontal from the resolved field, 1 vertical; resolution; cell size; layer)\r\n this.smoothPass = pb.vec4().uniform(0);\r\n this.src = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n // Nearest cell in the water, for the distance inland\r\n this.wetIn = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.dst = toArray\r\n ? pb.texStorage2DArray.rgba16float().storage(0)\r\n : pb.texStorage2D.rgba16float().storage(0);\r\n // Signed distance and B of a resolved texel: the bed model near the\r\n // shore, the jump-flooded distance farther out, blended over a couple\r\n // of metres. Inland, away from the model, the negated jump-flooded\r\n // distance from the water side (the resolved distance is 0 on land).\r\n pb.func('wlSigned', [pb.vec4('t'), pb.ivec2('q')], function () {\r\n this.$l.model = pb.and(\r\n pb.lessThan(pb.abs(this.t.w), SMOOTH_MODEL_REACH),\r\n pb.lessThan(pb.abs(this.t.y), SMOOTH_MODEL_CLAMP)\r\n );\r\n this.$l.wet = pb.textureLoad(this.wetIn, this.q, 0).xy;\r\n this.$l.inland = this.$choice(\r\n pb.lessThan(this.wet.x, NO_SEED * 0.5),\r\n pb.mul(this.smoothPass.y, this.smoothPass.z),\r\n pb.mul(pb.max(pb.sub(pb.length(pb.sub(pb.vec2(this.q), this.wet)), 0.5), 0), this.smoothPass.z)\r\n );\r\n this.$l.far = this.$choice(pb.lessThan(this.t.w, 0), pb.neg(this.inland), this.t.x);\r\n this.$l.w = this.$choice(\r\n this.model,\r\n pb.smoothStep(SMOOTH_BLEND_START, SMOOTH_BLEND_END, pb.abs(this.far)),\r\n 1\r\n );\r\n this.$return(pb.vec2(pb.mix(this.t.y, this.far, this.w), this.$choice(this.model, this.t.z, 0)));\r\n });\r\n pb.main(function () {\r\n this.$l.id = pb.ivec2(this.$builtins.globalInvocationId.xy);\r\n this.$l.last = pb.sub(pb.int(this.smoothPass.y), 1);\r\n this.$l.axis = toArray ? pb.ivec2(0, 1) : pb.ivec2(1, 0);\r\n this.$l.acc = pb.vec2(0);\r\n this.$l.wsum = pb.float(0);\r\n for (let k = -SMOOTH_RADIUS; k <= SMOOTH_RADIUS; k++) {\r\n const w = Math.exp(-(k * k) / (2 * SMOOTH_SIGMA * SMOOTH_SIGMA));\r\n this.$l.q = pb.clamp(pb.add(this.id, pb.mul(this.axis, k)), pb.ivec2(0), pb.ivec2(this.last));\r\n this.$l.t = pb.textureLoad(this.src, this.q, 0);\r\n this.$l.v = toArray ? this.t.xy : this.wlSigned(this.t, this.q);\r\n this.acc = pb.add(this.acc, pb.mul(this.v, w));\r\n this.wsum = pb.add(this.wsum, w);\r\n }\r\n // Keep the bed unfiltered; the second pass carries its height through.\r\n this.$l.own = pb.textureLoad(this.src, this.id, 0);\r\n if (toArray) {\r\n pb.textureArrayStore(\r\n this.dst,\r\n pb.uvec2(this.id),\r\n pb.int(this.smoothPass.w),\r\n pb.vec4(pb.div(this.acc, this.wsum), this.own.z, 0)\r\n );\r\n } else {\r\n this.$l.bed = pb.neg(this.own.w);\r\n this.$if(\r\n pb.and(\r\n pb.lessThan(pb.abs(this.own.w), SMOOTH_MODEL_REACH),\r\n pb.and(\r\n pb.lessThan(pb.abs(this.own.y), SMOOTH_MODEL_CLAMP),\r\n pb.and(pb.greaterThan(this.own.z, 1e-3), pb.lessThan(this.own.z, WATERLINE_MODEL_CLAMP))\r\n )\r\n ),\r\n function () {\r\n // A + B * dy = 0 gives vertical bed height; -SDF is a normal distance.\r\n this.bed = pb.div(pb.neg(this.own.y), this.own.z);\r\n }\r\n );\r\n pb.textureStore(this.dst, pb.uvec2(this.id), pb.vec4(pb.div(this.acc, this.wsum), this.bed, 0));\r\n }\r\n });\r\n }\r\n });\r\n}\r\n"],"names":["NO_SEED","WORKGROUP","SMOOTH_RADIUS","SMOOTH_SIGMA","SMOOTH_MODEL_REACH","SMOOTH_MODEL_CLAMP","SMOOTH_BLEND_START","SMOOTH_BLEND_END","WATERLINE_MIN_SLOPE","WATERLINE_MODEL_CLAMP","TERRAIN_OFF_MAP","SDFWaterlineSource","label","_global","global","version","staticVersion","declareUniforms","scope","declareGlobalSDFUniforms","levels","declareDynamicSDFUniforms","applyBindGroup","bindGroup","sampleDistance","pos","sampleGlobalSDF","TerrainWaterlineSource","_terrain","_version","_key","_region","_dummy","Vector4","_params","terrain","setTerrain","heightMap","key","r","worldRegion","setXYZW","x","y","z","w","Math","abs","scale","worldMatrix","m13","width","height","uid","heightVersion","join","pb","$builder","wlHeightMap","tex2D","uniform","wlTerrainRegion","vec4","wlTerrainParams","setTexture","getDummy","fetchSampler","setValue","func","vec2","$l","uv","div","sub","xz","xy","zw","$return","add","mul","textureSampleLevel","vec3","$if","or","any","lessThanEqual","lessThan","p","greaterThan","float","h","wlTerrainHeight","cell","hx","hz","grad","sqrt","dot","wlTerrainDistance","dispose","getDevice","createTexture2D","mipmapping","WaterlineField","resolution","cellSize","maxRebuilds","_source","_level","_requested","_seedA","_seedB","_wetB","_result","_smoothTemp","_smoothHProgram","_smoothVProgram","_seedProgram","_jfaProgram","_resolveProgram","_bindGroups","source","options","max","min","floor","round","log2","_wetA","_probe","_smooth","_regions","Array","from","length","_builtAt","NaN","rebuilds","_rebuilds","level","ready","smoothTexture","texture","region","regions","request","update","cameraPos","ensureResources","budget","i","n","ox","oz","at","buildLevel","bgs","seed","resolve","bg","jfa","wetJfa","smooth","index","device","groups","seedBG","setProgram","setBindGroup","compute","flood","a","b","bindGroups","src","dst","pass","step","t","seeds","wet","rbg","tex","format","writable","name","createTexture2DArray","buildSDFProgram","workgroupSize","grid","seedOut","texStorage2D","rg32float","storage","wetOut","probeOut","main","id","$builtins","globalInvocationId","d","dUp","textureStore","$choice","seedIn","sampleType","ivec2","int","s","best","textureLoad","bestD","dy","dx","q","and","all","greaterThanEqual","c","cd","uvec2","probeIn","result","rgba16float","v","len","dist","ip","last","probe","xl","xr","zl","zr","gx","gz","gy","gh","clamp","buildSmoothProgram","passes","push","createBindGroup","bindGroupLayouts","toArray","smoothPass","wetIn","texStorage2DArray","model","inland","far","neg","smoothStep","mix","axis","acc","wsum","k","exp","wlSigned","own","textureArrayStore","bed"],"mappings":"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"}
@@ -1,10 +1,13 @@
1
- import { Vector2, Vector4, DEPTH_FARTHEST } from '@zephyr3d/base';
1
+ import { Vector2, Vector4, DEPTH_FARTHEST, REVERSE_Z } from '@zephyr3d/base';
2
2
  import { ShaderHelper } from '../material/shader/helper.js';
3
3
  import { drawFullscreenQuad } from './fullscreenquad.js';
4
- import { MAX_SHADOW_MASK_LIGHTS, LIGHT_TYPE_DIRECTIONAL } from '../values.js';
4
+ import { MAX_SHADOW_MASK_LIGHTS, LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_RECT } from '../values.js';
5
5
  import { fetchSampler } from '../utility/misc.js';
6
+ import { SSR_interleavedGradientNoise } from '../shaders/ssr.js';
6
7
 
7
8
  const UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';
9
+ const CONTACT_SHADOW_STEPS = 8;
10
+ const CONTACT_SHADOW_COMPARE_TOLERANCE_SCALE = 2;
8
11
  /**
9
12
  * Number of shadow-casting lights packed into a single RGBA8 mask array layer.
10
13
  * One light per color channel.
@@ -36,6 +39,9 @@ const UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';
36
39
  _invRenderSize;
37
40
  _cameraPosition;
38
41
  _cameraParams;
42
+ _contactShadow;
43
+ _contactScale;
44
+ _projZColumn;
39
45
  constructor(){
40
46
  this._programs = new Map();
41
47
  this._bindGroups = new Map();
@@ -44,6 +50,12 @@ const UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';
44
50
  this._invRenderSize = new Vector2();
45
51
  this._cameraPosition = new Vector4();
46
52
  this._cameraParams = new Vector4();
53
+ this._contactShadow = new Vector4();
54
+ this._contactScale = new Vector2();
55
+ this._projZColumn = new Vector4();
56
+ }
57
+ /** Whether this light traces contact shadows in the mask pass. */ static hasContactShadow(ctx, light) {
58
+ return ctx.camera.contactShadows && light.contactShadowLength > 0 && light.contactShadowCastingIntensity > 0;
47
59
  }
48
60
  /**
49
61
  * Number of array layers required to hold `numLights` shadow lights.
@@ -99,17 +111,18 @@ const UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';
99
111
  }
100
112
  /** Render one shadow light into one color channel of the current framebuffer. */ renderLightChannel(ctx, depthTexture, light, shadowMapParams, renderState) {
101
113
  const device = ctx.device;
102
- const key = this.getProgramKey(ctx, shadowMapParams);
114
+ const contactShadow = ShadowMaskRenderer.hasContactShadow(ctx, light);
115
+ const key = this.getProgramKey(ctx, shadowMapParams, contactShadow);
103
116
  let program = this._programs.get(key) ?? null;
104
117
  let bindGroup = this._bindGroups.get(key) ?? null;
105
118
  if (!program) {
106
- program = this.createProgram(ctx, shadowMapParams);
119
+ program = this.createProgram(ctx, shadowMapParams, contactShadow);
107
120
  bindGroup = device.createBindGroup(program.bindGroupLayouts[0]);
108
121
  this._programs.set(key, program);
109
122
  this._bindGroups.set(key, bindGroup);
110
123
  }
111
124
  bindGroup = this._bindGroups.get(key);
112
- this.setUniforms(bindGroup, ctx, depthTexture, light, shadowMapParams);
125
+ this.setUniforms(bindGroup, ctx, depthTexture, light, shadowMapParams, contactShadow);
113
126
  device.setProgram(program);
114
127
  device.setBindGroup(0, bindGroup);
115
128
  drawFullscreenQuad(renderState);
@@ -117,8 +130,8 @@ const UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';
117
130
  /**
118
131
  * The program signature: distinct shadow implementations, cascade counts and
119
132
  * shadow map types must not share a compiled program.
120
- */ getProgramKey(ctx, shadowMapParams) {
121
- return `${ctx.device.type}|${shadowMapParams.shaderHash}`;
133
+ */ getProgramKey(ctx, shadowMapParams, contactShadow) {
134
+ return `${ctx.device.type}|${shadowMapParams.shaderHash}|${contactShadow ? 1 : 0}`;
122
135
  }
123
136
  getChannelStates(device) {
124
137
  if (!this._channelStates) {
@@ -133,7 +146,7 @@ const UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';
133
146
  }
134
147
  return this._channelStates;
135
148
  }
136
- setUniforms(bindGroup, ctx, depthTexture, light, shadowMapParams) {
149
+ setUniforms(bindGroup, ctx, depthTexture, light, shadowMapParams, contactShadow) {
137
150
  const camera = ctx.camera;
138
151
  const near = camera.getNearPlane();
139
152
  const far = camera.getFarPlane();
@@ -168,12 +181,35 @@ const UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';
168
181
  envLightStrength: ShaderHelper.getEnvLightLuminance(ctx),
169
182
  envLightSpecularStrength: ctx.env?.light.specularStrength ?? 1
170
183
  });
171
- bindGroup.setValue('invViewProjMatrix', camera.invViewProjectionMatrix);
184
+ // The depth prepass draws with the TAA jitter (ShaderHelper.setCameraUniforms),
185
+ // so positions are taken back through the same jittered matrices. Undoing
186
+ // the jitter with the plain ones moves each point off its surface by part of
187
+ // a pixel, a different way every frame; near a light, where the shadow bias
188
+ // shrinks with the shadow map texels, that is enough to put the point behind
189
+ // its own surface, and patches of it flicker into shadow.
190
+ const jittered = ctx.motionVectors;
191
+ bindGroup.setValue('invViewProjMatrix', jittered ? camera.jitteredInvVPMatrix : camera.invViewProjectionMatrix);
172
192
  bindGroup.setValue('cameraNearFar', this._nearFar);
173
193
  // Neighbour tap spacing for the depth-based normal reconstruction.
174
194
  this._invRenderSize.setXY(1 / depthTexture.width, 1 / depthTexture.height);
175
195
  bindGroup.setValue('invRenderSize', this._invRenderSize);
176
196
  bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);
197
+ if (contactShadow) {
198
+ const proj = camera.getProjectionMatrix();
199
+ if (proj.isPerspective()) {
200
+ this._contactScale.setXY(2 / proj[5], 0);
201
+ } else {
202
+ this._contactScale.setXY(0, 2);
203
+ }
204
+ this._contactShadow.setXYZW(light.contactShadowLength, light.contactShadowLengthInWS ? 1 : 0, light.contactShadowCastingIntensity, ctx.device.frameInfo.frameCounter % 8);
205
+ // Third column of the projection matrix: moves a clip-space point along
206
+ // the view axis without a separate view-to-clip transform.
207
+ this._projZColumn.setXYZW(proj[8], proj[9], proj[10], proj[11]);
208
+ bindGroup.setValue('contactShadow', this._contactShadow);
209
+ bindGroup.setValue('contactScale', this._contactScale);
210
+ bindGroup.setValue('projZColumn', this._projZColumn);
211
+ bindGroup.setValue('viewProjMatrix', jittered ? camera.jitteredVPMatrix : camera.viewProjectionMatrix);
212
+ }
177
213
  bindGroup.setTexture('depthTex', depthTexture, fetchSampler('clamp_nearest_nomip'));
178
214
  bindGroup.setTexture(UNIFORM_NAME_SHADOW_MAP, shadowMapParams.shadowMap, shadowMapParams.shadowMapSampler);
179
215
  }
@@ -184,7 +220,7 @@ const UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';
184
220
  */ needFlip(_device) {
185
221
  return false;
186
222
  }
187
- createProgram(ctx, shadowMapParams) {
223
+ createProgram(ctx, shadowMapParams, contactShadow) {
188
224
  const device = ctx.device;
189
225
  const numCascades = shadowMapParams.numShadowCascades;
190
226
  const lightType = shadowMapParams.lightType;
@@ -243,6 +279,14 @@ const UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';
243
279
  this.invViewProjMatrix = pb.mat4().uniform(0);
244
280
  this.cameraNearFar = pb.vec2().uniform(0);
245
281
  this.invRenderSize = pb.vec2().uniform(0);
282
+ if (contactShadow) {
283
+ // x: length, y: 1 if the length is in world units, z: intensity, w: frame index mod 8
284
+ this.contactShadow = pb.vec4().uniform(0);
285
+ // Screen-relative length multiplier as (depth scale, constant)
286
+ this.contactScale = pb.vec2().uniform(0);
287
+ this.projZColumn = pb.vec4().uniform(0);
288
+ this.viewProjMatrix = pb.mat4().uniform(0);
289
+ }
246
290
  this.$outputs.color = pb.vec4();
247
291
  /**
248
292
  * Geometric normal recovered from the depth prepass.
@@ -255,6 +299,11 @@ const UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';
255
299
  * Naive cross(dpdx, dpdy) spans depth discontinuities and produces a
256
300
  * wild normal along every silhouette. Taking the nearer neighbour on
257
301
  * each axis keeps the basis on one surface instead.
302
+ *
303
+ * Returns the normal in xyz and, in w, how far it can be trusted. The
304
+ * nearer-neighbour pick still fails where two surfaces meet at a
305
+ * continuous depth - a sphere resting on a floor - because either side
306
+ * is equally near, and the normal it builds belongs to neither surface.
258
307
  */ pb.func('zReconstructNormal', [
259
308
  pb.vec2('uv'),
260
309
  pb.vec4('center')
@@ -278,7 +327,7 @@ const UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';
278
327
  // Degenerate footprint (flat depth, or a pixel with no geometry):
279
328
  // report a zero normal, which yields a zero offset downstream.
280
329
  this.$if(pb.lessThan(this.len, 1e-12), function() {
281
- this.$return(pb.vec3(0));
330
+ this.$return(pb.vec4(0));
282
331
  });
283
332
  this.n = pb.div(this.n, this.len);
284
333
  // The cross product's sign depends on which neighbours were picked, so
@@ -287,7 +336,22 @@ const UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';
287
336
  this.$if(pb.lessThan(pb.dot(this.n, this.toEye), 0), function() {
288
337
  this.n = pb.neg(this.n);
289
338
  });
290
- this.$return(this.n);
339
+ // Trust: agreement between the normals built from opposite one-sided
340
+ // differences. A crease splits them by its dihedral angle, so the
341
+ // tessellation facets of a smooth mesh (a few degrees to a dozen) pass
342
+ // while a sphere-on-floor seam or a silhouette does not. Comparing
343
+ // depth slopes instead fails on facets facing the camera, where the
344
+ // slopes are near zero and any kink looks relatively huge.
345
+ const safeNormal = (a, b)=>{
346
+ const c = pb.cross(a, b);
347
+ return pb.mul(c, pb.inverseSqrt(pb.max(pb.dot(c, c), 1e-24)));
348
+ };
349
+ this.$l.dR = pb.sub(this.right.xyz, this.center.xyz);
350
+ this.$l.dL = pb.sub(this.center.xyz, this.left.xyz);
351
+ this.$l.dU = pb.sub(this.up.xyz, this.center.xyz);
352
+ this.$l.dD = pb.sub(this.center.xyz, this.down.xyz);
353
+ this.$l.agreement = pb.min(pb.dot(safeNormal(this.dR, this.dU), safeNormal(this.dL, this.dD)), pb.dot(safeNormal(this.dR, this.dD), safeNormal(this.dL, this.dU)));
354
+ this.$return(pb.vec4(this.n, pb.smoothStep(0.7, 0.9, this.agreement)));
291
355
  });
292
356
  // Explicit-depth cascade selection (fragCoord.z is invalid in a fullscreen
293
357
  // pass). Mirrors posteffect/sss.ts calculateTransmissionShadow.
@@ -304,17 +368,7 @@ const UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';
304
368
  this.$l.cascadeFlags = pb.vec4(pb.float(pb.greaterThan(this.light.shadowCascades, 0)), pb.float(pb.greaterThan(this.light.shadowCascades, 1)), pb.float(pb.greaterThan(this.light.shadowCascades, 2)), pb.float(pb.greaterThan(this.light.shadowCascades, 3)));
305
369
  this.$l.split = pb.int(pb.dot(this.comparison, this.cascadeFlags));
306
370
  this.$l.biasedPos = ShaderHelper.applyShadowNormalOffset(shadowMapParams.lightType, this, this.worldPos, this.worldNormal, this.NoL, ShaderHelper.getShadowCascadeBiasScale(this, this.split));
307
- if (device.type === 'webgl') {
308
- this.$l.shadowVertex = pb.vec4();
309
- this.$for(pb.int('cascade'), 0, 4, function() {
310
- this.$if(pb.equal(this.cascade, this.split), function() {
311
- this.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(this, pb.vec4(this.biasedPos, 1), this.cascade);
312
- this.$break();
313
- });
314
- });
315
- } else {
316
- this.$l.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(this, pb.vec4(this.biasedPos, 1), this.split);
317
- }
371
+ this.$l.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(this, pb.vec4(this.biasedPos, 1), this.split);
318
372
  this.$l.shadow = shadowMapParams.impl.computeShadowCSM(shadowMapParams, this, this.shadowVertex, this.NoL, this.split);
319
373
  this.$l.shadowDistance = this.light.shadowCameraParams.w;
320
374
  this.shadow = pb.mix(this.shadow, 1, pb.smoothStep(pb.mul(this.shadowDistance, 0.8), this.shadowDistance, pb.distance(this.camera.position.xyz, this.worldPos)));
@@ -323,19 +377,66 @@ const UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';
323
377
  } else {
324
378
  this.$l.biasedPos = ShaderHelper.applyShadowNormalOffset(shadowMapParams.lightType, this, this.worldPos, this.worldNormal, this.NoL);
325
379
  this.$l.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(this, pb.vec4(this.biasedPos, 1));
326
- this.$l.shadow = shadowMapParams.impl.computeShadow(shadowMapParams, this, this.shadowVertex, this.NoL);
380
+ this.$l.shadow = shadowMapParams.impl.computeShadow(shadowMapParams, this, this.shadowVertex, this.NoL, this.worldNormal);
327
381
  this.$l.shadowDistance = this.light.shadowCameraParams.w;
328
382
  this.shadow = pb.mix(this.shadow, 1, pb.smoothStep(pb.mul(this.shadowDistance, 0.8), this.shadowDistance, pb.distance(this.camera.position.xyz, this.worldPos)));
329
383
  this.shadow = pb.mix(1, this.shadow, this.light.shadowStrength);
330
384
  this.$return(pb.clamp(this.shadow, 0, 1));
331
385
  }
332
386
  });
387
+ if (contactShadow) {
388
+ const toDeviceZ = (z)=>REVERSE_Z ? z : pb.add(pb.mul(z, 0.5), 0.5);
389
+ pb.func('zContactShadow', [
390
+ pb.vec3('worldPos'),
391
+ pb.float('startDepth'),
392
+ pb.vec3('L'),
393
+ pb.vec2('pixel')
394
+ ], function() {
395
+ this.$l.sceneDepth = pb.mul(this.startDepth, this.cameraNearFar.y);
396
+ this.$l.screenScale = pb.add(pb.mul(this.contactScale.x, this.sceneDepth), this.contactScale.y);
397
+ this.$l.rayLength = pb.mul(this.contactShadow.x, pb.mix(this.screenScale, 1, this.contactShadow.y));
398
+ this.$l.rayStartClip = pb.mul(this.viewProjMatrix, pb.vec4(this.worldPos, 1));
399
+ this.$l.rayDirClip = pb.mul(this.viewProjMatrix, pb.vec4(pb.mul(this.L, this.rayLength), 0));
400
+ this.$l.rayEndClip = pb.add(this.rayStartClip, this.rayDirClip);
401
+ this.$l.rayStart = pb.div(this.rayStartClip.xyz, this.rayStartClip.w);
402
+ this.$l.rayEnd = pb.div(this.rayEndClip.xyz, this.rayEndClip.w);
403
+ this.$l.rayStep = pb.sub(this.rayEnd, this.rayStart);
404
+ this.$l.rayDepthClip = pb.add(this.rayStartClip, pb.mul(this.projZColumn, pb.neg(this.rayLength)));
405
+ this.$l.rayDepth = pb.div(this.rayDepthClip.xyz, this.rayDepthClip.w);
406
+ this.$l.stepSize = pb.float(1 / CONTACT_SHADOW_STEPS);
407
+ this.$l.dither = SSR_interleavedGradientNoise(this, this.pixel, this.contactShadow.w);
408
+ this.$l.compareTolerance = pb.mul(pb.abs(pb.sub(toDeviceZ(this.rayDepth.z), toDeviceZ(this.rayStart.z))), this.stepSize, CONTACT_SHADOW_COMPARE_TOLERANCE_SCALE);
409
+ this.$l.sampleTime = pb.add(pb.mul(pb.sub(this.dither, 0.5), this.stepSize), this.stepSize);
410
+ this.$for(pb.int('i'), 0, CONTACT_SHADOW_STEPS, function() {
411
+ this.$l.samplePos = pb.add(this.rayStart, pb.mul(this.rayStep, this.sampleTime));
412
+ this.$l.sampleUV = pb.add(pb.mul(this.samplePos.xy, 0.5), pb.vec2(0.5));
413
+ this.$l.sampleDepth = ShaderHelper.sampleLinearDepth(this, this.depthTex, this.sampleUV, 0);
414
+ // Avoid self-intersection with the start pixel (exact comparison
415
+ // due to point sampling the depth buffer).
416
+ this.$if(pb.notEqual(this.sampleDepth, this.startDepth), function() {
417
+ this.$l.sampleDeviceZ = ShaderHelper.linearNormalizedToNonLinearDepth(this, this.sampleDepth, this.cameraNearFar);
418
+ this.$l.rayDeviceZ = toDeviceZ(this.samplePos.z);
419
+ this.$l.depthDiff = REVERSE_Z ? pb.sub(this.rayDeviceZ, this.sampleDeviceZ) : pb.sub(this.sampleDeviceZ, this.rayDeviceZ);
420
+ this.$if(pb.lessThan(pb.abs(pb.add(this.depthDiff, this.compareTolerance)), this.compareTolerance), function() {
421
+ // Off screen masking, check NDC position against NDC boundary [-1,1]
422
+ this.$if(pb.all(pb.lessThan(pb.abs(this.samplePos.xy), pb.vec2(1))), function() {
423
+ this.$return(pb.sub(1, this.contactShadow.z));
424
+ });
425
+ this.$return(pb.float(1));
426
+ });
427
+ });
428
+ this.sampleTime = pb.add(this.sampleTime, this.stepSize);
429
+ });
430
+ this.$return(pb.float(1));
431
+ });
432
+ }
333
433
  pb.main(function() {
334
434
  this.$l.pos = ShaderHelper.samplePositionFromDepth(this, this.depthTex, this.$inputs.uv, this.invViewProjMatrix, this.cameraNearFar);
335
435
  // The normal is recovered from the depth prepass rather than
336
436
  // interpolated, because this pass is where the opaque queue's shadows
337
437
  // are decided and normal offset bias needs one.
338
- this.$l.normal = this.zReconstructNormal(this.$inputs.uv, this.pos);
438
+ this.$l.normalInfo = this.zReconstructNormal(this.$inputs.uv, this.pos);
439
+ this.$l.normal = this.normalInfo.xyz;
339
440
  this.$l.lightDir = lightType === LIGHT_TYPE_DIRECTIONAL ? pb.neg(this.light.directionAndCutoff.xyz) : pb.normalize(pb.sub(this.light.positionAndRange.xyz, this.pos.xyz));
340
441
  // A zero normal (degenerate reconstruction) gives NoL 0, hence the
341
442
  // largest offset. Clamp to 1 there instead so those pixels fall back to
@@ -345,6 +446,22 @@ const UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';
345
446
  this.NoL = pb.clamp(pb.dot(this.normal, this.lightDir), 0, 1);
346
447
  });
347
448
  this.$l.factor = this.zShadowMaskFactor(this.pos.xyz, this.pos.w, this.NoL, this.normal);
449
+ if (lightType !== LIGHT_TYPE_DIRECTIONAL) {
450
+ // Rect lights shadow as point lights (see ShadowMapper), so tell them
451
+ // apart by the true type in extraParams.w. A degenerate (zero) normal
452
+ // keeps the plain lookup, as NoL does above, and so does one taken
453
+ // across a crease: at a sphere resting on a floor the reconstructed
454
+ // normal tilts away from the light and would drop the contact shadow.
455
+ // The terminator the fade hides lies on smooth surface anyway.
456
+ this.$if(pb.and(pb.equal(pb.int(this.light.extraParams.w), LIGHT_TYPE_RECT), pb.greaterThan(pb.dot(this.normal, this.normal), 0.5)), function() {
457
+ this.factor = pb.mix(1, this.factor, pb.mix(1, ShaderHelper.getRectLightShadowWeight(this, this.pos.xyz, this.normal, this.light.positionAndRange), this.normalInfo.w));
458
+ });
459
+ }
460
+ if (contactShadow) {
461
+ this.$if(pb.lessThan(this.pos.w, 1), function() {
462
+ this.factor = pb.mul(this.factor, this.zContactShadow(this.pos.xyz, this.pos.w, this.lightDir, this.$builtins.fragCoord.xy));
463
+ });
464
+ }
348
465
  this.$outputs.color = pb.vec4(this.factor);
349
466
  });
350
467
  }