@zephyr3d/scene 0.9.27 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +54 -0
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +279 -55
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +171 -1
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +104 -178
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +25436 -15990
  109. package/dist/index.js +65 -11
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/lambert.js +4 -1
  118. package/dist/material/lambert.js.map +1 -1
  119. package/dist/material/material.js +66 -4
  120. package/dist/material/material.js.map +1 -1
  121. package/dist/material/meshmaterial.js +118 -45
  122. package/dist/material/meshmaterial.js.map +1 -1
  123. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  124. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  126. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  128. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  130. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  132. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  133. package/dist/material/mixins/lit.js +191 -83
  134. package/dist/material/mixins/lit.js.map +1 -1
  135. package/dist/material/mixins/pbr/common.js +31 -206
  136. package/dist/material/mixins/pbr/common.js.map +1 -1
  137. package/dist/material/mtoon.js +1 -1
  138. package/dist/material/mtoon.js.map +1 -1
  139. package/dist/material/pbrmr.js +3 -0
  140. package/dist/material/pbrmr.js.map +1 -1
  141. package/dist/material/pbrsg.js +3 -0
  142. package/dist/material/pbrsg.js.map +1 -1
  143. package/dist/material/sdf_debug.js +78 -0
  144. package/dist/material/sdf_debug.js.map +1 -0
  145. package/dist/material/shader/helper.js +333 -191
  146. package/dist/material/shader/helper.js.map +1 -1
  147. package/dist/material/shader/terrain_blend.js +204 -43
  148. package/dist/material/shader/terrain_blend.js.map +1 -1
  149. package/dist/material/skin.js +331 -297
  150. package/dist/material/skin.js.map +1 -1
  151. package/dist/material/skinprofile.js +1058 -0
  152. package/dist/material/skinprofile.js.map +1 -0
  153. package/dist/material/sss.js +353 -0
  154. package/dist/material/sss.js.map +1 -0
  155. package/dist/material/sss_kernel.js +265 -0
  156. package/dist/material/sss_kernel.js.map +1 -0
  157. package/dist/material/sssprofile.js +879 -0
  158. package/dist/material/sssprofile.js.map +1 -0
  159. package/dist/material/subsurfaceprofile.js +4 -8
  160. package/dist/material/subsurfaceprofile.js.map +1 -1
  161. package/dist/material/terrain-cm.js +464 -188
  162. package/dist/material/terrain-cm.js.map +1 -1
  163. package/dist/material/unlit.js +3 -0
  164. package/dist/material/unlit.js.map +1 -1
  165. package/dist/material/water.js +1261 -1438
  166. package/dist/material/water.js.map +1 -1
  167. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  168. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  169. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  172. package/dist/physics/character.js +226 -0
  173. package/dist/physics/character.js.map +1 -0
  174. package/dist/physics/collider.js +209 -0
  175. package/dist/physics/collider.js.map +1 -0
  176. package/dist/physics/events.js +79 -0
  177. package/dist/physics/events.js.map +1 -0
  178. package/dist/physics/joint.js +272 -0
  179. package/dist/physics/joint.js.map +1 -0
  180. package/dist/physics/node_physics.js +234 -0
  181. package/dist/physics/node_physics.js.map +1 -0
  182. package/dist/physics/part.js +91 -0
  183. package/dist/physics/part.js.map +1 -0
  184. package/dist/physics/rigid_body.js +379 -0
  185. package/dist/physics/rigid_body.js.map +1 -0
  186. package/dist/physics/vehicle.js +335 -0
  187. package/dist/physics/vehicle.js.map +1 -0
  188. package/dist/physics/world.js +25 -0
  189. package/dist/physics/world.js.map +1 -0
  190. package/dist/posteffect/bloom.js +49 -14
  191. package/dist/posteffect/bloom.js.map +1 -1
  192. package/dist/posteffect/motionblur.js +106 -106
  193. package/dist/posteffect/motionblur.js.map +1 -1
  194. package/dist/posteffect/postsss.js +572 -0
  195. package/dist/posteffect/postsss.js.map +1 -0
  196. package/dist/posteffect/sao.js +2 -6
  197. package/dist/posteffect/sao.js.map +1 -1
  198. package/dist/posteffect/skinsss.js +605 -355
  199. package/dist/posteffect/skinsss.js.map +1 -1
  200. package/dist/posteffect/ssgi.js +91 -162
  201. package/dist/posteffect/ssgi.js.map +1 -1
  202. package/dist/posteffect/ssr.js +3 -11
  203. package/dist/posteffect/ssr.js.map +1 -1
  204. package/dist/posteffect/sss.js +4 -13
  205. package/dist/posteffect/sss.js.map +1 -1
  206. package/dist/posteffect/taa.js +1 -0
  207. package/dist/posteffect/taa.js.map +1 -1
  208. package/dist/render/abuffer_oit.js +3 -2
  209. package/dist/render/abuffer_oit.js.map +1 -1
  210. package/dist/render/clipmap.js +179 -64
  211. package/dist/render/clipmap.js.map +1 -1
  212. package/dist/render/cluster_light.js +958 -224
  213. package/dist/render/cluster_light.js.map +1 -1
  214. package/dist/render/cull_visitor.js +25 -5
  215. package/dist/render/cull_visitor.js.map +1 -1
  216. package/dist/render/debug_views.js +37 -0
  217. package/dist/render/debug_views.js.map +1 -0
  218. package/dist/render/depthpass.js +5 -1
  219. package/dist/render/depthpass.js.map +1 -1
  220. package/dist/render/drawable_mixin.js +53 -6
  221. package/dist/render/drawable_mixin.js.map +1 -1
  222. package/dist/render/dualdepthpeeling_oit.js +5 -5
  223. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  224. package/dist/render/envlight.js +196 -113
  225. package/dist/render/envlight.js.map +1 -1
  226. package/dist/render/fbm_wavegenerator.js +5 -10
  227. package/dist/render/fbm_wavegenerator.js.map +1 -1
  228. package/dist/render/fft_wavegenerator.js +247 -157
  229. package/dist/render/fft_wavegenerator.js.map +1 -1
  230. package/dist/render/gerstner_wavegenerator.js +16 -38
  231. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  232. package/dist/render/gi/probe_volume.js +1334 -0
  233. package/dist/render/gi/probe_volume.js.map +1 -0
  234. package/dist/render/gi/scene_gi.js +282 -0
  235. package/dist/render/gi/scene_gi.js.map +1 -0
  236. package/dist/render/gi/voxel_atlas.js +198 -0
  237. package/dist/render/gi/voxel_atlas.js.map +1 -0
  238. package/dist/render/gi/voxel_lighting.js +652 -0
  239. package/dist/render/gi/voxel_lighting.js.map +1 -0
  240. package/dist/render/gi/voxel_scene.js +642 -0
  241. package/dist/render/gi/voxel_scene.js.map +1 -0
  242. package/dist/render/gi/voxelize_pass.js +223 -0
  243. package/dist/render/gi/voxelize_pass.js.map +1 -0
  244. package/dist/render/globalbindgroup_allocator.js +3 -2
  245. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  246. package/dist/render/gpu_picking.js +9 -36
  247. package/dist/render/gpu_picking.js.map +1 -1
  248. package/dist/render/instance_culling.js +499 -0
  249. package/dist/render/instance_culling.js.map +1 -0
  250. package/dist/render/lightpass.js +19 -8
  251. package/dist/render/lightpass.js.map +1 -1
  252. package/dist/render/lod.js +46 -0
  253. package/dist/render/lod.js.map +1 -0
  254. package/dist/render/primitive.js +301 -9
  255. package/dist/render/primitive.js.map +1 -1
  256. package/dist/render/primitive_readback.js +209 -0
  257. package/dist/render/primitive_readback.js.map +1 -0
  258. package/dist/render/render_queue.js +162 -11
  259. package/dist/render/render_queue.js.map +1 -1
  260. package/dist/render/renderer.js +10 -7
  261. package/dist/render/renderer.js.map +1 -1
  262. package/dist/render/rendergraph/blackboard.js +14 -1
  263. package/dist/render/rendergraph/blackboard.js.map +1 -1
  264. package/dist/render/rendergraph/executor.js +136 -0
  265. package/dist/render/rendergraph/executor.js.map +1 -1
  266. package/dist/render/rendergraph/forward_plus_builder.js +272 -55
  267. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  268. package/dist/render/rendergraph/frame_graph_context.js +41 -0
  269. package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
  270. package/dist/render/rendergraph/scene_render_context.js +31 -2
  271. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  272. package/dist/render/rendergraph/types.js.map +1 -1
  273. package/dist/render/renderpass.js +28 -5
  274. package/dist/render/renderpass.js.map +1 -1
  275. package/dist/render/sdf/box_allocator.js +98 -0
  276. package/dist/render/sdf/box_allocator.js.map +1 -0
  277. package/dist/render/sdf/global_sdf.js +865 -0
  278. package/dist/render/sdf/global_sdf.js.map +1 -0
  279. package/dist/render/sdf/scene_sdf.js +562 -0
  280. package/dist/render/sdf/scene_sdf.js.map +1 -0
  281. package/dist/render/sdf/sdf_atlas.js +227 -0
  282. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  283. package/dist/render/sdf/sdf_programs.js +42 -0
  284. package/dist/render/sdf/sdf_programs.js.map +1 -0
  285. package/dist/render/sdf/sdf_view.js +199 -0
  286. package/dist/render/sdf/sdf_view.js.map +1 -0
  287. package/dist/render/sdf/waterline.js +610 -0
  288. package/dist/render/sdf/waterline.js.map +1 -0
  289. package/dist/render/shadow_mask_pass.js +142 -25
  290. package/dist/render/shadow_mask_pass.js.map +1 -1
  291. package/dist/render/shore_wave_generator.js +1193 -0
  292. package/dist/render/shore_wave_generator.js.map +1 -0
  293. package/dist/render/sky.js +516 -86
  294. package/dist/render/sky.js.map +1 -1
  295. package/dist/render/transmission_thickness_pass.js +477 -0
  296. package/dist/render/transmission_thickness_pass.js.map +1 -0
  297. package/dist/render/underwater.js +58 -158
  298. package/dist/render/underwater.js.map +1 -1
  299. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  300. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  301. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  302. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  303. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  304. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  305. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  306. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  307. package/dist/render/volumetric_cloud/resources.js +380 -0
  308. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  309. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  310. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  311. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  312. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  313. package/dist/render/water_caustics.js +134 -319
  314. package/dist/render/water_caustics.js.map +1 -1
  315. package/dist/render/water_foam.js +627 -0
  316. package/dist/render/water_foam.js.map +1 -0
  317. package/dist/render/water_interaction.js +1795 -0
  318. package/dist/render/water_interaction.js.map +1 -0
  319. package/dist/render/weightedblended_oit.js +3 -3
  320. package/dist/render/weightedblended_oit.js.map +1 -1
  321. package/dist/scene/basesprite.js +9 -4
  322. package/dist/scene/basesprite.js.map +1 -1
  323. package/dist/scene/batchgroup.js +108 -12
  324. package/dist/scene/batchgroup.js.map +1 -1
  325. package/dist/scene/environment.js +28 -7
  326. package/dist/scene/environment.js.map +1 -1
  327. package/dist/scene/foliage.js +1020 -0
  328. package/dist/scene/foliage.js.map +1 -0
  329. package/dist/scene/foliage_buckets.js +147 -0
  330. package/dist/scene/foliage_buckets.js.map +1 -0
  331. package/dist/scene/foliage_mask.js +358 -0
  332. package/dist/scene/foliage_mask.js.map +1 -0
  333. package/dist/scene/hair.js +15 -4
  334. package/dist/scene/hair.js.map +1 -1
  335. package/dist/scene/light.js +179 -13
  336. package/dist/scene/light.js.map +1 -1
  337. package/dist/scene/mesh.js +327 -45
  338. package/dist/scene/mesh.js.map +1 -1
  339. package/dist/scene/meshdrawable.js +6 -0
  340. package/dist/scene/meshdrawable.js.map +1 -1
  341. package/dist/scene/msdftext.js +9 -3
  342. package/dist/scene/msdftext.js.map +1 -1
  343. package/dist/scene/msdftextsprite.js +9 -3
  344. package/dist/scene/msdftextsprite.js.map +1 -1
  345. package/dist/scene/particlesys.js +8 -2
  346. package/dist/scene/particlesys.js.map +1 -1
  347. package/dist/scene/physics_settings.js +157 -0
  348. package/dist/scene/physics_settings.js.map +1 -0
  349. package/dist/scene/scene.js +190 -44
  350. package/dist/scene/scene.js.map +1 -1
  351. package/dist/scene/scene_node.js +147 -6
  352. package/dist/scene/scene_node.js.map +1 -1
  353. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  354. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  355. package/dist/scene/terrain-cm/grass.js +881 -42
  356. package/dist/scene/terrain-cm/grass.js.map +1 -1
  357. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  358. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  359. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  360. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  361. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  362. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  363. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  364. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  365. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  366. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  367. package/dist/scene/update_queue.js +54 -0
  368. package/dist/scene/update_queue.js.map +1 -0
  369. package/dist/scene/water.js +633 -268
  370. package/dist/scene/water.js.map +1 -1
  371. package/dist/scene/water_surface_sampler.js +324 -0
  372. package/dist/scene/water_surface_sampler.js.map +1 -0
  373. package/dist/scene/wind.js +317 -0
  374. package/dist/scene/wind.js.map +1 -0
  375. package/dist/shaders/atmosphere.js +388 -166
  376. package/dist/shaders/atmosphere.js.map +1 -1
  377. package/dist/shaders/fog.js +100 -32
  378. package/dist/shaders/fog.js.map +1 -1
  379. package/dist/shaders/gi.js +365 -0
  380. package/dist/shaders/gi.js.map +1 -0
  381. package/dist/shaders/ltc_rect.js +202 -0
  382. package/dist/shaders/ltc_rect.js.map +1 -0
  383. package/dist/shaders/misc.js +1 -10
  384. package/dist/shaders/misc.js.map +1 -1
  385. package/dist/shaders/noise.js +5 -1
  386. package/dist/shaders/noise.js.map +1 -1
  387. package/dist/shaders/probes.js +309 -0
  388. package/dist/shaders/probes.js.map +1 -0
  389. package/dist/shaders/sdf.js +537 -0
  390. package/dist/shaders/sdf.js.map +1 -0
  391. package/dist/shaders/shadow.js +104 -70
  392. package/dist/shaders/shadow.js.map +1 -1
  393. package/dist/shaders/skin_brdf.js +243 -0
  394. package/dist/shaders/skin_brdf.js.map +1 -0
  395. package/dist/shaders/ssgi.js +63 -0
  396. package/dist/shaders/ssgi.js.map +1 -0
  397. package/dist/shaders/ssgi_reprojection.js +118 -0
  398. package/dist/shaders/ssgi_reprojection.js.map +1 -0
  399. package/dist/shaders/ssr.js +6 -159
  400. package/dist/shaders/ssr.js.map +1 -1
  401. package/dist/shaders/temporal.js +38 -27
  402. package/dist/shaders/temporal.js.map +1 -1
  403. package/dist/shaders/water.js +32 -82
  404. package/dist/shaders/water.js.map +1 -1
  405. package/dist/shaders/water_medium.js +7 -21
  406. package/dist/shaders/water_medium.js.map +1 -1
  407. package/dist/shadow/dom.js +110 -19
  408. package/dist/shadow/dom.js.map +1 -1
  409. package/dist/shadow/esm.js +3 -3
  410. package/dist/shadow/esm.js.map +1 -1
  411. package/dist/shadow/pcf_opt.js +15 -48
  412. package/dist/shadow/pcf_opt.js.map +1 -1
  413. package/dist/shadow/pcf_pd.js +15 -53
  414. package/dist/shadow/pcf_pd.js.map +1 -1
  415. package/dist/shadow/pcss.js +34 -9
  416. package/dist/shadow/pcss.js.map +1 -1
  417. package/dist/shadow/shadow_impl.js +3 -8
  418. package/dist/shadow/shadow_impl.js.map +1 -1
  419. package/dist/shadow/shadow_region.js +40 -2
  420. package/dist/shadow/shadow_region.js.map +1 -1
  421. package/dist/shadow/shadowmapper.js +93 -53
  422. package/dist/shadow/shadowmapper.js.map +1 -1
  423. package/dist/shadow/ssm.js +18 -72
  424. package/dist/shadow/ssm.js.map +1 -1
  425. package/dist/shadow/vsm.js +3 -3
  426. package/dist/shadow/vsm.js.map +1 -1
  427. package/dist/shapes/shape.js +44 -1
  428. package/dist/shapes/shape.js.map +1 -1
  429. package/dist/utility/buoyancy.js +287 -0
  430. package/dist/utility/buoyancy.js.map +1 -0
  431. package/dist/utility/physical.js +10 -1
  432. package/dist/utility/physical.js.map +1 -1
  433. package/dist/utility/pmrem.js +17 -43
  434. package/dist/utility/pmrem.js.map +1 -1
  435. package/dist/utility/sdf/bake.js +435 -0
  436. package/dist/utility/sdf/bake.js.map +1 -0
  437. package/dist/utility/sdf/bvh.js +576 -0
  438. package/dist/utility/sdf/bvh.js.map +1 -0
  439. package/dist/utility/serialization/manager.js +34 -6
  440. package/dist/utility/serialization/manager.js.map +1 -1
  441. package/dist/utility/serialization/scene/animation.js +46 -5
  442. package/dist/utility/serialization/scene/animation.js.map +1 -1
  443. package/dist/utility/serialization/scene/batch.js +11 -4
  444. package/dist/utility/serialization/scene/batch.js.map +1 -1
  445. package/dist/utility/serialization/scene/camera.js +87 -254
  446. package/dist/utility/serialization/scene/camera.js.map +1 -1
  447. package/dist/utility/serialization/scene/cloth.js +25 -0
  448. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  449. package/dist/utility/serialization/scene/common.js +14 -6
  450. package/dist/utility/serialization/scene/common.js.map +1 -1
  451. package/dist/utility/serialization/scene/foliage.js +821 -0
  452. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  453. package/dist/utility/serialization/scene/hair.js +11 -4
  454. package/dist/utility/serialization/scene/hair.js.map +1 -1
  455. package/dist/utility/serialization/scene/light.js +115 -7
  456. package/dist/utility/serialization/scene/light.js.map +1 -1
  457. package/dist/utility/serialization/scene/material.js +388 -220
  458. package/dist/utility/serialization/scene/material.js.map +1 -1
  459. package/dist/utility/serialization/scene/mesh.js +69 -4
  460. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  461. package/dist/utility/serialization/scene/node.js +140 -5
  462. package/dist/utility/serialization/scene/node.js.map +1 -1
  463. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  464. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  465. package/dist/utility/serialization/scene/particle.js +11 -4
  466. package/dist/utility/serialization/scene/particle.js.map +1 -1
  467. package/dist/utility/serialization/scene/physics.js +120 -0
  468. package/dist/utility/serialization/scene/physics.js.map +1 -0
  469. package/dist/utility/serialization/scene/primitive.js +124 -10
  470. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  471. package/dist/utility/serialization/scene/scene.js +1687 -51
  472. package/dist/utility/serialization/scene/scene.js.map +1 -1
  473. package/dist/utility/serialization/scene/sprite.js +11 -4
  474. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  475. package/dist/utility/serialization/scene/terrain.js +163 -33
  476. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  477. package/dist/utility/serialization/scene/text.js +11 -4
  478. package/dist/utility/serialization/scene/text.js.map +1 -1
  479. package/dist/utility/serialization/scene/water.js +1543 -264
  480. package/dist/utility/serialization/scene/water.js.map +1 -1
  481. package/dist/utility/serialization/types.js.map +1 -1
  482. package/dist/utility/shprojector.js +10 -22
  483. package/dist/utility/shprojector.js.map +1 -1
  484. package/dist/utility/textures/foam.js +170 -0
  485. package/dist/utility/textures/foam.js.map +1 -0
  486. package/dist/utility/textures/ggxlut.js +17 -43
  487. package/dist/utility/textures/ggxlut.js.map +1 -1
  488. package/dist/utility/textures/ltcdata.js +4 -4
  489. package/dist/utility/textures/ltcdata.js.map +1 -1
  490. package/dist/utility/textures/ltclut.js +16 -6
  491. package/dist/utility/textures/ltclut.js.map +1 -1
  492. package/dist/utility/unsupported.js +24 -0
  493. package/dist/utility/unsupported.js.map +1 -0
  494. package/dist/values.js +13 -1
  495. package/dist/values.js.map +1 -1
  496. package/package.json +25 -12
  497. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  498. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  499. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  500. package/src/asset/meshoptimizer/LICENSE +21 -0
  501. package/dist/animation/joint_dynamics/convex_collider.js +0 -320
  502. package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
