@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
@@ -3,13 +3,14 @@ import { ShaderHelper } from '../material/shader/helper.js';
3
3
  import '../material/lambert.js';
4
4
  import '../material/blinn.js';
5
5
  import '../material/unlit.js';
6
+ import '../material/meshmaterial.js';
6
7
  import '../material/particle.js';
7
8
  import '../material/subsurfaceprofile.js';
8
- import '../material/skin.js';
9
+ import '../material/sssprofile.js';
10
+ import '../material/sss.js';
9
11
  import '../material/eye.js';
10
12
  import '@zephyr3d/device';
11
13
  import { MAX_GERSTNER_WAVE_COUNT } from '../values.js';
12
- import '../material/meshmaterial.js';
13
14
  import '../material/hair.js';
14
15
  import '../material/hairstrand.js';
15
16
  import '../material/grassmaterial.js';
@@ -43,8 +44,7 @@ import '../utility/blueprint/material/texture.js';
43
44
  this.randomWave(3);
44
45
  this._numWaves = 4;
45
46
  this._version = 0;
46
- // Same defaults as the FFT generator, so switching between the two does not
47
- // change the foam response out of the box.
47
+ // Same defaults as the FFT generator.
48
48
  this._foamParams = new Float32Array([
49
49
  1.2,
50
50
  7.2
@@ -109,13 +109,9 @@ import '../utility/blueprint/material/texture.js';
109
109
  if (this._numWaves >= MAX_GERSTNER_WAVE_COUNT) {
110
110
  return;
111
111
  }
112
- // Shift from the tail backwards so the gap opens at `index` without
113
- // overwriting the slot that is about to move. Copying forward here would
114
- // duplicate `waveParams[index]` into every later slot instead of moving
115
- // them up. The new slot is filled with a random wave rather than left at
116
- // zero: a zero wavelength makes `w = 2*PI / length` infinite and drives the
117
- // vertex shader into NaN, which collapses the whole surface, so the slot
118
- // has to be a valid wave even before the caller writes its parameters.
112
+ // Shift from the tail backwards so the gap opens at `index`. The new slot
113
+ // gets a random valid wave: a zero wavelength makes `w = 2*PI / length`
114
+ // infinite and drives the vertex shader into NaN.
119
115
  for(let i = this._numWaves - 1; i >= index; i--){
120
116
  for(let j = 0; j < 8; j++){
121
117
  this._waveParams[(i + 1) * 8 + j] = this._waveParams[i * 8 + j];
@@ -295,19 +291,12 @@ import '../utility/blueprint/material/texture.js';
295
291
  this.$l.inPos = pb.vec3(this.xz.x, 0, this.xz.y);
296
292
  this.$l.outPos = pb.vec3();
297
293
  this.$l.outNormal = pb.vec3(0);
298
- // Horizontal-gradient terms accumulated over the waves. The displacement
299
- // derivative terms come out of gerstnerWave; summed, they feed det(I + J),
300
- // the fold signal the foam is derived from - the same Jacobian the FFT
301
- // generator uses, so both generators key foam off the same physics.
294
+ // Horizontal-gradient terms summed over the waves, for det(I + J), the
295
+ // fold signal the foam is derived from (same as the FFT generator).
302
296
  this.$l.dxdx = pb.float(0);
303
297
  this.$l.dzdz = pb.float(0);
304
298
  this.$l.dxdz = pb.float(0);
305
- this.$for(pb.float('i'), 0, pb.getDevice().type === 'webgl' ? MAX_GERSTNER_WAVE_COUNT : this.numWaves, function() {
306
- if (pb.getDevice().type === 'webgl') {
307
- this.$if(pb.greaterThanEqual(this.i, this.numWaves), function() {
308
- this.$break();
309
- });
310
- }
299
+ this.$for(pb.float('i'), 0, this.numWaves, function() {
311
300
  this.$l.waveNormal = pb.vec3();
312
301
  this.$l.waveDxdx = pb.float();
313
302
  this.$l.waveDzdz = pb.float();
@@ -319,9 +308,8 @@ import '../utility/blueprint/material/texture.js';
319
308
  this.dzdz = pb.add(this.dzdz, this.waveDzdz);
320
309
  this.dxdz = pb.add(this.dxdz, this.waveDxdz);
321
310
  });
322
- // Jacobian determinant of the horizontal displacement, det(I + J). When the
323
- // surface folds over the determinant drops below the foamParams.x threshold
324
- // and the coverage ramps in. Mirrors the FFT generator's foam.
311
+ // Jacobian determinant of the horizontal displacement, det(I + J); below
312
+ // the foamParams.x threshold the surface folds and foam ramps in.
325
313
  this.$l.val = pb.sub(pb.mul(pb.add(1, this.dxdx), pb.add(1, this.dzdz)), pb.mul(this.dxdz, this.dxdz));
326
314
  this.$l.foam = pb.abs(pb.pow(pb.neg(pb.min(0, pb.sub(this.val, this.foamParams.x))), this.foamParams.y));
327
315
  this.$return(pb.vec4(this.outNormal, this.foam));
@@ -367,14 +355,9 @@ import '../utility/blueprint/material/texture.js';
367
355
  this.$l.wa = pb.mul(this.w, this.amplitude);
368
356
  this.$l.n = pb.vec3(pb.neg(pb.mul(this.windDir.xy, this.wa, this.cosCalc)), pb.sub(1, pb.mul(this.qi, this.wa, this.sinCalc)));
369
357
  this.outNormal = pb.div(this.n.xzy, this.numWaves);
370
- // Horizontal-gradient of the displacement, per wave. `waveXZ =
371
- // windDir.xy * qi * amp * cos`, and the derivative of `cos(calc)` w.r.t.
372
- // xz is `-w * sin(calc)`, so the gradient is the outer product of
373
- // `windDir.xy` with itself scaled by `-qi * wa * sin`. The sign matters:
374
- // at a crest (sin positive, cal near PI/2) the surface is compressed
375
- // horizontally, which is what pushes `det(I + J)` down and fires the
376
- // fold signal. Summed over waves and run through det(I + J), this is the
377
- // same Jacobian criterion the FFT generator uses.
358
+ // Horizontal gradient of the displacement `windDir.xy * qi * amp * cos`:
359
+ // the outer product of `windDir.xy` with itself scaled by `-qi * wa * sin`.
360
+ // At a crest the surface is compressed, pushing det(I + J) down.
378
361
  this.$l.jac = pb.neg(pb.mul(this.qi, this.wa, this.sinCalc));
379
362
  this.outDxdx = pb.mul(this.jac, this.windDir.x, this.windDir.x);
380
363
  this.outDzdz = pb.mul(this.jac, this.windDir.y, this.windDir.y);
@@ -393,12 +376,7 @@ import '../utility/blueprint/material/texture.js';
393
376
  ], function() {
394
377
  this.outPos = this.inPos;
395
378
  this.outNormal = pb.vec3(0);
396
- this.$for(pb.float('i'), 0, pb.getDevice().type === 'webgl' ? MAX_GERSTNER_WAVE_COUNT : this.numWaves, function() {
397
- if (pb.getDevice().type === 'webgl') {
398
- this.$if(pb.greaterThanEqual(this.i, this.numWaves), function() {
399
- this.$break();
400
- });
401
- }
379
+ this.$for(pb.float('i'), 0, this.numWaves, function() {
402
380
  this.$l.waveNormal = pb.vec3();
403
381
  this.$l.waveDxdx = pb.float();
404
382
  this.$l.waveDzdz = pb.float();
@@ -1 +1 @@
1
- {"version":3,"file":"gerstner_wavegenerator.js","sources":["../../src/render/gerstner_wavegenerator.ts"],"sourcesContent":["import { Disposable, PRNG, type AABB } from '@zephyr3d/base';\r\nimport type { WaveGenerator } from './wavegenerator';\r\nimport type { BindGroup, PBGlobalScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { ShaderHelper } from '../material';\r\nimport { MAX_GERSTNER_WAVE_COUNT } from '../values';\r\n\r\n/**\r\n * Gerstner wave generator.\r\n * @public\r\n */\r\nexport class GerstnerWaveGenerator extends Disposable implements WaveGenerator {\r\n private _version: number;\r\n private _waveParams: Float32Array<ArrayBuffer>;\r\n private _numWaves: number;\r\n private _rand: PRNG;\r\n private readonly _foamParams: Float32Array<ArrayBuffer>;\r\n /**\r\n * Creates a new Gerstner wave generator.\r\n */\r\n constructor(randomSeed = 0) {\r\n super();\r\n this._waveParams = new Float32Array(8 * MAX_GERSTNER_WAVE_COUNT);\r\n this._rand = new PRNG(randomSeed);\r\n this.randomWave(0);\r\n this.randomWave(1);\r\n this.randomWave(2);\r\n this.randomWave(3);\r\n this._numWaves = 4;\r\n this._version = 0;\r\n // Same defaults as the FFT generator, so switching between the two does not\r\n // change the foam response out of the box.\r\n this._foamParams = new Float32Array([1.2, 7.2]);\r\n }\r\n /** @internal */\r\n static randomWaveData(rand: PRNG, array: Float32Array, offset: number) {\r\n array[offset + 0] = rand.get() * Math.PI * 2;\r\n array[offset + 1] = rand.get() * 0.5 + 0.5;\r\n array[offset + 2] = rand.get() * 0.1;\r\n array[offset + 3] = rand.get() * 10;\r\n array[offset + 4] = rand.get() * 100 - 50;\r\n array[offset + 5] = 0;\r\n array[offset + 6] = rand.get() * 100 - 50;\r\n array[offset + 7] = 0;\r\n }\r\n /** @internal */\r\n setRaw(data: Float32Array, index: number) {\r\n this._waveParams.set(data, index * 8);\r\n }\r\n clone() {\r\n const other = new GerstnerWaveGenerator();\r\n other.numWaves = this.numWaves;\r\n other._waveParams.set(this._waveParams);\r\n other._foamParams.set(this._foamParams);\r\n return other as this;\r\n }\r\n get rand() {\r\n return this._rand;\r\n }\r\n get version() {\r\n return this._version;\r\n }\r\n /** Gets the number of waves. */\r\n get numWaves() {\r\n return this._numWaves;\r\n }\r\n set numWaves(val) {\r\n if (!Number.isInteger(val) || val <= 0 || val > MAX_GERSTNER_WAVE_COUNT) {\r\n console.error(`Invalid wave number: ${val}`);\r\n return;\r\n }\r\n if (val !== this._numWaves) {\r\n for (let i = this._numWaves; i < val; i++) {\r\n this.randomWave(i);\r\n }\r\n this._numWaves = val;\r\n this._version++;\r\n }\r\n }\r\n /** Delete wave at index */\r\n deleteWave(index: number) {\r\n if (index < 0 || index >= this._numWaves) {\r\n return;\r\n }\r\n for (let i = index; i < this._numWaves - 1; i++) {\r\n for (let j = 0; j < 8; j++) {\r\n this._waveParams[i * 8 + j] = this._waveParams[(i + 1) * 8 + j];\r\n }\r\n }\r\n this._numWaves--;\r\n this._version++;\r\n }\r\n /** Insert a wave slot at index, shifting the subsequent waves up */\r\n insertWave(index: number) {\r\n // Bounded by the parameter buffer; the shader reads this many slots.\r\n if (this._numWaves >= MAX_GERSTNER_WAVE_COUNT) {\r\n return;\r\n }\r\n // Shift from the tail backwards so the gap opens at `index` without\r\n // overwriting the slot that is about to move. Copying forward here would\r\n // duplicate `waveParams[index]` into every later slot instead of moving\r\n // them up. The new slot is filled with a random wave rather than left at\r\n // zero: a zero wavelength makes `w = 2*PI / length` infinite and drives the\r\n // vertex shader into NaN, which collapses the whole surface, so the slot\r\n // has to be a valid wave even before the caller writes its parameters.\r\n for (let i = this._numWaves - 1; i >= index; i--) {\r\n for (let j = 0; j < 8; j++) {\r\n this._waveParams[(i + 1) * 8 + j] = this._waveParams[i * 8 + j];\r\n }\r\n }\r\n this.randomWave(index);\r\n this._numWaves++;\r\n this._version++;\r\n }\r\n /**\r\n * Sets the angle of the wave direction in radians.\r\n * @param waveIndex - index of the wave to set.\r\n * @param angle - angle of the wave direction in radians.\r\n */\r\n setWaveDirection(waveIndex: number, angle: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 0] = angle;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the angle of the wave direction in radians.\r\n * @param waveIndex - index of the wave to get.\r\n * @returns Angle of the wave direction in radians.\r\n */\r\n getWaveDirection(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 0] : 0;\r\n }\r\n /**\r\n * Sets the steepness of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param steepness - Steepness of the wave.\r\n */\r\n setWaveSteepness(waveIndex: number, steepness: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 1] = steepness;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the steepness of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Steepness of the wave.\r\n */\r\n getWaveSteepness(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 1] : 0;\r\n }\r\n /**\r\n * Sets the amplitude of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param val - Amplitude of the wave.\r\n */\r\n setWaveAmplitude(waveIndex: number, val: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 2] = val;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the amplitude of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Amplitude of the wave.\r\n */\r\n getWaveAmplitude(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 2] : 0;\r\n }\r\n /**\r\n * Sets the length of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param val - Length of the wave.\r\n */\r\n setWaveLength(waveIndex: number, val: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 3] = val;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the length of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Length of the wave.\r\n */\r\n getWaveLength(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 3] : 0;\r\n }\r\n /**\r\n * Query if the wave is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns true if the wave is an omni-directional wave, false otherwise.\r\n */\r\n isOmniWave(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 7] !== 0 : false;\r\n }\r\n /**\r\n * Sets whether the wave is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param isOmni - true if the wave is an omni-directional wave, false otherwise.\r\n */\r\n setOmniWave(waveIndex: number, isOmni: boolean) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 7] = isOmni ? 1 : 0;\r\n this._version++;\r\n }\r\n }\r\n /** Gets the foam width. */\r\n get foamWidth() {\r\n return this._foamParams[0];\r\n }\r\n set foamWidth(val) {\r\n if (val !== this._foamParams[0]) {\r\n this._foamParams[0] = val;\r\n this._version++;\r\n }\r\n }\r\n /** Gets the foam contrast. */\r\n get foamContrast() {\r\n return this._foamParams[1];\r\n }\r\n set foamContrast(val) {\r\n if (val !== this._foamParams[1]) {\r\n this._foamParams[1] = val;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the X coordinate of the wave origin if it is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns X coordinate of the wave origin if it is an omni-directional wave, 0 otherwise.\r\n */\r\n getOriginX(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 4] : 0;\r\n }\r\n /**\r\n * Gets the Z coordinate of the wave origin if it is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Z coordinate of the wave origin if it is an omni-directional wave, 0 otherwise.\r\n */\r\n getOriginZ(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 6] : 0;\r\n }\r\n /**\r\n * Sets the X and Z coordinates of the wave origin if it is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param x - X coordinate of the wave origin\r\n * @param z - Z coordinate of the wave origin\r\n */\r\n setOrigin(waveIndex: number, x: number, z: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 4] = x;\r\n this._waveParams[waveIndex * 8 + 6] = z;\r\n this._version++;\r\n }\r\n }\r\n /** @internal */\r\n randomWave(i: number) {\r\n GerstnerWaveGenerator.randomWaveData(this._rand, this._waveParams, i * 8);\r\n }\r\n /** {@inheritDoc WaveGenerator.update} */\r\n update() {}\r\n /** {@inheritDoc WaveGenerator.needUpdate} */\r\n needUpdate() {\r\n return false;\r\n }\r\n /** {@inheritDoc WaveGenerator.calcClipmapTileAABB} */\r\n calcClipmapTileAABB(minX: number, maxX: number, minZ: number, maxZ: number, y: number, outAABB: AABB) {\r\n let maxHeight = 0;\r\n for (let i = 0; i < this._numWaves; i++) {\r\n const h = this._waveParams[i * 8 + 2];\r\n if (h > maxHeight) {\r\n maxHeight = h;\r\n }\r\n }\r\n outAABB.minPoint.setXYZ(minX, y, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, y + maxHeight, maxZ);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormal} */\r\n calcFragmentNormal(scope: PBInsideFunctionScope, xz: PBShaderExp, _vertexNormal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('calcFragmentNormal', [pb.vec2('xz')], function () {\r\n this.$l.inPos = pb.vec3(this.xz.x, 0, this.xz.y);\r\n this.$l.outPos = pb.vec3();\r\n this.$l.outNormal = pb.vec3();\r\n that.calcNormalAndPos(this, this.inPos, this.outPos, this.outNormal);\r\n this.$return(this.outNormal);\r\n });\r\n return scope.calcFragmentNormal(xz) as PBShaderExp;\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormalAndFoam} */\r\n calcFragmentNormalAndFoam(scope: PBInsideFunctionScope, xz: PBShaderExp, _vertexNormal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('calcNormalAndFoam', [pb.vec2('xz')], function () {\r\n this.$l.inPos = pb.vec3(this.xz.x, 0, this.xz.y);\r\n this.$l.outPos = pb.vec3();\r\n this.$l.outNormal = pb.vec3(0);\r\n // Horizontal-gradient terms accumulated over the waves. The displacement\r\n // derivative terms come out of gerstnerWave; summed, they feed det(I + J),\r\n // the fold signal the foam is derived from - the same Jacobian the FFT\r\n // generator uses, so both generators key foam off the same physics.\r\n this.$l.dxdx = pb.float(0);\r\n this.$l.dzdz = pb.float(0);\r\n this.$l.dxdz = pb.float(0);\r\n this.$for(\r\n pb.float('i'),\r\n 0,\r\n pb.getDevice().type === 'webgl' ? MAX_GERSTNER_WAVE_COUNT : this.numWaves,\r\n function () {\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$if(pb.greaterThanEqual(this.i, this.numWaves), function () {\r\n this.$break();\r\n });\r\n }\r\n this.$l.waveNormal = pb.vec3();\r\n this.$l.waveDxdx = pb.float();\r\n this.$l.waveDzdz = pb.float();\r\n this.$l.waveDxdz = pb.float();\r\n this.$l.wavePos = that.gerstnerWave(\r\n this,\r\n this.waveParams.at(pb.mul(this.i, 2)),\r\n this.waveParams.at(pb.add(pb.mul(this.i, 2), 1)),\r\n this.inPos,\r\n this.waveNormal,\r\n this.waveDxdx,\r\n this.waveDzdz,\r\n this.waveDxdz\r\n );\r\n this.outPos = pb.add(this.outPos, this.wavePos);\r\n this.outNormal = pb.add(this.outNormal, this.waveNormal);\r\n this.dxdx = pb.add(this.dxdx, this.waveDxdx);\r\n this.dzdz = pb.add(this.dzdz, this.waveDzdz);\r\n this.dxdz = pb.add(this.dxdz, this.waveDxdz);\r\n }\r\n );\r\n // Jacobian determinant of the horizontal displacement, det(I + J). When the\r\n // surface folds over the determinant drops below the foamParams.x threshold\r\n // and the coverage ramps in. Mirrors the FFT generator's foam.\r\n this.$l.val = pb.sub(pb.mul(pb.add(1, this.dxdx), pb.add(1, this.dzdz)), pb.mul(this.dxdz, this.dxdz));\r\n this.$l.foam = pb.abs(\r\n pb.pow(pb.neg(pb.min(0, pb.sub(this.val, this.foamParams.x))), this.foamParams.y)\r\n );\r\n this.$return(pb.vec4(this.outNormal, this.foam));\r\n });\r\n return scope.calcNormalAndFoam(xz) as PBShaderExp;\r\n }\r\n /** {@inheritDoc WaveGenerator.setupUniforms} */\r\n setupUniforms(scope: PBGlobalScope, uniformGroup: number) {\r\n const pb = scope.$builder;\r\n scope.numWaves = pb.float().uniform(uniformGroup);\r\n scope.waveParams = pb.vec4[MAX_GERSTNER_WAVE_COUNT * 2]().uniform(uniformGroup);\r\n scope.foamParams = pb.vec2().uniform(uniformGroup);\r\n }\r\n /** @internal */\r\n private gerstnerWave(\r\n scope: PBInsideFunctionScope,\r\n waveParam: PBShaderExp,\r\n omniParam: PBShaderExp,\r\n inPos: PBShaderExp,\r\n outNormal: PBShaderExp,\r\n outDxdx: PBShaderExp,\r\n outDzdz: PBShaderExp,\r\n outDxdz: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n pb.func(\r\n 'gerstnerWave',\r\n [\r\n pb.vec4('waveParam'),\r\n pb.vec4('omniParam'),\r\n pb.vec3('inPos'),\r\n pb.vec3('outNormal').out(),\r\n pb.float('outDxdx').out(),\r\n pb.float('outDzdz').out(),\r\n pb.float('outDxdz').out()\r\n ],\r\n function () {\r\n this.$l.amplitude = pb.max(this.waveParam.z, 0.01);\r\n this.$l.wavelength = this.waveParam.w;\r\n this.$l.omniPos = this.omniParam.xz;\r\n this.$l.omni = this.omniParam.w;\r\n this.$l.direction = pb.vec2(pb.sin(this.waveParam.x), pb.cos(this.waveParam.x));\r\n this.$l.w = pb.max(0.001, pb.div(Math.PI * 2, this.wavelength));\r\n this.$l.wSpeed = pb.sqrt(pb.mul(9.8, this.w));\r\n this.$l.peak = this.waveParam.y;\r\n this.$l.qi = pb.div(this.peak, pb.mul(this.amplitude, this.w, this.numWaves));\r\n this.$l.dirWaveInput = pb.mul(this.direction, pb.sub(1, this.omni));\r\n this.$l.omniWaveInput = pb.mul(pb.sub(this.inPos.xz, this.omniPos), this.omni);\r\n this.$l.windDir = pb.normalize(pb.add(this.dirWaveInput, this.omniWaveInput));\r\n this.$l.dir = pb.dot(this.windDir, pb.sub(this.inPos.xz, pb.mul(this.omniPos, this.omni)));\r\n this.$l.calc = pb.sub(\r\n pb.mul(this.dir, this.w),\r\n pb.mul(this.wSpeed, ShaderHelper.getElapsedTime(this))\r\n );\r\n this.$l.cosCalc = pb.cos(this.calc);\r\n this.$l.sinCalc = pb.sin(this.calc);\r\n this.$l.waveXZ = pb.mul(this.windDir.xy, this.qi, this.amplitude, this.cosCalc);\r\n this.$l.waveY = pb.div(pb.mul(this.sinCalc, this.amplitude), this.numWaves);\r\n this.$l.wave = pb.vec3(this.waveXZ.x, this.waveY, this.waveXZ.y);\r\n this.$l.wa = pb.mul(this.w, this.amplitude);\r\n this.$l.n = pb.vec3(\r\n pb.neg(pb.mul(this.windDir.xy, this.wa, this.cosCalc)),\r\n pb.sub(1, pb.mul(this.qi, this.wa, this.sinCalc))\r\n );\r\n this.outNormal = pb.div(this.n.xzy, this.numWaves);\r\n // Horizontal-gradient of the displacement, per wave. `waveXZ =\r\n // windDir.xy * qi * amp * cos`, and the derivative of `cos(calc)` w.r.t.\r\n // xz is `-w * sin(calc)`, so the gradient is the outer product of\r\n // `windDir.xy` with itself scaled by `-qi * wa * sin`. The sign matters:\r\n // at a crest (sin positive, cal near PI/2) the surface is compressed\r\n // horizontally, which is what pushes `det(I + J)` down and fires the\r\n // fold signal. Summed over waves and run through det(I + J), this is the\r\n // same Jacobian criterion the FFT generator uses.\r\n this.$l.jac = pb.neg(pb.mul(this.qi, this.wa, this.sinCalc));\r\n this.outDxdx = pb.mul(this.jac, this.windDir.x, this.windDir.x);\r\n this.outDzdz = pb.mul(this.jac, this.windDir.y, this.windDir.y);\r\n this.outDxdz = pb.mul(this.jac, this.windDir.x, this.windDir.y);\r\n this.$return(pb.mul(this.wave, pb.clamp(pb.mul(this.amplitude, 10000), 0, 1)));\r\n }\r\n );\r\n return scope.gerstnerWave(\r\n waveParam,\r\n omniParam,\r\n inPos,\r\n outNormal,\r\n outDxdx,\r\n outDzdz,\r\n outDxdz\r\n ) as PBShaderExp;\r\n }\r\n /** @internal */\r\n private calcNormalAndPos(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n 'calcPositionAndNormal',\r\n [pb.vec3('inPos'), pb.vec3('outPos').out(), pb.vec3('outNormal').out()],\r\n function () {\r\n this.outPos = this.inPos;\r\n this.outNormal = pb.vec3(0);\r\n this.$for(\r\n pb.float('i'),\r\n 0,\r\n pb.getDevice().type === 'webgl' ? MAX_GERSTNER_WAVE_COUNT : this.numWaves,\r\n function () {\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$if(pb.greaterThanEqual(this.i, this.numWaves), function () {\r\n this.$break();\r\n });\r\n }\r\n this.$l.waveNormal = pb.vec3();\r\n this.$l.waveDxdx = pb.float();\r\n this.$l.waveDzdz = pb.float();\r\n this.$l.waveDxdz = pb.float();\r\n this.$l.wavePos = that.gerstnerWave(\r\n this,\r\n this.waveParams.at(pb.mul(this.i, 2)),\r\n this.waveParams.at(pb.add(pb.mul(this.i, 2), 1)),\r\n this.inPos,\r\n this.waveNormal,\r\n this.waveDxdx,\r\n this.waveDzdz,\r\n this.waveDxdz\r\n );\r\n this.outPos = pb.add(this.outPos, this.wavePos);\r\n this.outNormal = pb.add(this.outNormal, this.waveNormal);\r\n }\r\n );\r\n }\r\n );\r\n scope.calcPositionAndNormal(inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcVertexPositionAndNormal} */\r\n calcVertexPositionAndNormal(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n this.calcNormalAndPos(scope, inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.applyWaterBindGroup} */\r\n applyWaterBindGroup(bindGroup: BindGroup) {\r\n bindGroup.setValue('numWaves', this._numWaves);\r\n bindGroup.setValue('waveParams', this._waveParams);\r\n bindGroup.setValue('foamParams', this._foamParams);\r\n }\r\n /** {@inheritDoc WaveGenerator.isOk} */\r\n isOk() {\r\n return true;\r\n }\r\n /** {@inheritDoc WaveGenerator.getHash} */\r\n getHash() {\r\n return 'GerstnerWaveGenerator';\r\n }\r\n}\r\n"],"names":["GerstnerWaveGenerator","Disposable","_version","_waveParams","_numWaves","_rand","_foamParams","randomSeed","Float32Array","MAX_GERSTNER_WAVE_COUNT","PRNG","randomWave","randomWaveData","rand","array","offset","get","Math","PI","setRaw","data","index","set","clone","other","numWaves","version","val","Number","isInteger","console","error","i","deleteWave","j","insertWave","setWaveDirection","waveIndex","angle","getWaveDirection","setWaveSteepness","steepness","getWaveSteepness","setWaveAmplitude","getWaveAmplitude","setWaveLength","getWaveLength","isOmniWave","setOmniWave","isOmni","foamWidth","foamContrast","getOriginX","getOriginZ","setOrigin","x","z","update","needUpdate","calcClipmapTileAABB","minX","maxX","minZ","maxZ","y","outAABB","maxHeight","h","minPoint","setXYZ","maxPoint","calcFragmentNormal","scope","xz","_vertexNormal","pb","$builder","that","func","vec2","$l","inPos","vec3","outPos","outNormal","calcNormalAndPos","$return","calcFragmentNormalAndFoam","dxdx","float","dzdz","dxdz","$for","getDevice","type","$if","greaterThanEqual","$break","waveNormal","waveDxdx","waveDzdz","waveDxdz","wavePos","gerstnerWave","waveParams","at","mul","add","sub","foam","abs","pow","neg","min","foamParams","vec4","calcNormalAndFoam","setupUniforms","uniformGroup","uniform","waveParam","omniParam","outDxdx","outDzdz","outDxdz","out","amplitude","max","wavelength","w","omniPos","omni","direction","sin","cos","div","wSpeed","sqrt","peak","qi","dirWaveInput","omniWaveInput","windDir","normalize","dir","dot","calc","ShaderHelper","getElapsedTime","cosCalc","sinCalc","waveXZ","xy","waveY","wave","wa","n","xzy","jac","clamp","calcPositionAndNormal","calcVertexPositionAndNormal","applyWaterBindGroup","bindGroup","setValue","isOk","getHash"],"mappings":"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"}
1
+ {"version":3,"file":"gerstner_wavegenerator.js","sources":["../../src/render/gerstner_wavegenerator.ts"],"sourcesContent":["import { Disposable, PRNG, type AABB } from '@zephyr3d/base';\r\nimport type { WaveGenerator } from './wavegenerator';\r\nimport type { BindGroup, PBGlobalScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { ShaderHelper } from '../material';\r\nimport { MAX_GERSTNER_WAVE_COUNT } from '../values';\r\n\r\n/**\r\n * Gerstner wave generator.\r\n * @public\r\n */\r\nexport class GerstnerWaveGenerator extends Disposable implements WaveGenerator {\r\n private _version: number;\r\n private _waveParams: Float32Array<ArrayBuffer>;\r\n private _numWaves: number;\r\n private _rand: PRNG;\r\n private readonly _foamParams: Float32Array<ArrayBuffer>;\r\n /**\r\n * Creates a new Gerstner wave generator.\r\n */\r\n constructor(randomSeed = 0) {\r\n super();\r\n this._waveParams = new Float32Array(8 * MAX_GERSTNER_WAVE_COUNT);\r\n this._rand = new PRNG(randomSeed);\r\n this.randomWave(0);\r\n this.randomWave(1);\r\n this.randomWave(2);\r\n this.randomWave(3);\r\n this._numWaves = 4;\r\n this._version = 0;\r\n // Same defaults as the FFT generator.\r\n this._foamParams = new Float32Array([1.2, 7.2]);\r\n }\r\n /** @internal */\r\n static randomWaveData(rand: PRNG, array: Float32Array, offset: number) {\r\n array[offset + 0] = rand.get() * Math.PI * 2;\r\n array[offset + 1] = rand.get() * 0.5 + 0.5;\r\n array[offset + 2] = rand.get() * 0.1;\r\n array[offset + 3] = rand.get() * 10;\r\n array[offset + 4] = rand.get() * 100 - 50;\r\n array[offset + 5] = 0;\r\n array[offset + 6] = rand.get() * 100 - 50;\r\n array[offset + 7] = 0;\r\n }\r\n /** @internal */\r\n setRaw(data: Float32Array, index: number) {\r\n this._waveParams.set(data, index * 8);\r\n }\r\n clone() {\r\n const other = new GerstnerWaveGenerator();\r\n other.numWaves = this.numWaves;\r\n other._waveParams.set(this._waveParams);\r\n other._foamParams.set(this._foamParams);\r\n return other as this;\r\n }\r\n get rand() {\r\n return this._rand;\r\n }\r\n get version() {\r\n return this._version;\r\n }\r\n /** Gets the number of waves. */\r\n get numWaves() {\r\n return this._numWaves;\r\n }\r\n set numWaves(val) {\r\n if (!Number.isInteger(val) || val <= 0 || val > MAX_GERSTNER_WAVE_COUNT) {\r\n console.error(`Invalid wave number: ${val}`);\r\n return;\r\n }\r\n if (val !== this._numWaves) {\r\n for (let i = this._numWaves; i < val; i++) {\r\n this.randomWave(i);\r\n }\r\n this._numWaves = val;\r\n this._version++;\r\n }\r\n }\r\n /** Delete wave at index */\r\n deleteWave(index: number) {\r\n if (index < 0 || index >= this._numWaves) {\r\n return;\r\n }\r\n for (let i = index; i < this._numWaves - 1; i++) {\r\n for (let j = 0; j < 8; j++) {\r\n this._waveParams[i * 8 + j] = this._waveParams[(i + 1) * 8 + j];\r\n }\r\n }\r\n this._numWaves--;\r\n this._version++;\r\n }\r\n /** Insert a wave slot at index, shifting the subsequent waves up */\r\n insertWave(index: number) {\r\n // Bounded by the parameter buffer; the shader reads this many slots.\r\n if (this._numWaves >= MAX_GERSTNER_WAVE_COUNT) {\r\n return;\r\n }\r\n // Shift from the tail backwards so the gap opens at `index`. The new slot\r\n // gets a random valid wave: a zero wavelength makes `w = 2*PI / length`\r\n // infinite and drives the vertex shader into NaN.\r\n for (let i = this._numWaves - 1; i >= index; i--) {\r\n for (let j = 0; j < 8; j++) {\r\n this._waveParams[(i + 1) * 8 + j] = this._waveParams[i * 8 + j];\r\n }\r\n }\r\n this.randomWave(index);\r\n this._numWaves++;\r\n this._version++;\r\n }\r\n /**\r\n * Sets the angle of the wave direction in radians.\r\n * @param waveIndex - index of the wave to set.\r\n * @param angle - angle of the wave direction in radians.\r\n */\r\n setWaveDirection(waveIndex: number, angle: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 0] = angle;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the angle of the wave direction in radians.\r\n * @param waveIndex - index of the wave to get.\r\n * @returns Angle of the wave direction in radians.\r\n */\r\n getWaveDirection(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 0] : 0;\r\n }\r\n /**\r\n * Sets the steepness of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param steepness - Steepness of the wave.\r\n */\r\n setWaveSteepness(waveIndex: number, steepness: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 1] = steepness;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the steepness of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Steepness of the wave.\r\n */\r\n getWaveSteepness(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 1] : 0;\r\n }\r\n /**\r\n * Sets the amplitude of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param val - Amplitude of the wave.\r\n */\r\n setWaveAmplitude(waveIndex: number, val: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 2] = val;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the amplitude of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Amplitude of the wave.\r\n */\r\n getWaveAmplitude(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 2] : 0;\r\n }\r\n /**\r\n * Sets the length of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param val - Length of the wave.\r\n */\r\n setWaveLength(waveIndex: number, val: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 3] = val;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the length of the wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Length of the wave.\r\n */\r\n getWaveLength(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 3] : 0;\r\n }\r\n /**\r\n * Query if the wave is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns true if the wave is an omni-directional wave, false otherwise.\r\n */\r\n isOmniWave(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 7] !== 0 : false;\r\n }\r\n /**\r\n * Sets whether the wave is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param isOmni - true if the wave is an omni-directional wave, false otherwise.\r\n */\r\n setOmniWave(waveIndex: number, isOmni: boolean) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 7] = isOmni ? 1 : 0;\r\n this._version++;\r\n }\r\n }\r\n /** Gets the foam width. */\r\n get foamWidth() {\r\n return this._foamParams[0];\r\n }\r\n set foamWidth(val) {\r\n if (val !== this._foamParams[0]) {\r\n this._foamParams[0] = val;\r\n this._version++;\r\n }\r\n }\r\n /** Gets the foam contrast. */\r\n get foamContrast() {\r\n return this._foamParams[1];\r\n }\r\n set foamContrast(val) {\r\n if (val !== this._foamParams[1]) {\r\n this._foamParams[1] = val;\r\n this._version++;\r\n }\r\n }\r\n /**\r\n * Gets the X coordinate of the wave origin if it is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns X coordinate of the wave origin if it is an omni-directional wave, 0 otherwise.\r\n */\r\n getOriginX(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 4] : 0;\r\n }\r\n /**\r\n * Gets the Z coordinate of the wave origin if it is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @returns Z coordinate of the wave origin if it is an omni-directional wave, 0 otherwise.\r\n */\r\n getOriginZ(waveIndex: number) {\r\n return waveIndex < MAX_GERSTNER_WAVE_COUNT ? this._waveParams[waveIndex * 8 + 6] : 0;\r\n }\r\n /**\r\n * Sets the X and Z coordinates of the wave origin if it is an omni-directional wave.\r\n * @param waveIndex - index of the wave to set.\r\n * @param x - X coordinate of the wave origin\r\n * @param z - Z coordinate of the wave origin\r\n */\r\n setOrigin(waveIndex: number, x: number, z: number) {\r\n if (waveIndex < MAX_GERSTNER_WAVE_COUNT) {\r\n this._waveParams[waveIndex * 8 + 4] = x;\r\n this._waveParams[waveIndex * 8 + 6] = z;\r\n this._version++;\r\n }\r\n }\r\n /** @internal */\r\n randomWave(i: number) {\r\n GerstnerWaveGenerator.randomWaveData(this._rand, this._waveParams, i * 8);\r\n }\r\n /** {@inheritDoc WaveGenerator.update} */\r\n update() {}\r\n /** {@inheritDoc WaveGenerator.needUpdate} */\r\n needUpdate() {\r\n return false;\r\n }\r\n /** {@inheritDoc WaveGenerator.calcClipmapTileAABB} */\r\n calcClipmapTileAABB(minX: number, maxX: number, minZ: number, maxZ: number, y: number, outAABB: AABB) {\r\n let maxHeight = 0;\r\n for (let i = 0; i < this._numWaves; i++) {\r\n const h = this._waveParams[i * 8 + 2];\r\n if (h > maxHeight) {\r\n maxHeight = h;\r\n }\r\n }\r\n outAABB.minPoint.setXYZ(minX, y, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, y + maxHeight, maxZ);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormal} */\r\n calcFragmentNormal(scope: PBInsideFunctionScope, xz: PBShaderExp, _vertexNormal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('calcFragmentNormal', [pb.vec2('xz')], function () {\r\n this.$l.inPos = pb.vec3(this.xz.x, 0, this.xz.y);\r\n this.$l.outPos = pb.vec3();\r\n this.$l.outNormal = pb.vec3();\r\n that.calcNormalAndPos(this, this.inPos, this.outPos, this.outNormal);\r\n this.$return(this.outNormal);\r\n });\r\n return scope.calcFragmentNormal(xz) as PBShaderExp;\r\n }\r\n /** {@inheritDoc WaveGenerator.calcFragmentNormalAndFoam} */\r\n calcFragmentNormalAndFoam(scope: PBInsideFunctionScope, xz: PBShaderExp, _vertexNormal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('calcNormalAndFoam', [pb.vec2('xz')], function () {\r\n this.$l.inPos = pb.vec3(this.xz.x, 0, this.xz.y);\r\n this.$l.outPos = pb.vec3();\r\n this.$l.outNormal = pb.vec3(0);\r\n // Horizontal-gradient terms summed over the waves, for det(I + J), the\r\n // fold signal the foam is derived from (same as the FFT generator).\r\n this.$l.dxdx = pb.float(0);\r\n this.$l.dzdz = pb.float(0);\r\n this.$l.dxdz = pb.float(0);\r\n this.$for(pb.float('i'), 0, this.numWaves, function () {\r\n this.$l.waveNormal = pb.vec3();\r\n this.$l.waveDxdx = pb.float();\r\n this.$l.waveDzdz = pb.float();\r\n this.$l.waveDxdz = pb.float();\r\n this.$l.wavePos = that.gerstnerWave(\r\n this,\r\n this.waveParams.at(pb.mul(this.i, 2)),\r\n this.waveParams.at(pb.add(pb.mul(this.i, 2), 1)),\r\n this.inPos,\r\n this.waveNormal,\r\n this.waveDxdx,\r\n this.waveDzdz,\r\n this.waveDxdz\r\n );\r\n this.outPos = pb.add(this.outPos, this.wavePos);\r\n this.outNormal = pb.add(this.outNormal, this.waveNormal);\r\n this.dxdx = pb.add(this.dxdx, this.waveDxdx);\r\n this.dzdz = pb.add(this.dzdz, this.waveDzdz);\r\n this.dxdz = pb.add(this.dxdz, this.waveDxdz);\r\n });\r\n // Jacobian determinant of the horizontal displacement, det(I + J); below\r\n // the foamParams.x threshold the surface folds and foam ramps in.\r\n this.$l.val = pb.sub(pb.mul(pb.add(1, this.dxdx), pb.add(1, this.dzdz)), pb.mul(this.dxdz, this.dxdz));\r\n this.$l.foam = pb.abs(\r\n pb.pow(pb.neg(pb.min(0, pb.sub(this.val, this.foamParams.x))), this.foamParams.y)\r\n );\r\n this.$return(pb.vec4(this.outNormal, this.foam));\r\n });\r\n return scope.calcNormalAndFoam(xz) as PBShaderExp;\r\n }\r\n /** {@inheritDoc WaveGenerator.setupUniforms} */\r\n setupUniforms(scope: PBGlobalScope, uniformGroup: number) {\r\n const pb = scope.$builder;\r\n scope.numWaves = pb.float().uniform(uniformGroup);\r\n scope.waveParams = pb.vec4[MAX_GERSTNER_WAVE_COUNT * 2]().uniform(uniformGroup);\r\n scope.foamParams = pb.vec2().uniform(uniformGroup);\r\n }\r\n /** @internal */\r\n private gerstnerWave(\r\n scope: PBInsideFunctionScope,\r\n waveParam: PBShaderExp,\r\n omniParam: PBShaderExp,\r\n inPos: PBShaderExp,\r\n outNormal: PBShaderExp,\r\n outDxdx: PBShaderExp,\r\n outDzdz: PBShaderExp,\r\n outDxdz: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n pb.func(\r\n 'gerstnerWave',\r\n [\r\n pb.vec4('waveParam'),\r\n pb.vec4('omniParam'),\r\n pb.vec3('inPos'),\r\n pb.vec3('outNormal').out(),\r\n pb.float('outDxdx').out(),\r\n pb.float('outDzdz').out(),\r\n pb.float('outDxdz').out()\r\n ],\r\n function () {\r\n this.$l.amplitude = pb.max(this.waveParam.z, 0.01);\r\n this.$l.wavelength = this.waveParam.w;\r\n this.$l.omniPos = this.omniParam.xz;\r\n this.$l.omni = this.omniParam.w;\r\n this.$l.direction = pb.vec2(pb.sin(this.waveParam.x), pb.cos(this.waveParam.x));\r\n this.$l.w = pb.max(0.001, pb.div(Math.PI * 2, this.wavelength));\r\n this.$l.wSpeed = pb.sqrt(pb.mul(9.8, this.w));\r\n this.$l.peak = this.waveParam.y;\r\n this.$l.qi = pb.div(this.peak, pb.mul(this.amplitude, this.w, this.numWaves));\r\n this.$l.dirWaveInput = pb.mul(this.direction, pb.sub(1, this.omni));\r\n this.$l.omniWaveInput = pb.mul(pb.sub(this.inPos.xz, this.omniPos), this.omni);\r\n this.$l.windDir = pb.normalize(pb.add(this.dirWaveInput, this.omniWaveInput));\r\n this.$l.dir = pb.dot(this.windDir, pb.sub(this.inPos.xz, pb.mul(this.omniPos, this.omni)));\r\n this.$l.calc = pb.sub(\r\n pb.mul(this.dir, this.w),\r\n pb.mul(this.wSpeed, ShaderHelper.getElapsedTime(this))\r\n );\r\n this.$l.cosCalc = pb.cos(this.calc);\r\n this.$l.sinCalc = pb.sin(this.calc);\r\n this.$l.waveXZ = pb.mul(this.windDir.xy, this.qi, this.amplitude, this.cosCalc);\r\n this.$l.waveY = pb.div(pb.mul(this.sinCalc, this.amplitude), this.numWaves);\r\n this.$l.wave = pb.vec3(this.waveXZ.x, this.waveY, this.waveXZ.y);\r\n this.$l.wa = pb.mul(this.w, this.amplitude);\r\n this.$l.n = pb.vec3(\r\n pb.neg(pb.mul(this.windDir.xy, this.wa, this.cosCalc)),\r\n pb.sub(1, pb.mul(this.qi, this.wa, this.sinCalc))\r\n );\r\n this.outNormal = pb.div(this.n.xzy, this.numWaves);\r\n // Horizontal gradient of the displacement `windDir.xy * qi * amp * cos`:\r\n // the outer product of `windDir.xy` with itself scaled by `-qi * wa * sin`.\r\n // At a crest the surface is compressed, pushing det(I + J) down.\r\n this.$l.jac = pb.neg(pb.mul(this.qi, this.wa, this.sinCalc));\r\n this.outDxdx = pb.mul(this.jac, this.windDir.x, this.windDir.x);\r\n this.outDzdz = pb.mul(this.jac, this.windDir.y, this.windDir.y);\r\n this.outDxdz = pb.mul(this.jac, this.windDir.x, this.windDir.y);\r\n this.$return(pb.mul(this.wave, pb.clamp(pb.mul(this.amplitude, 10000), 0, 1)));\r\n }\r\n );\r\n return scope.gerstnerWave(\r\n waveParam,\r\n omniParam,\r\n inPos,\r\n outNormal,\r\n outDxdx,\r\n outDzdz,\r\n outDxdz\r\n ) as PBShaderExp;\r\n }\r\n /** @internal */\r\n private calcNormalAndPos(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n 'calcPositionAndNormal',\r\n [pb.vec3('inPos'), pb.vec3('outPos').out(), pb.vec3('outNormal').out()],\r\n function () {\r\n this.outPos = this.inPos;\r\n this.outNormal = pb.vec3(0);\r\n this.$for(pb.float('i'), 0, this.numWaves, function () {\r\n this.$l.waveNormal = pb.vec3();\r\n this.$l.waveDxdx = pb.float();\r\n this.$l.waveDzdz = pb.float();\r\n this.$l.waveDxdz = pb.float();\r\n this.$l.wavePos = that.gerstnerWave(\r\n this,\r\n this.waveParams.at(pb.mul(this.i, 2)),\r\n this.waveParams.at(pb.add(pb.mul(this.i, 2), 1)),\r\n this.inPos,\r\n this.waveNormal,\r\n this.waveDxdx,\r\n this.waveDzdz,\r\n this.waveDxdz\r\n );\r\n this.outPos = pb.add(this.outPos, this.wavePos);\r\n this.outNormal = pb.add(this.outNormal, this.waveNormal);\r\n });\r\n }\r\n );\r\n scope.calcPositionAndNormal(inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.calcVertexPositionAndNormal} */\r\n calcVertexPositionAndNormal(\r\n scope: PBInsideFunctionScope,\r\n inPos: PBShaderExp,\r\n outPos: PBShaderExp,\r\n outNormal: PBShaderExp\r\n ) {\r\n this.calcNormalAndPos(scope, inPos, outPos, outNormal);\r\n }\r\n /** {@inheritDoc WaveGenerator.applyWaterBindGroup} */\r\n applyWaterBindGroup(bindGroup: BindGroup) {\r\n bindGroup.setValue('numWaves', this._numWaves);\r\n bindGroup.setValue('waveParams', this._waveParams);\r\n bindGroup.setValue('foamParams', this._foamParams);\r\n }\r\n /** {@inheritDoc WaveGenerator.isOk} */\r\n isOk() {\r\n return true;\r\n }\r\n /** {@inheritDoc WaveGenerator.getHash} */\r\n getHash() {\r\n return 'GerstnerWaveGenerator';\r\n }\r\n}\r\n"],"names":["GerstnerWaveGenerator","Disposable","_version","_waveParams","_numWaves","_rand","_foamParams","randomSeed","Float32Array","MAX_GERSTNER_WAVE_COUNT","PRNG","randomWave","randomWaveData","rand","array","offset","get","Math","PI","setRaw","data","index","set","clone","other","numWaves","version","val","Number","isInteger","console","error","i","deleteWave","j","insertWave","setWaveDirection","waveIndex","angle","getWaveDirection","setWaveSteepness","steepness","getWaveSteepness","setWaveAmplitude","getWaveAmplitude","setWaveLength","getWaveLength","isOmniWave","setOmniWave","isOmni","foamWidth","foamContrast","getOriginX","getOriginZ","setOrigin","x","z","update","needUpdate","calcClipmapTileAABB","minX","maxX","minZ","maxZ","y","outAABB","maxHeight","h","minPoint","setXYZ","maxPoint","calcFragmentNormal","scope","xz","_vertexNormal","pb","$builder","that","func","vec2","$l","inPos","vec3","outPos","outNormal","calcNormalAndPos","$return","calcFragmentNormalAndFoam","dxdx","float","dzdz","dxdz","$for","waveNormal","waveDxdx","waveDzdz","waveDxdz","wavePos","gerstnerWave","waveParams","at","mul","add","sub","foam","abs","pow","neg","min","foamParams","vec4","calcNormalAndFoam","setupUniforms","uniformGroup","uniform","waveParam","omniParam","outDxdx","outDzdz","outDxdz","out","amplitude","max","wavelength","w","omniPos","omni","direction","sin","cos","div","wSpeed","sqrt","peak","qi","dirWaveInput","omniWaveInput","windDir","normalize","dir","dot","calc","ShaderHelper","getElapsedTime","cosCalc","sinCalc","waveXZ","xy","waveY","wave","wa","n","xzy","jac","clamp","calcPositionAndNormal","calcVertexPositionAndNormal","applyWaterBindGroup","bindGroup","setValue","isOk","getHash"],"mappings":"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"}