@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":"water_surface_sampler.js","sources":["../../src/scene/water_surface_sampler.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { Vector3 } from '@zephyr3d/base';\r\n\r\n/**\r\n * What {@link WaterSurfaceSampler} needs from a body of water: where its rest\r\n * plane is, what time its surface is at, and a way to evaluate the displaced\r\n * surface at a set of positions. {@link Water} provides all three.\r\n * @public\r\n */\r\nexport interface WaterSurfaceSource {\r\n /** World matrix; only the translation is read. */\r\n readonly worldMatrix: { readonly m03: number; readonly m13: number; readonly m23: number };\r\n /** Wave clock of the surface, in seconds. */\r\n readonly waveTime: number;\r\n /** Evaluate the displaced surface over world XZ positions. */\r\n getSurfacePoint(\r\n points: Vector3[],\r\n outPos?: Vector3[],\r\n outNorm?: Vector3[],\r\n includeDisturbers?: boolean\r\n ): Promise<void>;\r\n}\r\n\r\n/**\r\n * Options for {@link WaterSurfaceSampler}.\r\n * @public\r\n */\r\nexport interface WaterSurfaceSamplerOptions {\r\n /** Include moving disturbers' wakes. Defaults to false to prevent buoyancy feedback. */\r\n includeDisturbers?: boolean;\r\n /** Lattice cell size in world metres. Defaults to 6. */\r\n spacing?: number;\r\n /** Lattice columns, along X. Defaults to 24. */\r\n cols?: number;\r\n /** Lattice rows, along Z. Defaults to 24. */\r\n rows?: number;\r\n /**\r\n * Upper bound on the query rate in hertz. The achieved rate is the lower of\r\n * this and what a batch costs. Defaults to 30.\r\n */\r\n updateHz?: number;\r\n /**\r\n * Seconds for the reported height to close most of the gap to a new\r\n * measurement. Lower is tighter to the wave, higher is heavier. Defaults to\r\n * 0.25.\r\n */\r\n timeConstant?: number;\r\n}\r\n\r\n/** A set of moving positions evaluated alongside the lattice. @internal */\r\ninterface ExtraPoints {\r\n inputs: Vector3[];\r\n outputs: Vector3[];\r\n onResult: (results: Vector3[], inputs: Vector3[]) => void;\r\n}\r\n\r\n/**\r\n * Height queries against a water surface, driven by the material's own\r\n * evaluation of it.\r\n *\r\n * {@link Water.getSurfacePoint} evaluates the GPU displacement itself, so the\r\n * result is exact by construction rather than a CPU re-implementation of the\r\n * waves. By default it includes ambient waves and external interaction\r\n * impulses, but excludes disturber wakes to prevent buoyancy feeding itself.\r\n * Set includeDisturbers for queries that need the complete rendered surface.\r\n * Each batch costs one point-list draw and one readback, so queries are\r\n * batched and throttled rather than issued per call.\r\n *\r\n * The queries are placed on a fixed lattice at construction; the whole set\r\n * costs one draw and one readback and the answer is interpolated across the\r\n * lattice on demand. Moving positions (a hull's footprint, say) ride along\r\n * through {@link addExtraPoints}.\r\n *\r\n * ## The motion\r\n *\r\n * The reported height eases exponentially towards the newest measurement; the\r\n * query lag is not compensated. A rigid body should read\r\n * {@link sampleWorldYRaw} instead and supply its own inertia.\r\n *\r\n * Consequences a caller has to accept:\r\n * - Resolution is the lattice spacing. A grid at `h` metres resolves nothing\r\n * shorter than about `2 * h`.\r\n * - A probe outside the lattice is answered by the nearest cell rather than by\r\n * a wrapped one; this is a window on the water, not a repeating field.\r\n * - Nothing is known until the first batch lands; until then queries return\r\n * the still-water level.\r\n *\r\n * @public\r\n */\r\nexport class WaterSurfaceSampler {\r\n private readonly _water: WaterSurfaceSource;\r\n private readonly _includeDisturbers: boolean;\r\n private readonly _spacing: number;\r\n private readonly _cols: number;\r\n private readonly _rows: number;\r\n private _updateHz: number;\r\n private _timeConstant: number;\r\n private _pending: boolean;\r\n private _elapsed: number;\r\n private _waveTime: number;\r\n private _readCount: number;\r\n private _failCount: number;\r\n private _totalPoints: number;\r\n private _pendingSince: number;\r\n private _lastLatency: number;\r\n private _batchFrames: number;\r\n private _framesSinceLastBatch: number;\r\n private readonly _originX: number;\r\n private readonly _originZ: number;\r\n private readonly _inputs: Vector3[];\r\n private readonly _outPos: Vector3[];\r\n private readonly _extraListeners: ExtraPoints[];\r\n private _batchInputs: Vector3[];\r\n private _batchOutputs: Vector3[];\r\n private _extrasDirty: boolean;\r\n /** Heights the queries read; null until the first batch. */\r\n private _height: Nullable<Float32Array>;\r\n /** Where the newest measurement put the surface. */\r\n private _target: Nullable<Float32Array>;\r\n /**\r\n * Creates a sampler over a body of water.\r\n * @param water - The water to sample.\r\n * @param options - Lattice and rate options.\r\n */\r\n constructor(water: WaterSurfaceSource, options: WaterSurfaceSamplerOptions = {}) {\r\n this._water = water;\r\n this._includeDisturbers = options.includeDisturbers ?? false;\r\n this._spacing = Math.max(0.01, options.spacing ?? 6);\r\n this._cols = Math.max(2, Math.floor(options.cols ?? 24));\r\n this._rows = Math.max(2, Math.floor(options.rows ?? 24));\r\n this._updateHz = Math.max(0.1, options.updateHz ?? 30);\r\n this._timeConstant = Math.max(0.001, options.timeConstant ?? 0.25);\r\n this._pending = false;\r\n this._elapsed = 0;\r\n this._waveTime = 0;\r\n this._readCount = 0;\r\n this._failCount = 0;\r\n this._totalPoints = 0;\r\n this._pendingSince = 0;\r\n this._lastLatency = 0;\r\n this._batchFrames = 0;\r\n this._framesSinceLastBatch = 0;\r\n // The lattice is anchored on the water's origin, in world space.\r\n const ox = water.worldMatrix.m03;\r\n const oz = water.worldMatrix.m23;\r\n this._originX = ox - ((this._cols - 1) / 2) * this._spacing;\r\n this._originZ = oz - ((this._rows - 1) / 2) * this._spacing;\r\n const count = this._cols * this._rows;\r\n this._inputs = new Array(count);\r\n this._outPos = new Array(count);\r\n for (let j = 0; j < this._rows; j++) {\r\n for (let i = 0; i < this._cols; i++) {\r\n const k = j * this._cols + i;\r\n this._inputs[k] = new Vector3(\r\n this._originX + i * this._spacing,\r\n 0,\r\n this._originZ + j * this._spacing\r\n );\r\n this._outPos[k] = new Vector3();\r\n }\r\n }\r\n this._extraListeners = [];\r\n this._batchInputs = this._inputs;\r\n this._batchOutputs = this._outPos;\r\n this._extrasDirty = false;\r\n this._height = null;\r\n this._target = null;\r\n }\r\n /** Water clock of the newest accepted batch, in seconds. */\r\n get waveTime() {\r\n return this._waveTime;\r\n }\r\n /**\r\n * Upper bound on the query rate in hertz.\r\n *\r\n * A ceiling, not a schedule: the achieved rate is also limited by batch cost.\r\n */\r\n get updateHz() {\r\n return this._updateHz;\r\n }\r\n set updateHz(val: number) {\r\n this._updateHz = Math.max(0.1, val);\r\n }\r\n /**\r\n * Seconds for the reported height to close most of the gap to a new\r\n * measurement. Independent of frame rate.\r\n */\r\n get timeConstant() {\r\n return this._timeConstant;\r\n }\r\n set timeConstant(val: number) {\r\n this._timeConstant = Math.max(0.001, val);\r\n }\r\n /** Batches completed since construction. */\r\n get readCount() {\r\n return this._readCount;\r\n }\r\n /** Batches that failed. */\r\n get failCount() {\r\n return this._failCount;\r\n }\r\n /** True while a batch is in flight. */\r\n get pending() {\r\n return this._pending;\r\n }\r\n /** Seconds the batch in flight has been outstanding, or 0 when none is. */\r\n get pendingSeconds() {\r\n return this._pending ? this._pendingSince : 0;\r\n }\r\n /** Batch latency in seconds, as of the last one that landed. */\r\n get lastLatency() {\r\n return this._lastLatency;\r\n }\r\n /** Frames the newest batch took to come back. */\r\n get batchFrames() {\r\n return this._batchFrames;\r\n }\r\n /** Points evaluated per batch, the cost driver of this sampler. */\r\n get batchSize() {\r\n return this._totalPoints;\r\n }\r\n /** True once a batch has landed and queries return surface heights. */\r\n get ready() {\r\n return !!this._height;\r\n }\r\n /** World metres between lattice samples. */\r\n get spacing() {\r\n return this._spacing;\r\n }\r\n /** World Y of the still-water level. */\r\n get waterLevel() {\r\n return this._water.worldMatrix.m13;\r\n }\r\n /**\r\n * Register world positions to evaluate alongside the lattice, every batch.\r\n *\r\n * The array is held by reference and read when a batch is issued, so a\r\n * caller updates the vectors in place each frame and the next batch picks\r\n * them up. The listener receives the surface positions for those inputs when\r\n * the batch lands, in the same order.\r\n *\r\n * @param inputs - World positions; only X and Z are used.\r\n * @param onResult - Called per batch with the surface positions.\r\n * @returns A function that unregisters the points.\r\n */\r\n addExtraPoints(inputs: Vector3[], onResult: (results: Vector3[], inputs: Vector3[]) => void) {\r\n const outputs = inputs.map(() => new Vector3());\r\n const entry: ExtraPoints = { inputs, outputs, onResult };\r\n this._extraListeners.push(entry);\r\n this._extrasDirty = true;\r\n return () => {\r\n const i = this._extraListeners.indexOf(entry);\r\n if (i >= 0) {\r\n this._extraListeners.splice(i, 1);\r\n this._extrasDirty = true;\r\n }\r\n };\r\n }\r\n /**\r\n * Advance the sampler. Call once per frame with the frame's delta.\r\n * @param deltaSeconds - Frame delta in seconds.\r\n */\r\n update(deltaSeconds: number) {\r\n this._framesSinceLastBatch++;\r\n // Ease once a frame so every query in a frame sees the same value; exact\r\n // exponential decay keeps the result independent of frame size.\r\n if (this._height && this._target) {\r\n const k = 1 - Math.exp(-deltaSeconds / this._timeConstant);\r\n const height = this._height;\r\n const target = this._target;\r\n for (let i = 0; i < height.length; i++) {\r\n height[i] += (target[i] - height[i]) * k;\r\n }\r\n }\r\n if (this._pending) {\r\n this._pendingSince += deltaSeconds;\r\n return;\r\n }\r\n this._elapsed += deltaSeconds;\r\n // Fire as soon as the previous batch has landed, capped at `updateHz`.\r\n if (this._elapsed >= 1 / this._updateHz) {\r\n this._elapsed = 0;\r\n this._pending = true;\r\n this._pendingSince = 0;\r\n this._rebuildBatchArrays();\r\n this._totalPoints = this._batchInputs.length;\r\n // Only positions: the normal attachment would double the readback.\r\n this._water\r\n .getSurfacePoint(this._batchInputs, this._batchOutputs, undefined, this._includeDisturbers)\r\n .then(() => this._acceptBatch())\r\n .catch((err) => {\r\n this._pending = false;\r\n this._pendingSince = 0;\r\n this._failCount++;\r\n console.error('WaterSurfaceSampler: surface query failed', err);\r\n });\r\n }\r\n }\r\n /**\r\n * Surface world Y at a world XZ, eased.\r\n *\r\n * Bilinear over the lattice, clamped at the edges. A pure lookup of the table\r\n * advanced by {@link update}. For objects placed directly at the height,\r\n * without inertia of their own.\r\n */\r\n sampleWorldY(x: number, z: number) {\r\n return this._sampleTable(this._height, x, z);\r\n }\r\n /**\r\n * Surface world Y at a world XZ, from the newest measurement with no easing.\r\n *\r\n * For a rigid body, which would otherwise get the easing lag on top of the\r\n * query lag.\r\n */\r\n sampleWorldYRaw(x: number, z: number) {\r\n return this._sampleTable(this._target, x, z);\r\n }\r\n /**\r\n * Surface normal from the eased lattice, by central differences one cell\r\n * apart.\r\n * @param out - Destination, or a new vector.\r\n * @returns Unit normal, Y up.\r\n */\r\n sampleNormal(x: number, z: number, out?: Vector3) {\r\n const h = this._spacing;\r\n const dx = this.sampleWorldY(x + h, z) - this.sampleWorldY(x - h, z);\r\n const dz = this.sampleWorldY(x, z + h) - this.sampleWorldY(x, z - h);\r\n const nx = -dx / (2 * h);\r\n const nz = -dz / (2 * h);\r\n const len = Math.hypot(nx, 1, nz);\r\n return (out ?? new Vector3()).setXYZ(nx / len, 1 / len, nz / len);\r\n }\r\n /** @internal */\r\n private _rebuildBatchArrays() {\r\n if (!this._extrasDirty) {\r\n return;\r\n }\r\n this._extrasDirty = false;\r\n if (this._extraListeners.length === 0) {\r\n this._batchInputs = this._inputs;\r\n this._batchOutputs = this._outPos;\r\n return;\r\n }\r\n const inputs = this._inputs.slice();\r\n const outputs = this._outPos.slice();\r\n for (const entry of this._extraListeners) {\r\n for (let i = 0; i < entry.inputs.length; i++) {\r\n inputs.push(entry.inputs[i]);\r\n outputs.push(entry.outputs[i]);\r\n }\r\n }\r\n this._batchInputs = inputs;\r\n this._batchOutputs = outputs;\r\n }\r\n /**\r\n * Point the sampler at a batch that just landed. The measurement becomes the\r\n * target the reported height eases towards; the first batch is adopted\r\n * outright, since there is no previous surface to ease from.\r\n * @internal\r\n */\r\n private _acceptBatch() {\r\n this._pending = false;\r\n this._lastLatency = this._pendingSince;\r\n this._pendingSince = 0;\r\n this._elapsed = 0;\r\n const count = this._outPos.length;\r\n if (!this._target) {\r\n this._target = new Float32Array(count);\r\n for (let i = 0; i < count; i++) {\r\n this._target[i] = this._outPos[i].y;\r\n }\r\n this._height = this._target.slice();\r\n } else {\r\n for (let i = 0; i < count; i++) {\r\n this._target[i] = this._outPos[i].y;\r\n }\r\n }\r\n this._batchFrames = this._framesSinceLastBatch;\r\n this._framesSinceLastBatch = 0;\r\n this._readCount++;\r\n this._waveTime = this._water.waveTime;\r\n for (const entry of this._extraListeners) {\r\n entry.onResult(entry.outputs, entry.inputs);\r\n }\r\n }\r\n /** @internal */\r\n private _sampleTable(table: Nullable<Float32Array>, x: number, z: number) {\r\n if (!table) {\r\n return this._water.worldMatrix.m13;\r\n }\r\n const u = (x - this._originX) / this._spacing;\r\n const v = (z - this._originZ) / this._spacing;\r\n const cu = Math.min(this._cols - 1, Math.max(0, u));\r\n const cv = Math.min(this._rows - 1, Math.max(0, v));\r\n const i0 = Math.min(this._cols - 2, Math.max(0, Math.floor(cu)));\r\n const j0 = Math.min(this._rows - 2, Math.max(0, Math.floor(cv)));\r\n const fu = Math.min(1, Math.max(0, cu - i0));\r\n const fv = Math.min(1, Math.max(0, cv - j0));\r\n const r0 = j0 * this._cols;\r\n const r1 = (j0 + 1) * this._cols;\r\n return (\r\n (table[r0 + i0] * (1 - fu) + table[r0 + i0 + 1] * fu) * (1 - fv) +\r\n (table[r1 + i0] * (1 - fu) + table[r1 + i0 + 1] * fu) * fv\r\n );\r\n }\r\n}\r\n"],"names":["WaterSurfaceSampler","_water","_includeDisturbers","_spacing","_cols","_rows","_updateHz","_timeConstant","_pending","_elapsed","_waveTime","_readCount","_failCount","_totalPoints","_pendingSince","_lastLatency","_batchFrames","_framesSinceLastBatch","_originX","_originZ","_inputs","_outPos","_extraListeners","_batchInputs","_batchOutputs","_extrasDirty","water","options","includeDisturbers","Math","max","spacing","floor","cols","rows","updateHz","timeConstant","ox","worldMatrix","m03","oz","m23","count","Array","j","i","k","Vector3","_height","_target","waveTime","val","readCount","failCount","pending","pendingSeconds","lastLatency","batchFrames","batchSize","ready","waterLevel","m13","addExtraPoints","inputs","onResult","outputs","map","entry","push","indexOf","splice","update","deltaSeconds","exp","height","target","length","_rebuildBatchArrays","getSurfacePoint","undefined","then","_acceptBatch","catch","err","console","error","sampleWorldY","x","z","_sampleTable","sampleWorldYRaw","sampleNormal","out","h","dx","dz","nx","nz","len","hypot","setXYZ","slice","Float32Array","y","table","u","v","cu","min","cv","i0","j0","fu","fv","r0","r1"],"mappings":"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"}
@@ -0,0 +1,317 @@
1
+ /**
2
+ * Lattice period of the wind noise, in noise cells. The scroll offsets and the evolution
3
+ * coordinate wrap at this period, so they never lose float precision however long the scene runs.
4
+ */ const NOISE_PERIOD = 256;
5
+ /**
6
+ * How fast the noise evolves in place, in noise cells per noise cell scrolled. Without it the gust
7
+ * pattern would slide along rigidly; with it the gusts form and fade as they travel.
8
+ */ const GUST_EVOLUTION = 0.35;
9
+ const DETAIL_EVOLUTION = 0.7;
10
+ /**
11
+ * Period of the wind clock, in seconds. Oscillations driven by it (grass sway) jump once per
12
+ * period, which keeps float precision of the phase good for the whole period.
13
+ */ const CLOCK_PERIOD = 86400;
14
+ /** Number of vec4 in the shader parameters of one frame, see WindField.shaderParams */ const PARAMS_PER_FRAME = 4;
15
+ /**
16
+ * Integer lattice hash shared by the CPU and GPU paths (same mixing as the grass placement hash).
17
+ * Inputs are lattice coordinates already wrapped into [0, NOISE_PERIOD).
18
+ */ function latticeHash(x, y, z) {
19
+ let h = Math.imul(x, 0x27d4eb2d) ^ Math.imul(y, 0x165667b1) ^ Math.imul(z, 0x9e3779b9) | 0;
20
+ h = Math.imul(h ^ h >>> 15, 0x85ebca6b);
21
+ h = Math.imul(h ^ h >>> 13, 0xc2b2ae35);
22
+ h ^= h >>> 16;
23
+ return h >>> 0;
24
+ }
25
+ /** Gradient selection of Ken Perlin's improved noise (Perlin, "Improving Noise", SIGGRAPH 2002) */ function grad(h, x, y, z) {
26
+ h &= 15;
27
+ const u = h < 8 ? x : y;
28
+ const v = h < 4 ? y : h === 12 || h === 14 ? x : z;
29
+ return (h & 1 ? -u : u) + (h & 2 ? -v : v);
30
+ }
31
+ function fade(t) {
32
+ return t * t * t * (t * (t * 6 - 15) + 10);
33
+ }
34
+ function wrap(i) {
35
+ return i & NOISE_PERIOD - 1;
36
+ }
37
+ /**
38
+ * 3D gradient noise in roughly [-1, 1], periodic with NOISE_PERIOD on every axis.
39
+ * @internal
40
+ */ function windNoise3(x, y, z) {
41
+ const fx = Math.floor(x);
42
+ const fy = Math.floor(y);
43
+ const fz = Math.floor(z);
44
+ const x0 = wrap(fx);
45
+ const y0 = wrap(fy);
46
+ const z0 = wrap(fz);
47
+ const x1 = wrap(fx + 1);
48
+ const y1 = wrap(fy + 1);
49
+ const z1 = wrap(fz + 1);
50
+ const dx = x - fx;
51
+ const dy = y - fy;
52
+ const dz = z - fz;
53
+ const u = fade(dx);
54
+ const v = fade(dy);
55
+ const w = fade(dz);
56
+ const lerp = (a, b, t)=>a + (b - a) * t;
57
+ const n000 = grad(latticeHash(x0, y0, z0), dx, dy, dz);
58
+ const n100 = grad(latticeHash(x1, y0, z0), dx - 1, dy, dz);
59
+ const n010 = grad(latticeHash(x0, y1, z0), dx, dy - 1, dz);
60
+ const n110 = grad(latticeHash(x1, y1, z0), dx - 1, dy - 1, dz);
61
+ const n001 = grad(latticeHash(x0, y0, z1), dx, dy, dz - 1);
62
+ const n101 = grad(latticeHash(x1, y0, z1), dx - 1, dy, dz - 1);
63
+ const n011 = grad(latticeHash(x0, y1, z1), dx, dy - 1, dz - 1);
64
+ const n111 = grad(latticeHash(x1, y1, z1), dx - 1, dy - 1, dz - 1);
65
+ return lerp(lerp(lerp(n000, n100, u), lerp(n010, n110, u), v), lerp(lerp(n001, n101, u), lerp(n011, n111, u), v), w);
66
+ }
67
+ /**
68
+ * Scene-wide wind.
69
+ *
70
+ * The model follows Ghost of Tsushima (Rockenbeck, "Blowing from the West", GDC 2021; Wohllaib,
71
+ * "Procedural Grass in Ghost of Tsushima", GDC 2021): a single wind direction, and a push
72
+ * strength that varies from place to place with time-varying Perlin noise scrolled along the
73
+ * wind, so gusts can be seen travelling across fields. A second, finer noise layer adds the high
74
+ * frequency part. The talks do not give how the noise is shaped, so the push here is
75
+ *
76
+ * push = strength * max(0, 1 + gustStrength * gustNoise + detailStrength * detailNoise)
77
+ *
78
+ * with both noises in about [-1, 1].
79
+ *
80
+ * Systems that react to the wind (grass, foliage, particles...) sample it either on the CPU with
81
+ * {@link WindField.sample} or in shaders with {@link WindField.shaderPush}, using the parameters
82
+ * of {@link WindField.shaderParams}. Those carry the current and the previous frame, so a vertex
83
+ * shader can place a vertex where it was last frame and output a correct motion vector.
84
+ *
85
+ * @public
86
+ */ class WindField {
87
+ _direction;
88
+ _strength;
89
+ _speed;
90
+ _gustStrength;
91
+ _gustScale;
92
+ _detailStrength;
93
+ _detailScale;
94
+ /** Scroll offsets and evolution coordinates, in noise cells, wrapped to the noise period */ _gust;
95
+ _detail;
96
+ /** vec4[2 * PARAMS_PER_FRAME]: current frame then previous frame */ _params;
97
+ _hasPrev;
98
+ _time;
99
+ /** @internal */ constructor(){
100
+ this._direction = 0;
101
+ this._strength = 0.3;
102
+ this._speed = 4;
103
+ this._gustStrength = 0.6;
104
+ this._gustScale = 30;
105
+ this._detailStrength = 0.25;
106
+ this._detailScale = 4;
107
+ this._gust = new Float64Array(3);
108
+ this._detail = new Float64Array(3);
109
+ this._params = new Float32Array(8 * PARAMS_PER_FRAME);
110
+ this._hasPrev = false;
111
+ this._time = 0;
112
+ this.writeParams(0);
113
+ }
114
+ /**
115
+ * Direction the wind blows toward, in degrees on the ground plane. 0 blows toward +X,
116
+ * 90 toward +Z.
117
+ */ get direction() {
118
+ return this._direction;
119
+ }
120
+ set direction(val) {
121
+ this._direction = val;
122
+ this.writeParams(0);
123
+ }
124
+ /** Overall push of the wind. 0 is calm air. */ get strength() {
125
+ return this._strength;
126
+ }
127
+ set strength(val) {
128
+ this._strength = Math.max(0, val);
129
+ this.writeParams(0);
130
+ }
131
+ /** Speed at which the gusts travel along the wind, in world units per second */ get speed() {
132
+ return this._speed;
133
+ }
134
+ set speed(val) {
135
+ this._speed = Math.max(0, val);
136
+ }
137
+ /** How much the gusts raise and lower the push, 0 for a steady wind */ get gustStrength() {
138
+ return this._gustStrength;
139
+ }
140
+ set gustStrength(val) {
141
+ this._gustStrength = Math.max(0, val);
142
+ this.writeParams(0);
143
+ }
144
+ /** Typical size of a gust, in world units */ get gustScale() {
145
+ return this._gustScale;
146
+ }
147
+ set gustScale(val) {
148
+ this._gustScale = Math.max(0.01, val);
149
+ this.writeParams(0);
150
+ }
151
+ /** How much the fine turbulence raises and lowers the push */ get detailStrength() {
152
+ return this._detailStrength;
153
+ }
154
+ set detailStrength(val) {
155
+ this._detailStrength = Math.max(0, val);
156
+ this.writeParams(0);
157
+ }
158
+ /** Typical size of the fine turbulence, in world units */ get detailScale() {
159
+ return this._detailScale;
160
+ }
161
+ set detailScale(val) {
162
+ this._detailScale = Math.max(0.01, val);
163
+ this.writeParams(0);
164
+ }
165
+ /** Unit wind direction on the ground plane as [x, z] */ get directionXZ() {
166
+ const a = this._direction * Math.PI / 180;
167
+ return [
168
+ Math.cos(a),
169
+ Math.sin(a)
170
+ ];
171
+ }
172
+ /** Wind clock in seconds, wrapping once a day; drives oscillations such as grass sway */ get time() {
173
+ return this._time;
174
+ }
175
+ /**
176
+ * Shader parameters, 8 vec4: the current frame in [0, 4) and the previous frame in [4, 8).
177
+ * Pass either half to {@link WindField.shaderPush}.
178
+ */ get shaderParams() {
179
+ return this._params;
180
+ }
181
+ /**
182
+ * Advances the wind by one frame. Called once per frame by the scene.
183
+ * @internal
184
+ */ update(deltaSeconds) {
185
+ // The frame being left becomes the previous frame, parameter edits included
186
+ this._params.copyWithin(4 * PARAMS_PER_FRAME, 0, 4 * PARAMS_PER_FRAME);
187
+ const dt = Number.isFinite(deltaSeconds) ? Math.max(0, Math.min(deltaSeconds, 0.25)) : 0;
188
+ const [dx, dz] = this.directionXZ;
189
+ const advance = (state, scale, evolution)=>{
190
+ const cells = this._speed * dt / scale;
191
+ state[0] = (state[0] + dx * cells) % NOISE_PERIOD;
192
+ state[1] = (state[1] + dz * cells) % NOISE_PERIOD;
193
+ state[2] = (state[2] + cells * evolution) % NOISE_PERIOD;
194
+ };
195
+ advance(this._gust, this._gustScale, GUST_EVOLUTION);
196
+ advance(this._detail, this._detailScale, DETAIL_EVOLUTION);
197
+ this._time = (this._time + dt) % CLOCK_PERIOD;
198
+ this.writeParams(0);
199
+ if (!this._hasPrev) {
200
+ // No previous frame yet: report no motion
201
+ this._params.copyWithin(4 * PARAMS_PER_FRAME, 0, 4 * PARAMS_PER_FRAME);
202
+ this._hasPrev = true;
203
+ }
204
+ }
205
+ /**
206
+ * Samples the wind push at a world position on the CPU
207
+ * @param x - World X
208
+ * @param z - World Z
209
+ * @returns Push strength at the position, see {@link WindField}
210
+ */ sample(x, z) {
211
+ const g = windNoise3(x / this._gustScale - this._gust[0], z / this._gustScale - this._gust[1], this._gust[2]);
212
+ const d = windNoise3(x / this._detailScale - this._detail[0], z / this._detailScale - this._detail[1], this._detail[2]);
213
+ return this._strength * Math.max(0, 1 + this._gustStrength * g + this._detailStrength * d);
214
+ }
215
+ /** @internal */ writeParams(frame) {
216
+ const p = this._params;
217
+ const o = frame * 4 * PARAMS_PER_FRAME;
218
+ const [dx, dz] = this.directionXZ;
219
+ // (direction.xz, strength, gustStrength)
220
+ p[o + 0] = dx;
221
+ p[o + 1] = dz;
222
+ p[o + 2] = this._strength;
223
+ p[o + 3] = this._gustStrength;
224
+ // (gust offset.xz, gust evolution, 1 / gustScale)
225
+ p[o + 4] = this._gust[0];
226
+ p[o + 5] = this._gust[1];
227
+ p[o + 6] = this._gust[2];
228
+ p[o + 7] = 1 / this._gustScale;
229
+ // (detail offset.xz, detail evolution, 1 / detailScale)
230
+ p[o + 8] = this._detail[0];
231
+ p[o + 9] = this._detail[1];
232
+ p[o + 10] = this._detail[2];
233
+ p[o + 11] = 1 / this._detailScale;
234
+ // (detailStrength, wind clock, unused, unused)
235
+ p[o + 12] = this._detailStrength;
236
+ p[o + 13] = this._time;
237
+ p[o + 14] = 0;
238
+ p[o + 15] = 0;
239
+ }
240
+ /**
241
+ * Declares the wind shader functions and returns the push at a world position.
242
+ *
243
+ * @param scope - Current shader scope
244
+ * @param worldXZ - World position on the ground plane (vec2)
245
+ * @param p0 - First vec4 of the frame parameters, see {@link WindField.shaderParams}
246
+ * @param p1 - Second vec4
247
+ * @param p2 - Third vec4
248
+ * @param p3 - Fourth vec4
249
+ * @returns Push strength (float)
250
+ */ static shaderPush(scope, worldXZ, p0, p1, p2, p3) {
251
+ const pb = scope.$builder;
252
+ const funcHash = 'Z_windLatticeHash';
253
+ const funcGrad = 'Z_windGrad';
254
+ const funcNoise = 'Z_windNoise3';
255
+ const funcPush = 'Z_windPush';
256
+ // See latticeHash()
257
+ pb.func(funcHash, [
258
+ pb.uint('x'),
259
+ pb.uint('y'),
260
+ pb.uint('z')
261
+ ], function() {
262
+ this.$l.h = pb.compXor(pb.compXor(pb.mul(this.x, pb.uint(0x27d4eb2d)), pb.mul(this.y, pb.uint(0x165667b1))), pb.mul(this.z, pb.uint(0x9e3779b9)));
263
+ this.h = pb.mul(pb.compXor(this.h, pb.sar(this.h, 15)), pb.uint(0x85ebca6b));
264
+ this.h = pb.mul(pb.compXor(this.h, pb.sar(this.h, 13)), pb.uint(0xc2b2ae35));
265
+ this.h = pb.compXor(this.h, pb.sar(this.h, 16));
266
+ this.$return(this.h);
267
+ });
268
+ // See grad(). Branch-free with mix() since select() is not available on WebGL2
269
+ pb.func(funcGrad, [
270
+ pb.uint('hash'),
271
+ pb.vec3('d')
272
+ ], function() {
273
+ this.$l.h = pb.compAnd(this.hash, pb.uint(15));
274
+ this.$l.u = pb.mix(this.d.y, this.d.x, pb.float(pb.lessThan(this.h, pb.uint(8))));
275
+ this.$l.xz = pb.mix(this.d.z, this.d.x, pb.add(pb.float(pb.equal(this.h, pb.uint(12))), pb.float(pb.equal(this.h, pb.uint(14)))));
276
+ this.$l.v = pb.mix(this.xz, this.d.y, pb.float(pb.lessThan(this.h, pb.uint(4))));
277
+ this.$l.su = pb.sub(1, pb.mul(pb.float(pb.compAnd(this.h, pb.uint(1))), 2));
278
+ this.$l.sv = pb.sub(1, pb.float(pb.compAnd(this.h, pb.uint(2))));
279
+ this.$return(pb.add(pb.mul(this.u, this.su), pb.mul(this.v, this.sv)));
280
+ });
281
+ // See windNoise3()
282
+ pb.func(funcNoise, [
283
+ pb.vec3('p')
284
+ ], function() {
285
+ this.$l.fl = pb.floor(this.p);
286
+ this.$l.d = pb.sub(this.p, this.fl);
287
+ this.$l.i = pb.ivec3(this.fl);
288
+ this.$l.c0 = pb.uvec3(pb.compAnd(this.i, pb.ivec3(NOISE_PERIOD - 1)));
289
+ this.$l.c1 = pb.uvec3(pb.compAnd(pb.add(this.i, pb.ivec3(1)), pb.ivec3(NOISE_PERIOD - 1)));
290
+ this.$l.w = pb.mul(this.d, this.d, this.d, pb.add(pb.mul(this.d, pb.sub(pb.mul(this.d, 6), pb.vec3(15))), pb.vec3(10)));
291
+ this.$l.n000 = this[funcGrad](this[funcHash](this.c0.x, this.c0.y, this.c0.z), this.d);
292
+ this.$l.n100 = this[funcGrad](this[funcHash](this.c1.x, this.c0.y, this.c0.z), pb.sub(this.d, pb.vec3(1, 0, 0)));
293
+ this.$l.n010 = this[funcGrad](this[funcHash](this.c0.x, this.c1.y, this.c0.z), pb.sub(this.d, pb.vec3(0, 1, 0)));
294
+ this.$l.n110 = this[funcGrad](this[funcHash](this.c1.x, this.c1.y, this.c0.z), pb.sub(this.d, pb.vec3(1, 1, 0)));
295
+ this.$l.n001 = this[funcGrad](this[funcHash](this.c0.x, this.c0.y, this.c1.z), pb.sub(this.d, pb.vec3(0, 0, 1)));
296
+ this.$l.n101 = this[funcGrad](this[funcHash](this.c1.x, this.c0.y, this.c1.z), pb.sub(this.d, pb.vec3(1, 0, 1)));
297
+ this.$l.n011 = this[funcGrad](this[funcHash](this.c0.x, this.c1.y, this.c1.z), pb.sub(this.d, pb.vec3(0, 1, 1)));
298
+ this.$l.n111 = this[funcGrad](this[funcHash](this.c1.x, this.c1.y, this.c1.z), pb.sub(this.d, pb.vec3(1, 1, 1)));
299
+ this.$return(pb.mix(pb.mix(pb.mix(this.n000, this.n100, this.w.x), pb.mix(this.n010, this.n110, this.w.x), this.w.y), pb.mix(pb.mix(this.n001, this.n101, this.w.x), pb.mix(this.n011, this.n111, this.w.x), this.w.y), this.w.z));
300
+ });
301
+ pb.func(funcPush, [
302
+ pb.vec2('xz'),
303
+ pb.vec4('p0'),
304
+ pb.vec4('p1'),
305
+ pb.vec4('p2'),
306
+ pb.vec4('p3')
307
+ ], function() {
308
+ this.$l.g = this[funcNoise](pb.vec3(pb.sub(pb.mul(this.xz, this.p1.w), this.p1.xy), this.p1.z));
309
+ this.$l.dn = this[funcNoise](pb.vec3(pb.sub(pb.mul(this.xz, this.p2.w), this.p2.xy), this.p2.z));
310
+ this.$return(pb.mul(this.p0.z, pb.max(0, pb.add(1, pb.add(pb.mul(this.p0.w, this.g), pb.mul(this.p3.x, this.dn))))));
311
+ });
312
+ return pb.getGlobalScope()[funcPush](worldXZ, p0, p1, p2, p3);
313
+ }
314
+ }
315
+
316
+ export { WindField, windNoise3 };
317
+ //# sourceMappingURL=wind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wind.js","sources":["../../src/scene/wind.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\n\r\n/**\r\n * Lattice period of the wind noise, in noise cells. The scroll offsets and the evolution\r\n * coordinate wrap at this period, so they never lose float precision however long the scene runs.\r\n */\r\nconst NOISE_PERIOD = 256;\r\n/**\r\n * How fast the noise evolves in place, in noise cells per noise cell scrolled. Without it the gust\r\n * pattern would slide along rigidly; with it the gusts form and fade as they travel.\r\n */\r\nconst GUST_EVOLUTION = 0.35;\r\nconst DETAIL_EVOLUTION = 0.7;\r\n/**\r\n * Period of the wind clock, in seconds. Oscillations driven by it (grass sway) jump once per\r\n * period, which keeps float precision of the phase good for the whole period.\r\n */\r\nconst CLOCK_PERIOD = 86400;\r\n/** Number of vec4 in the shader parameters of one frame, see WindField.shaderParams */\r\nconst PARAMS_PER_FRAME = 4;\r\n\r\n/**\r\n * Integer lattice hash shared by the CPU and GPU paths (same mixing as the grass placement hash).\r\n * Inputs are lattice coordinates already wrapped into [0, NOISE_PERIOD).\r\n */\r\nfunction latticeHash(x: number, y: number, z: number): number {\r\n let h = (Math.imul(x, 0x27d4eb2d) ^ Math.imul(y, 0x165667b1) ^ Math.imul(z, 0x9e3779b9)) | 0;\r\n h = Math.imul(h ^ (h >>> 15), 0x85ebca6b);\r\n h = Math.imul(h ^ (h >>> 13), 0xc2b2ae35);\r\n h ^= h >>> 16;\r\n return h >>> 0;\r\n}\r\n\r\n/** Gradient selection of Ken Perlin's improved noise (Perlin, \"Improving Noise\", SIGGRAPH 2002) */\r\nfunction grad(h: number, x: number, y: number, z: number): number {\r\n h &= 15;\r\n const u = h < 8 ? x : y;\r\n const v = h < 4 ? y : h === 12 || h === 14 ? x : z;\r\n return (h & 1 ? -u : u) + (h & 2 ? -v : v);\r\n}\r\n\r\nfunction fade(t: number) {\r\n return t * t * t * (t * (t * 6 - 15) + 10);\r\n}\r\n\r\nfunction wrap(i: number) {\r\n return i & (NOISE_PERIOD - 1);\r\n}\r\n\r\n/**\r\n * 3D gradient noise in roughly [-1, 1], periodic with NOISE_PERIOD on every axis.\r\n * @internal\r\n */\r\nexport function windNoise3(x: number, y: number, z: number): number {\r\n const fx = Math.floor(x);\r\n const fy = Math.floor(y);\r\n const fz = Math.floor(z);\r\n const x0 = wrap(fx);\r\n const y0 = wrap(fy);\r\n const z0 = wrap(fz);\r\n const x1 = wrap(fx + 1);\r\n const y1 = wrap(fy + 1);\r\n const z1 = wrap(fz + 1);\r\n const dx = x - fx;\r\n const dy = y - fy;\r\n const dz = z - fz;\r\n const u = fade(dx);\r\n const v = fade(dy);\r\n const w = fade(dz);\r\n const lerp = (a: number, b: number, t: number) => a + (b - a) * t;\r\n const n000 = grad(latticeHash(x0, y0, z0), dx, dy, dz);\r\n const n100 = grad(latticeHash(x1, y0, z0), dx - 1, dy, dz);\r\n const n010 = grad(latticeHash(x0, y1, z0), dx, dy - 1, dz);\r\n const n110 = grad(latticeHash(x1, y1, z0), dx - 1, dy - 1, dz);\r\n const n001 = grad(latticeHash(x0, y0, z1), dx, dy, dz - 1);\r\n const n101 = grad(latticeHash(x1, y0, z1), dx - 1, dy, dz - 1);\r\n const n011 = grad(latticeHash(x0, y1, z1), dx, dy - 1, dz - 1);\r\n const n111 = grad(latticeHash(x1, y1, z1), dx - 1, dy - 1, dz - 1);\r\n return lerp(\r\n lerp(lerp(n000, n100, u), lerp(n010, n110, u), v),\r\n lerp(lerp(n001, n101, u), lerp(n011, n111, u), v),\r\n w\r\n );\r\n}\r\n\r\n/**\r\n * Scene-wide wind.\r\n *\r\n * The model follows Ghost of Tsushima (Rockenbeck, \"Blowing from the West\", GDC 2021; Wohllaib,\r\n * \"Procedural Grass in Ghost of Tsushima\", GDC 2021): a single wind direction, and a push\r\n * strength that varies from place to place with time-varying Perlin noise scrolled along the\r\n * wind, so gusts can be seen travelling across fields. A second, finer noise layer adds the high\r\n * frequency part. The talks do not give how the noise is shaped, so the push here is\r\n *\r\n * push = strength * max(0, 1 + gustStrength * gustNoise + detailStrength * detailNoise)\r\n *\r\n * with both noises in about [-1, 1].\r\n *\r\n * Systems that react to the wind (grass, foliage, particles...) sample it either on the CPU with\r\n * {@link WindField.sample} or in shaders with {@link WindField.shaderPush}, using the parameters\r\n * of {@link WindField.shaderParams}. Those carry the current and the previous frame, so a vertex\r\n * shader can place a vertex where it was last frame and output a correct motion vector.\r\n *\r\n * @public\r\n */\r\nexport class WindField {\r\n private _direction: number;\r\n private _strength: number;\r\n private _speed: number;\r\n private _gustStrength: number;\r\n private _gustScale: number;\r\n private _detailStrength: number;\r\n private _detailScale: number;\r\n /** Scroll offsets and evolution coordinates, in noise cells, wrapped to the noise period */\r\n private readonly _gust: Float64Array;\r\n private readonly _detail: Float64Array;\r\n /** vec4[2 * PARAMS_PER_FRAME]: current frame then previous frame */\r\n private readonly _params: Float32Array<ArrayBuffer>;\r\n private _hasPrev: boolean;\r\n private _time: number;\r\n /** @internal */\r\n constructor() {\r\n this._direction = 0;\r\n this._strength = 0.3;\r\n this._speed = 4;\r\n this._gustStrength = 0.6;\r\n this._gustScale = 30;\r\n this._detailStrength = 0.25;\r\n this._detailScale = 4;\r\n this._gust = new Float64Array(3);\r\n this._detail = new Float64Array(3);\r\n this._params = new Float32Array(8 * PARAMS_PER_FRAME);\r\n this._hasPrev = false;\r\n this._time = 0;\r\n this.writeParams(0);\r\n }\r\n /**\r\n * Direction the wind blows toward, in degrees on the ground plane. 0 blows toward +X,\r\n * 90 toward +Z.\r\n */\r\n get direction() {\r\n return this._direction;\r\n }\r\n set direction(val: number) {\r\n this._direction = val;\r\n this.writeParams(0);\r\n }\r\n /** Overall push of the wind. 0 is calm air. */\r\n get strength() {\r\n return this._strength;\r\n }\r\n set strength(val: number) {\r\n this._strength = Math.max(0, val);\r\n this.writeParams(0);\r\n }\r\n /** Speed at which the gusts travel along the wind, in world units per second */\r\n get speed() {\r\n return this._speed;\r\n }\r\n set speed(val: number) {\r\n this._speed = Math.max(0, val);\r\n }\r\n /** How much the gusts raise and lower the push, 0 for a steady wind */\r\n get gustStrength() {\r\n return this._gustStrength;\r\n }\r\n set gustStrength(val: number) {\r\n this._gustStrength = Math.max(0, val);\r\n this.writeParams(0);\r\n }\r\n /** Typical size of a gust, in world units */\r\n get gustScale() {\r\n return this._gustScale;\r\n }\r\n set gustScale(val: number) {\r\n this._gustScale = Math.max(0.01, val);\r\n this.writeParams(0);\r\n }\r\n /** How much the fine turbulence raises and lowers the push */\r\n get detailStrength() {\r\n return this._detailStrength;\r\n }\r\n set detailStrength(val: number) {\r\n this._detailStrength = Math.max(0, val);\r\n this.writeParams(0);\r\n }\r\n /** Typical size of the fine turbulence, in world units */\r\n get detailScale() {\r\n return this._detailScale;\r\n }\r\n set detailScale(val: number) {\r\n this._detailScale = Math.max(0.01, val);\r\n this.writeParams(0);\r\n }\r\n /** Unit wind direction on the ground plane as [x, z] */\r\n get directionXZ(): [number, number] {\r\n const a = (this._direction * Math.PI) / 180;\r\n return [Math.cos(a), Math.sin(a)];\r\n }\r\n /** Wind clock in seconds, wrapping once a day; drives oscillations such as grass sway */\r\n get time() {\r\n return this._time;\r\n }\r\n /**\r\n * Shader parameters, 8 vec4: the current frame in [0, 4) and the previous frame in [4, 8).\r\n * Pass either half to {@link WindField.shaderPush}.\r\n */\r\n get shaderParams(): Float32Array<ArrayBuffer> {\r\n return this._params;\r\n }\r\n /**\r\n * Advances the wind by one frame. Called once per frame by the scene.\r\n * @internal\r\n */\r\n update(deltaSeconds: number) {\r\n // The frame being left becomes the previous frame, parameter edits included\r\n this._params.copyWithin(4 * PARAMS_PER_FRAME, 0, 4 * PARAMS_PER_FRAME);\r\n const dt = Number.isFinite(deltaSeconds) ? Math.max(0, Math.min(deltaSeconds, 0.25)) : 0;\r\n const [dx, dz] = this.directionXZ;\r\n const advance = (state: Float64Array, scale: number, evolution: number) => {\r\n const cells = (this._speed * dt) / scale;\r\n state[0] = (state[0] + dx * cells) % NOISE_PERIOD;\r\n state[1] = (state[1] + dz * cells) % NOISE_PERIOD;\r\n state[2] = (state[2] + cells * evolution) % NOISE_PERIOD;\r\n };\r\n advance(this._gust, this._gustScale, GUST_EVOLUTION);\r\n advance(this._detail, this._detailScale, DETAIL_EVOLUTION);\r\n this._time = (this._time + dt) % CLOCK_PERIOD;\r\n this.writeParams(0);\r\n if (!this._hasPrev) {\r\n // No previous frame yet: report no motion\r\n this._params.copyWithin(4 * PARAMS_PER_FRAME, 0, 4 * PARAMS_PER_FRAME);\r\n this._hasPrev = true;\r\n }\r\n }\r\n /**\r\n * Samples the wind push at a world position on the CPU\r\n * @param x - World X\r\n * @param z - World Z\r\n * @returns Push strength at the position, see {@link WindField}\r\n */\r\n sample(x: number, z: number): number {\r\n const g = windNoise3(\r\n x / this._gustScale - this._gust[0],\r\n z / this._gustScale - this._gust[1],\r\n this._gust[2]\r\n );\r\n const d = windNoise3(\r\n x / this._detailScale - this._detail[0],\r\n z / this._detailScale - this._detail[1],\r\n this._detail[2]\r\n );\r\n return this._strength * Math.max(0, 1 + this._gustStrength * g + this._detailStrength * d);\r\n }\r\n /** @internal */\r\n private writeParams(frame: number) {\r\n const p = this._params;\r\n const o = frame * 4 * PARAMS_PER_FRAME;\r\n const [dx, dz] = this.directionXZ;\r\n // (direction.xz, strength, gustStrength)\r\n p[o + 0] = dx;\r\n p[o + 1] = dz;\r\n p[o + 2] = this._strength;\r\n p[o + 3] = this._gustStrength;\r\n // (gust offset.xz, gust evolution, 1 / gustScale)\r\n p[o + 4] = this._gust[0];\r\n p[o + 5] = this._gust[1];\r\n p[o + 6] = this._gust[2];\r\n p[o + 7] = 1 / this._gustScale;\r\n // (detail offset.xz, detail evolution, 1 / detailScale)\r\n p[o + 8] = this._detail[0];\r\n p[o + 9] = this._detail[1];\r\n p[o + 10] = this._detail[2];\r\n p[o + 11] = 1 / this._detailScale;\r\n // (detailStrength, wind clock, unused, unused)\r\n p[o + 12] = this._detailStrength;\r\n p[o + 13] = this._time;\r\n p[o + 14] = 0;\r\n p[o + 15] = 0;\r\n }\r\n /**\r\n * Declares the wind shader functions and returns the push at a world position.\r\n *\r\n * @param scope - Current shader scope\r\n * @param worldXZ - World position on the ground plane (vec2)\r\n * @param p0 - First vec4 of the frame parameters, see {@link WindField.shaderParams}\r\n * @param p1 - Second vec4\r\n * @param p2 - Third vec4\r\n * @param p3 - Fourth vec4\r\n * @returns Push strength (float)\r\n */\r\n static shaderPush(\r\n scope: PBInsideFunctionScope,\r\n worldXZ: PBShaderExp,\r\n p0: PBShaderExp,\r\n p1: PBShaderExp,\r\n p2: PBShaderExp,\r\n p3: PBShaderExp\r\n ): PBShaderExp {\r\n const pb = scope.$builder;\r\n const funcHash = 'Z_windLatticeHash';\r\n const funcGrad = 'Z_windGrad';\r\n const funcNoise = 'Z_windNoise3';\r\n const funcPush = 'Z_windPush';\r\n // See latticeHash()\r\n pb.func(funcHash, [pb.uint('x'), pb.uint('y'), pb.uint('z')], function () {\r\n this.$l.h = pb.compXor(\r\n pb.compXor(pb.mul(this.x, pb.uint(0x27d4eb2d)), pb.mul(this.y, pb.uint(0x165667b1))),\r\n pb.mul(this.z, pb.uint(0x9e3779b9))\r\n );\r\n this.h = pb.mul(pb.compXor(this.h, pb.sar(this.h, 15)), pb.uint(0x85ebca6b));\r\n this.h = pb.mul(pb.compXor(this.h, pb.sar(this.h, 13)), pb.uint(0xc2b2ae35));\r\n this.h = pb.compXor(this.h, pb.sar(this.h, 16));\r\n this.$return(this.h);\r\n });\r\n // See grad(). Branch-free with mix() since select() is not available on WebGL2\r\n pb.func(funcGrad, [pb.uint('hash'), pb.vec3('d')], function () {\r\n this.$l.h = pb.compAnd(this.hash, pb.uint(15));\r\n this.$l.u = pb.mix(this.d.y, this.d.x, pb.float(pb.lessThan(this.h, pb.uint(8))));\r\n this.$l.xz = pb.mix(\r\n this.d.z,\r\n this.d.x,\r\n pb.add(pb.float(pb.equal(this.h, pb.uint(12))), pb.float(pb.equal(this.h, pb.uint(14))))\r\n );\r\n this.$l.v = pb.mix(this.xz, this.d.y, pb.float(pb.lessThan(this.h, pb.uint(4))));\r\n this.$l.su = pb.sub(1, pb.mul(pb.float(pb.compAnd(this.h, pb.uint(1))), 2));\r\n this.$l.sv = pb.sub(1, pb.float(pb.compAnd(this.h, pb.uint(2))));\r\n this.$return(pb.add(pb.mul(this.u, this.su), pb.mul(this.v, this.sv)));\r\n });\r\n // See windNoise3()\r\n pb.func(funcNoise, [pb.vec3('p')], function () {\r\n this.$l.fl = pb.floor(this.p);\r\n this.$l.d = pb.sub(this.p, this.fl);\r\n this.$l.i = pb.ivec3(this.fl);\r\n this.$l.c0 = pb.uvec3(pb.compAnd(this.i, pb.ivec3(NOISE_PERIOD - 1)));\r\n this.$l.c1 = pb.uvec3(pb.compAnd(pb.add(this.i, pb.ivec3(1)), pb.ivec3(NOISE_PERIOD - 1)));\r\n this.$l.w = pb.mul(\r\n this.d,\r\n this.d,\r\n this.d,\r\n pb.add(pb.mul(this.d, pb.sub(pb.mul(this.d, 6), pb.vec3(15))), pb.vec3(10))\r\n );\r\n this.$l.n000 = this[funcGrad](this[funcHash](this.c0.x, this.c0.y, this.c0.z), this.d);\r\n this.$l.n100 = this[funcGrad](\r\n this[funcHash](this.c1.x, this.c0.y, this.c0.z),\r\n pb.sub(this.d, pb.vec3(1, 0, 0))\r\n );\r\n this.$l.n010 = this[funcGrad](\r\n this[funcHash](this.c0.x, this.c1.y, this.c0.z),\r\n pb.sub(this.d, pb.vec3(0, 1, 0))\r\n );\r\n this.$l.n110 = this[funcGrad](\r\n this[funcHash](this.c1.x, this.c1.y, this.c0.z),\r\n pb.sub(this.d, pb.vec3(1, 1, 0))\r\n );\r\n this.$l.n001 = this[funcGrad](\r\n this[funcHash](this.c0.x, this.c0.y, this.c1.z),\r\n pb.sub(this.d, pb.vec3(0, 0, 1))\r\n );\r\n this.$l.n101 = this[funcGrad](\r\n this[funcHash](this.c1.x, this.c0.y, this.c1.z),\r\n pb.sub(this.d, pb.vec3(1, 0, 1))\r\n );\r\n this.$l.n011 = this[funcGrad](\r\n this[funcHash](this.c0.x, this.c1.y, this.c1.z),\r\n pb.sub(this.d, pb.vec3(0, 1, 1))\r\n );\r\n this.$l.n111 = this[funcGrad](\r\n this[funcHash](this.c1.x, this.c1.y, this.c1.z),\r\n pb.sub(this.d, pb.vec3(1, 1, 1))\r\n );\r\n this.$return(\r\n pb.mix(\r\n pb.mix(pb.mix(this.n000, this.n100, this.w.x), pb.mix(this.n010, this.n110, this.w.x), this.w.y),\r\n pb.mix(pb.mix(this.n001, this.n101, this.w.x), pb.mix(this.n011, this.n111, this.w.x), this.w.y),\r\n this.w.z\r\n )\r\n );\r\n });\r\n pb.func(\r\n funcPush,\r\n [pb.vec2('xz'), pb.vec4('p0'), pb.vec4('p1'), pb.vec4('p2'), pb.vec4('p3')],\r\n function () {\r\n this.$l.g = this[funcNoise](pb.vec3(pb.sub(pb.mul(this.xz, this.p1.w), this.p1.xy), this.p1.z));\r\n this.$l.dn = this[funcNoise](pb.vec3(pb.sub(pb.mul(this.xz, this.p2.w), this.p2.xy), this.p2.z));\r\n this.$return(\r\n pb.mul(\r\n this.p0.z,\r\n pb.max(0, pb.add(1, pb.add(pb.mul(this.p0.w, this.g), pb.mul(this.p3.x, this.dn))))\r\n )\r\n );\r\n }\r\n );\r\n return pb.getGlobalScope()[funcPush](worldXZ, p0, p1, p2, p3) as PBShaderExp;\r\n }\r\n}\r\n"],"names":["NOISE_PERIOD","GUST_EVOLUTION","DETAIL_EVOLUTION","CLOCK_PERIOD","PARAMS_PER_FRAME","latticeHash","x","y","z","h","Math","imul","grad","u","v","fade","t","wrap","i","windNoise3","fx","floor","fy","fz","x0","y0","z0","x1","y1","z1","dx","dy","dz","w","lerp","a","b","n000","n100","n010","n110","n001","n101","n011","n111","WindField","_direction","_strength","_speed","_gustStrength","_gustScale","_detailStrength","_detailScale","_detail","_hasPrev","_time","_gust","Float64Array","_params","Float32Array","writeParams","direction","val","strength","max","speed","gustStrength","gustScale","detailStrength","detailScale","directionXZ","PI","cos","sin","time","shaderParams","update","deltaSeconds","copyWithin","dt","Number","isFinite","min","advance","state","scale","evolution","cells","sample","g","d","frame","p","o","shaderPush","scope","worldXZ","p0","p1","p2","p3","pb","$builder","funcHash","funcGrad","funcNoise","funcPush","func","uint","$l","compXor","mul","sar","$return","vec3","compAnd","hash","mix","float","lessThan","xz","add","equal","su","sub","sv","fl","ivec3","c0","uvec3","c1","vec2","vec4","xy","dn","getGlobalScope"],"mappings":"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"}