@@ -0,0 +1,627 @@
1
+ import { Disposable, Vector4, Vector2 } from '@zephyr3d/base';
2
+ import { getDevice } from '../app/api.js';
3
+ import { drawFullscreenQuad } from './fullscreenquad.js';
4
+ import { fetchSampler } from '../utility/misc.js';
5
+ import { sampleFoamTexture, getDefaultFoamTexture } from '../utility/textures/foam.js';
6
+ import { ShaderHelper } from '../material/shader/helper.js';
7
+
8
+ /**
9
+ * The foam field is stepped as Crest steps its persistent simulations
10
+ * (UpdateFoam.compute, Wave Harmonic, MIT): FOAM_FIELD_FREQUENCY steps per
11
+ * second, each advecting the field by the water's velocity, fading it and
12
+ * adding what the sources make; at most FOAM_FIELD_MAX_STEPS catch up per
13
+ * frame.
14
+ */ const FOAM_FIELD_FREQUENCY = 30;
15
+ const FOAM_FIELD_MAX_STEPS = 8;
16
+ /** Crest's flow foam: two samples, each slid for up to FOAM_FLOW_PERIOD seconds and faded across. */ const FOAM_FLOW_PERIOD = 2;
17
+ /**
18
+ * Levels of the field, laid out as Crest's LODs are: all centred on the view,
19
+ * each twice the size of the one before at the same number of cells, each
20
+ * stepped on its own, and an advection that would read off a level reading
21
+ * the next coarser one instead (UpdateFoam.compute). The material reads the
22
+ * finest level holding a point, blended into the next over its edge.
23
+ */ const FOAM_FIELD_LEVELS = 4;
24
+ /** Cells along each side of a level. */ const FOAM_FIELD_CELLS = 256;
25
+ /**
26
+ * Share of a level, from each edge inwards, over which its coverage falls to
27
+ * 0, so the foam with memory hands over to the foam without it with no seam.
28
+ */ const FOAM_FIELD_EDGE_BLEND = 0.15;
29
+ /**
30
+ * Crest's gain on the foam the waves make (UpdateFoam.compute): foam is added
31
+ * at FOAM_WAVE_GAIN times the strength times how squeezed the water is, per
32
+ * second.
33
+ */ const FOAM_WAVE_GAIN = 5;
34
+ /**
35
+ * Foam with memory: a scalar field over the water, carried by the water's
36
+ * velocity, fading over time and fed by its sources. FOAM_FIELD_LEVELS levels
37
+ * of square grids that the water moves along with the view, each twice the
38
+ * size of the one before; a move of a grid is carried over in the next step,
39
+ * new cells starting with what the next coarser level holds there, if any.
40
+ * @public
41
+ */ class WaterFoamField extends Disposable {
42
+ /** Ping-pong pair of arrays, a layer per level: the foam in r, the wall foam in g, the sources' state in ba. */ _arrays;
43
+ _framebuffers;
44
+ _current;
45
+ /** Per level: (origin x, origin z, cell size, cells) as the field holds it; 0 cells before it does. */ _regions;
46
+ /** Per level: where the grid goes this frame. */ _targets;
47
+ _programs;
48
+ _timeToSimulate;
49
+ _lastTime;
50
+ /** Clock at which the sources last wrote their per-cell state; negative for never. */ _stateTime;
51
+ _prewarm;
52
+ _fadeRate;
53
+ _size;
54
+ _baseStrength;
55
+ _drift;
56
+ /** Velocity the foam drifts at on the wind, metres per second. */ _driftVelocity;
57
+ _dummy;
58
+ /** (dt, fade rate, prewarm, level) */ _params;
59
+ /** (seconds since the sources' state was written, whether this step writes it, 0, 0) */ _stateParams;
60
+ /** (clock in seconds, 0, 0, 0) */ _clock;
61
+ _version;
62
+ constructor(){
63
+ super();
64
+ this._arrays = null;
65
+ this._framebuffers = null;
66
+ this._current = 0;
67
+ this._regions = [];
68
+ this._targets = [];
69
+ for(let i = 0; i < FOAM_FIELD_LEVELS; i++){
70
+ this._regions.push(new Vector4());
71
+ this._targets.push(new Vector4());
72
+ }
73
+ this._programs = new Map();
74
+ this._timeToSimulate = 0;
75
+ this._lastTime = -1;
76
+ this._stateTime = -1;
77
+ this._prewarm = true;
78
+ this._fadeRate = 0.8;
79
+ this._size = 128;
80
+ this._baseStrength = 1;
81
+ this._drift = 0.03;
82
+ this._driftVelocity = new Vector2();
83
+ this._dummy = null;
84
+ this._params = new Vector4();
85
+ this._stateParams = new Vector4();
86
+ this._clock = new Vector4();
87
+ this._version = 0;
88
+ }
89
+ /** How fast the foam fades, per second (Crest's Foam Fade Rate). */ get fadeRate() {
90
+ return this._fadeRate;
91
+ }
92
+ set fadeRate(val) {
93
+ this._fadeRate = Math.max(1e-3, val);
94
+ }
95
+ /**
96
+ * Side in metres of the finest level, the square of water around the view
97
+ * that keeps its foam in the most detail; each further level doubles it.
98
+ */ get size() {
99
+ return this._size;
100
+ }
101
+ set size(val) {
102
+ this._size = Math.max(8, val);
103
+ }
104
+ /**
105
+ * Scale of the foam the open water's breaking crests leave behind, as
106
+ * Crest's Wave Foam Strength: 0 leaves foam only while the crest breaks.
107
+ */ get baseStrength() {
108
+ return this._baseStrength;
109
+ }
110
+ set baseStrength(val) {
111
+ this._baseStrength = Math.max(0, val);
112
+ }
113
+ /**
114
+ * Share of the wind speed the foam drifts at. Floating objects drift at
115
+ * about 3% of the wind relative to the water, about sqrt(rho_air /
116
+ * rho_water) (Wagner, Dell & Eisenman, "How Winds and Ocean Currents
117
+ * Influence the Drift of Floating Objects", JPO 52(5), 2022).
118
+ */ get drift() {
119
+ return this._drift;
120
+ }
121
+ set drift(val) {
122
+ this._drift = Math.max(0, val);
123
+ }
124
+ /** Changes every step, for bind groups that only upload on a change. */ get version() {
125
+ return this._version;
126
+ }
127
+ /**
128
+ * Places the levels around a point of the water, each on whole cells of its
129
+ * own so that the field is carried over without resampling while the point
130
+ * stays put, and steps the field to a clock time there. The time behind is
131
+ * caught up in fixed steps of 1 / FOAM_FIELD_FREQUENCY; with no step due, a
132
+ * step of no time still carries the field over to where the grids now lie.
133
+ * The first step prewarms it.
134
+ * @param focusX - World x the levels are centred on.
135
+ * @param focusZ - World z the levels are centred on.
136
+ * @param time - Clock in seconds.
137
+ * @param wind - Wind velocity in metres per second, or null for none.
138
+ * @param source - What feeds the field and carries it.
139
+ */ stepAround(focusX, focusZ, time, wind, source) {
140
+ let moved = false;
141
+ for(let i = 0; i < FOAM_FIELD_LEVELS; i++){
142
+ const size = this._size * (1 << i);
143
+ const cell = size / FOAM_FIELD_CELLS;
144
+ const half = size * 0.5;
145
+ this._targets[i].setXYZW(Math.floor((focusX - half) / cell) * cell, Math.floor((focusZ - half) / cell) * cell, cell, FOAM_FIELD_CELLS);
146
+ moved = moved || !this._regions[i].equalsTo(this._targets[i]);
147
+ }
148
+ this._driftVelocity.setXY((wind?.x ?? 0) * this._drift, (wind?.y ?? 0) * this._drift);
149
+ const device = getDevice();
150
+ this.ensureArrays(device);
151
+ const dt = this._lastTime < 0 ? 0 : Math.min(Math.max(time - this._lastTime, 0), 0.25);
152
+ this._lastTime = time;
153
+ // The clock carries the foam texture along; readers see it every frame
154
+ this._clock.x = time;
155
+ this._version++;
156
+ this._timeToSimulate += dt;
157
+ let steps = Math.floor(this._timeToSimulate * FOAM_FIELD_FREQUENCY);
158
+ let stepDt = 1 / FOAM_FIELD_FREQUENCY;
159
+ if (steps > FOAM_FIELD_MAX_STEPS) {
160
+ steps = FOAM_FIELD_MAX_STEPS;
161
+ this._timeToSimulate = 0;
162
+ } else {
163
+ this._timeToSimulate -= steps * stepDt;
164
+ }
165
+ if (steps === 0) {
166
+ if (!moved && !this._prewarm) {
167
+ return;
168
+ }
169
+ steps = 1;
170
+ stepDt = 0;
171
+ }
172
+ const { program, bindGroup } = this.getStepProgram(device, source);
173
+ source.applyFoamSourceBindGroup(bindGroup);
174
+ bindGroup.setValue('ffDrift', this._driftVelocity);
175
+ // The sources' state is of the water as it is this frame, which every step
176
+ // of the frame sees alike: it is read as of the last frame that wrote it
177
+ // and written at the frame's last step
178
+ const sinceState = this._stateTime < 0 ? 0 : Math.max(time - this._stateTime, 0);
179
+ const sampler = fetchSampler('clamp_linear_nomip');
180
+ device.pushDeviceStates();
181
+ for(let step = 0; step < steps; step++){
182
+ const fb = this._framebuffers[1 - this._current];
183
+ bindGroup.setTexture('ffSrc', this._arrays[this._current], sampler);
184
+ this._stateParams.setXYZW(sinceState, step === steps - 1 ? 1 : 0, 0, 0);
185
+ bindGroup.setValue('ffState', this._stateParams);
186
+ for(let i = 0; i < FOAM_FIELD_LEVELS; i++){
187
+ // Only the first step carries the field across a move of the grids
188
+ const prev = step === 0 ? this._regions : this._targets;
189
+ bindGroup.setValue('ffRegion', this._targets[i]);
190
+ bindGroup.setValue('ffPrevRegion', prev[i]);
191
+ bindGroup.setValue('ffPrevRegionNext', i + 1 < FOAM_FIELD_LEVELS ? prev[i + 1] : Vector4.zero());
192
+ this._params.setXYZW(stepDt, this._fadeRate, this._prewarm ? 1 : 0, i);
193
+ bindGroup.setValue('ffParams', this._params);
194
+ fb.setColorAttachmentLayer(0, i);
195
+ device.setFramebuffer(fb);
196
+ device.setProgram(program);
197
+ device.setBindGroup(0, bindGroup);
198
+ drawFullscreenQuad();
199
+ }
200
+ this._current = 1 - this._current;
201
+ this._prewarm = false;
202
+ }
203
+ device.popDeviceStates();
204
+ for(let i = 0; i < FOAM_FIELD_LEVELS; i++){
205
+ this._regions[i].set(this._targets[i]);
206
+ }
207
+ this._stateTime = time;
208
+ }
209
+ /** Declares the uniforms {@link WaterFoamField.sample} reads. */ setupUniforms(scope, uniformGroup) {
210
+ const pb = scope.$builder;
211
+ scope.ffTex = pb.tex2DArray().uniform(uniformGroup);
212
+ for(let i = 0; i < FOAM_FIELD_LEVELS; i++){
213
+ // (origin x, origin z, cell size, cells; 0 cells before the level exists)
214
+ scope[`ffRegion${i}`] = pb.vec4().uniform(uniformGroup);
215
+ }
216
+ scope.ffDrift = pb.vec2().uniform(uniformGroup);
217
+ scope.ffClock = pb.vec4().uniform(uniformGroup);
218
+ }
219
+ /** Sets the uniforms {@link WaterFoamField.setupUniforms} declared. */ applyBindGroup(bindGroup) {
220
+ bindGroup.setTexture('ffTex', this._arrays ? this._arrays[this._current] : this.getDummy(), fetchSampler('clamp_linear_nomip'));
221
+ for(let i = 0; i < FOAM_FIELD_LEVELS; i++){
222
+ bindGroup.setValue(`ffRegion${i}`, this._arrays ? this._regions[i] : Vector4.zero());
223
+ }
224
+ bindGroup.setValue('ffDrift', this._driftVelocity);
225
+ bindGroup.setValue('ffClock', this._clock);
226
+ }
227
+ /**
228
+ * The field at an undisplaced XZ, as vec3(foam density, coverage, wall
229
+ * foam). The finest level holding the point answers, blended into the next
230
+ * coarser over the last FOAM_FIELD_EDGE_BLEND of it; coverage falls to 0 over
231
+ * that share of the coarsest level and is 0 off it, where the reader falls
232
+ * back to foam with no memory.
233
+ */ sample(scope, xz) {
234
+ const pb = scope.$builder;
235
+ pb.func('ffSample', [
236
+ pb.vec2('xz')
237
+ ], function() {
238
+ this.$l.result = pb.vec3(0);
239
+ // Share of the answer still to come from coarser levels
240
+ this.$l.remaining = pb.float(1);
241
+ for(let i = 0; i < FOAM_FIELD_LEVELS; i++){
242
+ const r = this[`ffRegion${i}`];
243
+ this.$l[`uv${i}`] = pb.div(pb.sub(this.xz, r.xy), pb.max(pb.mul(r.z, r.w), 1e-4));
244
+ const uv = this[`uv${i}`];
245
+ this.$l[`edge${i}`] = pb.min(pb.min(uv.x, uv.y), pb.min(pb.sub(1, uv.x), pb.sub(1, uv.y)));
246
+ const edge = this[`edge${i}`];
247
+ this.$if(pb.and(pb.greaterThan(this.remaining, 0), pb.and(pb.greaterThan(r.w, 0), pb.greaterThan(edge, 0))), function() {
248
+ this.$l.w = pb.mul(this.remaining, pb.smoothStep(0, FOAM_FIELD_EDGE_BLEND, edge));
249
+ this.$l.texel = pb.textureArraySampleLevel(this.ffTex, uv, i, 0);
250
+ this.result = pb.add(this.result, pb.mul(pb.vec3(this.texel.r, 1, this.texel.g), this.w));
251
+ this.remaining = pb.sub(this.remaining, this.w);
252
+ });
253
+ }
254
+ this.$return(this.result);
255
+ });
256
+ return scope.ffSample(xz);
257
+ }
258
+ /**
259
+ * The foam texture carried by the water, as Crest's ComputeFoamWithFlow:
260
+ * two samples, each slid along the flow for up to FOAM_FLOW_PERIOD seconds
261
+ * and then set back, half a period apart, faded across so neither jump
262
+ * shows. Returns (value, slope along x, slope along z) as
263
+ * {@link sampleFoamTexture} does.
264
+ * @param time - Clock in seconds.
265
+ * @param flow - Velocity of the water in metres per second.
266
+ */ static flowPattern(scope, tex, uvScale, time, xz, xzGrad, flow) {
267
+ const pb = scope.$builder;
268
+ pb.func('ffFlowPattern', [
269
+ pb.vec2('xz'),
270
+ pb.vec4('xzGrad'),
271
+ pb.vec2('flow'),
272
+ pb.float('time'),
273
+ pb.float('uvScale')
274
+ ], function() {
275
+ const half = FOAM_FLOW_PERIOD * 0.5;
276
+ this.$l.offset1 = pb.mod(this.time, FOAM_FLOW_PERIOD);
277
+ this.$l.weight1 = pb.div(this.offset1, half);
278
+ this.weight1 = this.$choice(pb.greaterThan(this.weight1, 1), pb.sub(2, this.weight1), this.weight1);
279
+ this.$l.offset2 = pb.mod(pb.add(this.time, half), FOAM_FLOW_PERIOD);
280
+ this.$l.s1 = sampleFoamTexture(this, tex, pb.mul(pb.sub(this.xz, pb.mul(this.flow, this.offset1)), this.uvScale), this.xzGrad, this.uvScale);
281
+ this.$l.s2 = sampleFoamTexture(this, tex, pb.mul(pb.sub(this.xz, pb.mul(this.flow, this.offset2)), this.uvScale), this.xzGrad, this.uvScale);
282
+ this.$return(pb.mix(this.s2, this.s1, this.weight1));
283
+ });
284
+ return scope.ffFlowPattern(xz, xzGrad, flow, time, uvScale);
285
+ }
286
+ onDispose() {
287
+ super.onDispose();
288
+ this.disposeArrays();
289
+ for (const p of this._programs.values()){
290
+ p.program.dispose();
291
+ p.bindGroup.dispose();
292
+ }
293
+ this._programs.clear();
294
+ this._dummy?.dispose();
295
+ this._dummy = null;
296
+ }
297
+ /** @internal */ ensureArrays(device) {
298
+ if (this._arrays) {
299
+ return;
300
+ }
301
+ const createArray = (name)=>{
302
+ const tex = device.createTexture2DArray('rgba16f', FOAM_FIELD_CELLS, FOAM_FIELD_CELLS, FOAM_FIELD_LEVELS, {
303
+ mipmapping: false
304
+ });
305
+ tex.name = name;
306
+ const fb = device.createFrameBuffer([
307
+ tex
308
+ ], null);
309
+ for(let i = 0; i < FOAM_FIELD_LEVELS; i++){
310
+ fb.setColorAttachmentLayer(0, i);
311
+ device.setFramebuffer(fb);
312
+ device.clearFrameBuffer(Vector4.zero(), null, null);
313
+ }
314
+ fb.dispose();
315
+ return tex;
316
+ };
317
+ device.pushDeviceStates();
318
+ try {
319
+ this._arrays = [
320
+ createArray('@WaterFoamField0'),
321
+ createArray('@WaterFoamField1')
322
+ ];
323
+ this._current = 0;
324
+ for (const r of this._regions){
325
+ r.setXYZW(0, 0, 0, 0);
326
+ }
327
+ this._prewarm = true;
328
+ this._stateTime = -1;
329
+ this._framebuffers = [
330
+ 0,
331
+ 1
332
+ ].map((i)=>device.createFrameBuffer([
333
+ this._arrays[i]
334
+ ], null));
335
+ } finally{
336
+ device.popDeviceStates();
337
+ }
338
+ }
339
+ /** @internal */ getStepProgram(device, source) {
340
+ const programKey = source.foamSourceKey;
341
+ let entry = this._programs.get(programKey);
342
+ if (!entry) {
343
+ const program = device.buildRenderProgram({
344
+ vertex (pb) {
345
+ this.$inputs.pos = pb.vec2().attrib('position');
346
+ pb.main(function() {
347
+ this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);
348
+ });
349
+ },
350
+ fragment (pb) {
351
+ this.$outputs.outColor = pb.vec4();
352
+ source.setupFoamSourceUniforms(this);
353
+ this.ffSrc = pb.tex2DArray().uniform(0);
354
+ this.ffRegion = pb.vec4().uniform(0);
355
+ // Where this level and the next coarser one lay at the last step; 0 cells for none
356
+ this.ffPrevRegion = pb.vec4().uniform(0);
357
+ this.ffPrevRegionNext = pb.vec4().uniform(0);
358
+ // (dt, fade rate, prewarm, level)
359
+ this.ffParams = pb.vec4().uniform(0);
360
+ this.ffDrift = pb.vec2().uniform(0);
361
+ // (seconds since the sources' state was written, whether this step writes it, 0, 0)
362
+ this.ffState = pb.vec4().uniform(0);
363
+ // A point of a level as it was: its uv, and whether the level held it
364
+ pb.func('ffPrevUV', [
365
+ pb.vec2('wp'),
366
+ pb.vec4('region')
367
+ ], function() {
368
+ this.$l.uv = pb.div(pb.sub(this.wp, this.region.xy), pb.max(pb.mul(this.region.z, this.region.w), 1e-4));
369
+ this.$l.rMax = pb.sub(0.5, pb.div(1, pb.max(this.region.w, 1)));
370
+ this.$l.r = pb.abs(pb.sub(this.uv, pb.vec2(0.5)));
371
+ this.$return(pb.vec3(this.uv, this.$choice(pb.and(pb.greaterThan(this.region.w, 0), pb.lessThanEqual(pb.max(this.r.x, this.r.y), this.rMax)), pb.float(1), pb.float(0))));
372
+ });
373
+ pb.main(function() {
374
+ this.$l.dt = this.ffParams.x;
375
+ this.$l.fadeRate = this.ffParams.y;
376
+ this.$l.prewarm = pb.greaterThan(this.ffParams.z, 0.5);
377
+ this.$l.level = pb.int(this.ffParams.w);
378
+ // World position of this cell's centre
379
+ this.$l.xz = pb.add(this.ffRegion.xy, pb.mul(this.$builtins.fragCoord.xy, this.ffRegion.z));
380
+ // The sources' state stays with the cell: from the same place, on
381
+ // the grid as it was, where that grid held it
382
+ this.$l.stateAt = this.ffPrevUV(this.xz, this.ffPrevRegion);
383
+ this.$l.prevState = pb.vec2(0);
384
+ this.$l.stateAge = pb.float(-1);
385
+ this.$if(pb.greaterThan(this.stateAt.z, 0.5), function() {
386
+ this.prevState = pb.textureArraySampleLevel(this.ffSrc, this.stateAt.xy, this.level, 0).ba;
387
+ this.$if(pb.and(pb.not(this.prewarm), pb.greaterThan(this.ffState.x, 0)), function() {
388
+ this.stateAge = this.ffState.x;
389
+ });
390
+ });
391
+ this.$l.state = pb.vec4(this.prevState, 0, this.stateAge);
392
+ this.$l.shape = pb.vec2(0, 1);
393
+ this.$l.src = source.calcFoamStep(this, this.xz, this.dt, this.fadeRate, this.prewarm, this.state, this.shape);
394
+ // Sample from the previous step, upstream of the flow: this level as
395
+ // it was, else the next coarser one, nothing where neither held it
396
+ this.$l.flowed = pb.sub(this.xz, pb.mul(this.src.xy, this.dt));
397
+ this.$l.at = this.ffPrevUV(this.flowed, this.ffPrevRegion);
398
+ // (foam, wall foam)
399
+ this.$l.foam = pb.vec2(0);
400
+ this.$if(pb.greaterThan(this.at.z, 0.5), function() {
401
+ this.foam = pb.textureArraySampleLevel(this.ffSrc, this.at.xy, this.level, 0).rg;
402
+ }).$else(function() {
403
+ this.$l.atNext = this.ffPrevUV(this.flowed, this.ffPrevRegionNext);
404
+ this.$if(pb.greaterThan(this.atNext.z, 0.5), function() {
405
+ this.foam = pb.textureArraySampleLevel(this.ffSrc, this.atNext.xy, pb.add(this.level, 1), 0).rg;
406
+ });
407
+ });
408
+ // Fade, then what the sources make
409
+ this.foam = pb.mul(this.foam, pb.max(0, pb.sub(1, pb.mul(this.fadeRate, pb.max(this.shape.y, 0), this.dt))));
410
+ this.foam = pb.add(this.foam, this.src.zw);
411
+ // At least what the source knows is here
412
+ this.foam.x = pb.max(this.foam.x, pb.clamp(this.shape.x, 0, 1));
413
+ this.$outputs.outColor = pb.vec4(pb.clamp(this.foam, pb.vec2(0), pb.vec2(1)), this.$choice(pb.greaterThan(this.ffState.y, 0.5), this.state.xy, this.prevState));
414
+ });
415
+ }
416
+ });
417
+ program.name = `@WaterFoamFieldStep:${programKey}`;
418
+ entry = {
419
+ program,
420
+ bindGroup: device.createBindGroup(program.bindGroupLayouts[0])
421
+ };
422
+ this._programs.set(programKey, entry);
423
+ }
424
+ return entry;
425
+ }
426
+ /** @internal */ disposeArrays() {
427
+ this._framebuffers?.forEach((fb)=>fb.dispose());
428
+ this._framebuffers = null;
429
+ this._arrays?.forEach((tex)=>tex.dispose());
430
+ this._arrays = null;
431
+ }
432
+ /** @internal */ getDummy() {
433
+ if (!this._dummy) {
434
+ this._dummy = getDevice().createTexture2DArray('rgba16f', 1, 1, 1, {
435
+ mipmapping: false
436
+ });
437
+ }
438
+ return this._dummy;
439
+ }
440
+ }
441
+ /**
442
+ * The open water's share of the foam field: foam left where the wrapped
443
+ * generator's crests break, drifting on the wind. Crest feeds its foam
444
+ * simulation from the Jacobian of its animated waves the same way
445
+ * (UpdateFoam.compute); here the generator's own foam density stands for the
446
+ * squeeze, so the field is fed by the same crests the generator shows foam on.
447
+ * @internal
448
+ */ class WaveFoamSource {
449
+ _generator;
450
+ _field;
451
+ /** (strength, 0, 0, 0) */ _sourceParams;
452
+ foamSourceKey;
453
+ constructor(generator, field){
454
+ this._generator = generator;
455
+ this._field = field;
456
+ this._sourceParams = new Vector4();
457
+ this.foamSourceKey = `WG:${generator?.getHash() ?? ''}`;
458
+ }
459
+ setupFoamSourceUniforms(scope) {
460
+ const pb = scope.$builder;
461
+ if (this._generator) {
462
+ this._generator.setupUniforms(scope, 0);
463
+ // FBM and Gerstner animate from camera.elapsedTime, which a standalone
464
+ // program has to declare itself
465
+ ShaderHelper.declareStandaloneCameraTime(scope, 0);
466
+ }
467
+ scope.wgFoamSource = pb.vec4().uniform(0);
468
+ }
469
+ applyFoamSourceBindGroup(bindGroup) {
470
+ if (this._generator) {
471
+ this._generator.applyWaterBindGroup(bindGroup);
472
+ ShaderHelper.setStandaloneCameraTime(bindGroup);
473
+ }
474
+ this._sourceParams.setXYZW(this._field.baseStrength, 0, 0, 0);
475
+ bindGroup.setValue('wgFoamSource', this._sourceParams);
476
+ }
477
+ calcFoamStep(scope, xz, dt, fadeRate, prewarm, _state, _shape) {
478
+ const pb = scope.$builder;
479
+ const that = this;
480
+ pb.func('wgFoamStep', [
481
+ pb.vec2('xz'),
482
+ pb.float('dt'),
483
+ pb.float('fadeRate'),
484
+ pb.bool('prewarm')
485
+ ], function() {
486
+ this.$l.strength = this.wgFoamSource.x;
487
+ this.$l.density = pb.float(0);
488
+ if (that._generator) {
489
+ this.density = pb.clamp(that._generator.calcFragmentNormalAndFoam(this, this.xz, pb.vec3(0, 1, 0)).w, 0, 1);
490
+ }
491
+ // Crest's prewarm of the wave source
492
+ this.$l.waveDt = this.$choice(this.prewarm, pb.max(this.dt, pb.div(pb.min(1, pb.sub(this.strength, 1)), this.fadeRate)), this.dt);
493
+ this.$return(pb.vec4(this.ffDrift, pb.mul(FOAM_WAVE_GAIN, this.waveDt, this.strength, this.density), 0));
494
+ });
495
+ return scope.wgFoamStep(xz, dt, fadeRate, prewarm);
496
+ }
497
+ }
498
+ /**
499
+ * Layers the foam field over the generator it wraps: inside the field the foam
500
+ * is the field's, which the generator feeds and so must not add a second
501
+ * time, and the foam texture travels with the water; off the field the
502
+ * generator's foam shows unchanged. Wraps the base generator, below the
503
+ * interaction field and the shore waves, whose foam is composed over it.
504
+ * @internal
505
+ */ class FoamFieldWaveGenerator extends Disposable {
506
+ _base;
507
+ _field;
508
+ _look;
509
+ /** Velocity of the water from the drift, from the shore waves while they are on. */ flowSource;
510
+ calcPrevVertexPosition;
511
+ calcSurfaceCoverage;
512
+ calcSheetThickness;
513
+ calcUnresolvedSlopeVariance;
514
+ constructor(base, field, look){
515
+ super();
516
+ this._base = base;
517
+ this._field = field;
518
+ this._look = look;
519
+ this.flowSource = null;
520
+ // Optional parts of the surface pass straight through, present only where
521
+ // the base has them
522
+ if (base.calcPrevVertexPosition) {
523
+ this.calcPrevVertexPosition = base.calcPrevVertexPosition.bind(base);
524
+ }
525
+ if (base.calcSurfaceCoverage) {
526
+ this.calcSurfaceCoverage = base.calcSurfaceCoverage.bind(base);
527
+ }
528
+ if (base.calcSheetThickness) {
529
+ this.calcSheetThickness = base.calcSheetThickness.bind(base);
530
+ }
531
+ if (base.calcUnresolvedSlopeVariance) {
532
+ this.calcUnresolvedSlopeVariance = base.calcUnresolvedSlopeVariance.bind(base);
533
+ }
534
+ }
535
+ /** The generator the field is layered over. */ get base() {
536
+ return this._base;
537
+ }
538
+ /** The foam field. */ get field() {
539
+ return this._field;
540
+ }
541
+ get wind() {
542
+ return this._base.wind;
543
+ }
544
+ clone() {
545
+ return new FoamFieldWaveGenerator(this._base.clone(), this._field, this._look);
546
+ }
547
+ get version() {
548
+ return this._base.version + this._field.version;
549
+ }
550
+ setupUniforms(scope, uniformGroup) {
551
+ const pb = scope.$builder;
552
+ this._base.setupUniforms(scope, uniformGroup);
553
+ this._field.setupUniforms(scope, uniformGroup);
554
+ scope.ffFoamTex = pb.tex2D().uniform(uniformGroup);
555
+ scope.ffFoamUVScale = pb.float().uniform(uniformGroup);
556
+ }
557
+ calcVertexPositionAndNormal(scope, inPos, outPos, outNormal, vertexSpacing) {
558
+ this._base.calcVertexPositionAndNormal(scope, inPos, outPos, outNormal, vertexSpacing);
559
+ }
560
+ calcFragmentNormal(scope, xz, vertexNormal) {
561
+ return this._base.calcFragmentNormal(scope, xz, vertexNormal);
562
+ }
563
+ calcFragmentNormalAndFoam(scope, xz, vertexNormal, foamSample, footprint) {
564
+ const pb = scope.$builder;
565
+ const that = this;
566
+ const params = [
567
+ pb.vec2('xz'),
568
+ pb.vec3('vn')
569
+ ];
570
+ const args = [
571
+ xz,
572
+ vertexNormal
573
+ ];
574
+ if (foamSample) {
575
+ params.push(pb.vec3('fs').inout());
576
+ args.push(foamSample);
577
+ }
578
+ if (footprint) {
579
+ params.push(pb.vec4('fp'));
580
+ args.push(footprint);
581
+ }
582
+ const funcName = `ffCalcNormalAndFoam${foamSample ? 'S' : ''}${footprint ? 'F' : ''}`;
583
+ pb.func(funcName, params, function() {
584
+ // Screen derivatives for the foam texture, here in uniform control flow
585
+ if (foamSample) {
586
+ this.$l.xzGrad = pb.vec4(pb.dpdx(this.xz), pb.dpdy(this.xz));
587
+ }
588
+ this.$l.nf = that._base.calcFragmentNormalAndFoam(this, this.xz, this.vn, foamSample ? this.fs : undefined, footprint ? this.fp : undefined);
589
+ this.$l.ff = that._field.sample(this, this.xz);
590
+ this.$l.ffTotal = pb.clamp(this.ff.x, 0, 1);
591
+ if (foamSample) {
592
+ // Carried by the water: the texture travels with the field's foam.
593
+ // Over the whole field, not only where it holds foam: the flow source
594
+ // may show foam the field lacks (the near shore), on this pattern.
595
+ this.$if(pb.greaterThan(this.ff.y, 0), function() {
596
+ this.$l.flow = that.flowSource ? that.flowSource.calcFoamFlow(this, this.xz, this.ffDrift) : this.ffDrift;
597
+ this.$l.pattern = WaterFoamField.flowPattern(this, this.ffFoamTex, this.ffFoamUVScale, this.ffClock.x, this.xz, this.xzGrad, this.flow);
598
+ this.fs = pb.mix(this.fs, this.pattern, this.ff.y);
599
+ });
600
+ }
601
+ this.$return(pb.vec4(this.nf.xyz, pb.mix(pb.clamp(this.nf.w, 0, 1), this.ffTotal, this.ff.y)));
602
+ });
603
+ return scope[funcName](...args);
604
+ }
605
+ applyWaterBindGroup(bindGroup) {
606
+ this._base.applyWaterBindGroup(bindGroup);
607
+ this._field.applyBindGroup(bindGroup);
608
+ bindGroup.setTexture('ffFoamTex', this._look.getFoamTexture() ?? getDefaultFoamTexture(), fetchSampler('repeat_linear'));
609
+ bindGroup.setValue('ffFoamUVScale', 1 / Math.max(0.01, this._look.getFoamTextureSize()));
610
+ }
611
+ calcClipmapTileAABB(minX, maxX, minZ, maxZ, y, outAABB) {
612
+ this._base.calcClipmapTileAABB(minX, maxX, minZ, maxZ, y, outAABB);
613
+ }
614
+ /** The material steps the base generator and the field; nothing to do here. */ update() {}
615
+ getHash() {
616
+ return `${this._base.getHash()}:FF`;
617
+ }
618
+ needUpdate() {
619
+ return true;
620
+ }
621
+ isOk(device) {
622
+ return this._base.isOk(device);
623
+ }
624
+ }
625
+
626
+ export { FOAM_WAVE_GAIN, FoamFieldWaveGenerator, WaterFoamField, WaveFoamSource };
627
+ //# sourceMappingURL=water_foam.js.map