@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":"grass_gpu.js","sources":["../../../src/scene/terrain-cm/grass_gpu.ts"],"sourcesContent":["import type {\r\n BindGroup,\r\n GPUDataBuffer,\r\n GPUProgram,\r\n IndexBuffer,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n StructuredBuffer,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { DEBUG_VIEWS, Disposable, DRef, nextPowerOf2, Vector3, Vector4 } from '@zephyr3d/base';\r\nimport type { Camera } from '../../camera';\r\nimport { Primitive } from '../../render';\r\nimport { getDevice } from '../../app/api';\r\nimport { fetchSampler } from '../../utility/misc';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\nimport { WindField } from '../wind';\r\n\r\nconst WORKGROUP_SIZE = 8;\r\n/**\r\n * Largest placement window side, in cells. Bounds the per-frame work and the instance buffer\r\n * when the draw distance is unlimited or the cells are tiny.\r\n */\r\nconst MAX_WINDOW_CELLS = 2048;\r\n/**\r\n * Width of the band, in density LOD hash units, over which a blade shrinks before the density\r\n * LOD drops it. Hashes are scaled into [0, 1 - band) so that full density keeps every blade whole.\r\n * @internal\r\n */\r\nexport const GRASS_LOD_FADE_BAND = 0.05;\r\n/** Fraction of the draw distance at which the density starts to fall */\r\nconst GRASS_LOD_START = 0.25;\r\n/**\r\n * Density LOD parameters shared by the grass material and the GPU placement: (distance at which\r\n * the density starts to fall, fraction of blades kept at the draw distance). A fraction of 1\r\n * disables it.\r\n * @internal\r\n */\r\nexport function grassDensityLod(drawDistance: number, farDensity: number): [number, number] {\r\n if (drawDistance <= 0 || farDensity >= 1) {\r\n return [0, 1];\r\n }\r\n return [drawDistance * GRASS_LOD_START, Math.max(0.01, farDensity)];\r\n}\r\n/**\r\n * Kind of blades a grass layer draws: textured cards, or procedural Bezier blades (WebGPU only)\r\n * @public\r\n */\r\nexport type GrassLayerKind = 'card' | 'blade';\r\n/** Vec4 per instance written by the placement pass for each layer kind */\r\nconst INSTANCE_VEC4: Record<GrassLayerKind, number> = { card: 1, blade: 4 };\r\n/** Seed offset of the procedural blade hashes, clear of the card hashes of every layer */\r\nconst BLADE_SEED_BASE = 65536;\r\n/** Number of floats in GrassBladeShape */\r\nexport const GRASS_BLADE_SHAPE_SIZE = 16;\r\n/**\r\n * Procedural blade parameters sent to the placement pass, 16 floats:\r\n * - [0, 8): height, height randomness, width, width randomness, tilt, tilt randomness, bend,\r\n * bend randomness. Height and width randomness are fractions of the base value, tilt and bend\r\n * randomness absolute amounts, each applied as base + randomness * [-1, 1).\r\n * - [8, 13): clump size, clump height variation, pull toward the clump point, same direction\r\n * within a clump, facing away from the clump point.\r\n * - [13, 15): how far the wind turns the blades downwind per unit of push, sway amplitude (as a\r\n * fraction of the height, only used to pad the culling bounds).\r\n * - [15]: distance at which blades switch to the low detail level, see grassBladeLodDistance.\r\n * @internal\r\n */\r\nexport type GrassBladeShape = Float32Array<ArrayBuffer>;\r\n/**\r\n * Fraction of the low detail distance over which the near blades make way for the far ones:\r\n * three in four shrink away, the fourth widens and morphs into the low detail shape. The same\r\n * last-quarter band as the draw distance fade.\r\n * @internal\r\n */\r\nexport const GRASS_BLADE_LOD_BAND = 0.25;\r\n/** Stand-in for an unlimited distance in shader uniforms */\r\nconst NO_LIMIT = 1e30;\r\n/**\r\n * Distance at which procedural blades switch to the low detail level, or NO_LIMIT when they never\r\n * do: zero disables the low detail level, and so does a distance past the draw distance.\r\n * @internal\r\n */\r\nexport function grassBladeLodDistance(lodDistance: number, drawDistance: number) {\r\n return lodDistance > 0 && (drawDistance <= 0 || lodDistance < drawDistance) ? lodDistance : NO_LIMIT;\r\n}\r\n/**\r\n * Number of culling planes of the placement pass: the six of a view frustum, or up to the twelve\r\n * of a shadow caster culling volume (see GrassRenderer). Unused ones are planes everything is\r\n * inside of.\r\n * @internal\r\n */\r\nexport const GRASS_CULL_PLANES = 12;\r\n/** Samples along the line of sight of the terrain occlusion test, one per workgroup thread */\r\nconst OCCLUSION_SAMPLES = WORKGROUP_SIZE * WORKGROUP_SIZE;\r\n\r\n/**\r\n * Terrain occlusion culling mode of the GPU grass placement\r\n * @internal\r\n */\r\nexport const GrassOcclusionMode = {\r\n Off: 0,\r\n Cull: 1,\r\n /** Keep occluded blades but flag them, see ClipmapGrassMaterial.occlusionDebug */\r\n Debug: 2\r\n} as const;\r\n/** @internal */\r\nexport type GrassOcclusionMode = (typeof GrassOcclusionMode)[keyof typeof GrassOcclusionMode];\r\n\r\n/**\r\n * Grass blade placement hash, shared by the CPU and GPU paths.\r\n *\r\n * Returns a value in [0, 1) with 24 bits of precision: that is all a float32 can hold, so\r\n * keeping the CPU side to the same bits makes both paths place exactly the same blades.\r\n *\r\n * @internal\r\n */\r\nexport function grassHash(x: number, z: number, seed: number): number {\r\n let h = (Math.imul(x, 0x27d4eb2d) ^ Math.imul(z, 0x165667b1) ^ Math.imul(seed, 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 >>> 8) / 16777216;\r\n}\r\n\r\n/**\r\n * Output of one placement: the blade lists and their draw arguments, with the bind group and\r\n * the primitive that read them\r\n */\r\ntype PlacementTarget = {\r\n instanceBuffer: DRef<GPUDataBuffer>;\r\n argsBuffer: DRef<GPUDataBuffer>;\r\n /** Arguments of the same draws for the wireframe edges, with debug views only */\r\n edgeArgsBuffer: DRef<GPUDataBuffer>;\r\n bindGroup: DRef<BindGroup>;\r\n primitive: DRef<Primitive>;\r\n capacity: number;\r\n};\r\n\r\n/**\r\n * GPU placement and culling of the blades of one grass layer (WebGPU with indirect draw only).\r\n *\r\n * Blade placement is procedural - a hash per placement cell and a bilinear density lookup - so\r\n * instead of keeping instances for the whole terrain, a compute pass evaluates the cells around\r\n * the camera every frame, keeps the blades inside the frustum and the draw distance, and appends\r\n * them to an instance buffer whose count lands in an indirect draw argument buffer.\r\n *\r\n * The output uses the instance format of the CPU path (u, v, facing angle, density LOD hash), so the grass material\r\n * is shared. Each dispatched thread emits at most one blade and the instance buffer holds one\r\n * per thread, so the output can never overflow.\r\n *\r\n * Procedural blades have two detail levels, after \"Procedural Grass in Ghost of Tsushima\"\r\n * (Wohllaib, GDC 2021): low detail blades are spaced twice as far apart, and the high detail\r\n * blades thin out by three quarters before the switch so the two meet seamlessly. Here the\r\n * dispatch has two layers: z = 0 places a blade per cell around the camera, up to the low detail\r\n * distance, into the high detail list; z = 1 places one blade per 2x2 block of cells beyond it\r\n * into the low detail list. The blade kept for a block is one of its four cells picked by a\r\n * hash, placed exactly as the near layer places it, so a blade moving from one list to the other\r\n * stays where it is. Both lists share the instance buffer, the low one from `lowListBase` on,\r\n * and each has its own indirect draw arguments.\r\n *\r\n * Placements go to numbered targets, each with its own lists: target 0 holds the blades seen\r\n * from the camera, the others the blades casting shadows into a shadow map. A shadow target is\r\n * placed around the same camera, so it picks the same blades at the same detail levels, but\r\n * culls them by the volume the shadow casters can be in instead of the view frustum.\r\n *\r\n * @internal\r\n */\r\nexport class GrassGpuPlacement extends Disposable {\r\n private static readonly _programs: Partial<Record<GrassLayerKind, GPUProgram>> = {};\r\n private static readonly _cameraPos = new Vector3();\r\n private static readonly _planes = new Float32Array(GRASS_CULL_PLANES * 4);\r\n private readonly _densityTexture: DRef<Texture2D>;\r\n private readonly _kind: GrassLayerKind;\r\n private readonly _targets: PlacementTarget[];\r\n private readonly _baseVertexBuffer: DRef<StructuredBuffer>;\r\n private readonly _shape0: Vector4;\r\n private readonly _shape1: Vector4;\r\n private readonly _clump0: Vector4;\r\n private readonly _clump1: Vector4;\r\n private static readonly _calmWind = new Float32Array(32);\r\n private readonly _indexBuffer: DRef<IndexBuffer>;\r\n private readonly _args: Uint32Array<ArrayBuffer>;\r\n /** Index count of each detail level; they follow each other in the index buffer */\r\n private readonly _lodIndexCounts: number[];\r\n private readonly _window: Vector4;\r\n /** Far window, in 2x2 blocks of cells (procedural blades only) */\r\n private readonly _window2: Vector4;\r\n /** (low detail distance, first instance of the low detail list, shadow fade start, 1 / fade length) */\r\n private readonly _lod: Vector4;\r\n /** Camera forward axis and offset, see generate() */\r\n private readonly _viewDepth: Vector4;\r\n private static readonly _forward = new Vector3();\r\n private readonly _cells: Vector4;\r\n private readonly _params: Vector4;\r\n private readonly _posScale: Vector4;\r\n private readonly _camera: Vector4;\r\n private readonly _occlusion: Vector4;\r\n private readonly _heightInfo: Vector4;\r\n private readonly _densityLod: Vector4;\r\n /**\r\n * Whether the current device can run the GPU path\r\n */\r\n static isSupported() {\r\n const device = getDevice();\r\n return device.type === 'webgpu' && device.getDeviceCaps().miscCaps.supportDrawIndirect;\r\n }\r\n /**\r\n * @param kind - Kind of blades placed\r\n * @param baseVertexBuffer - Vertex buffer of the drawn blade. Procedural blades read nothing\r\n * from it; a draw still needs a vertex layout.\r\n * @param indexBuffer - Index buffer of the drawn blade\r\n * @param lodIndexCounts - Index count of each detail level, which follow each other in the index\r\n * buffer. Procedural blades have two; defaults to the whole buffer as one level.\r\n */\r\n constructor(\r\n kind: GrassLayerKind,\r\n baseVertexBuffer: StructuredBuffer,\r\n indexBuffer: IndexBuffer,\r\n lodIndexCounts?: number[]\r\n ) {\r\n super();\r\n this._kind = kind;\r\n this._lodIndexCounts = lodIndexCounts ?? [indexBuffer.length];\r\n this._shape0 = new Vector4();\r\n this._shape1 = new Vector4();\r\n this._clump0 = new Vector4();\r\n this._clump1 = new Vector4();\r\n this._densityTexture = new DRef();\r\n this._targets = [];\r\n this._baseVertexBuffer = new DRef(baseVertexBuffer);\r\n this._indexBuffer = new DRef(indexBuffer);\r\n // Five draw arguments per detail level, then with debug views the same for the wireframe edges\r\n this._args = new Uint32Array(this._lodIndexCounts.length * 5 * (DEBUG_VIEWS ? 2 : 1));\r\n this._window = new Vector4();\r\n this._window2 = new Vector4();\r\n this._lod = new Vector4();\r\n this._viewDepth = new Vector4();\r\n this._cells = new Vector4();\r\n this._params = new Vector4();\r\n this._posScale = new Vector4();\r\n this._camera = new Vector4();\r\n this._occlusion = new Vector4();\r\n this._heightInfo = new Vector4();\r\n this._densityLod = new Vector4();\r\n }\r\n setBaseVertexBuffer(baseVertexBuffer: StructuredBuffer) {\r\n if (baseVertexBuffer !== this._baseVertexBuffer.get()) {\r\n this._baseVertexBuffer.set(baseVertexBuffer);\r\n for (const target of this._targets) {\r\n target.primitive.dispose();\r\n }\r\n }\r\n }\r\n /**\r\n * Uploads the whole density map, recreating the texture when its size changed\r\n * @param width - Density map width in texels\r\n * @param height - Density map height in texels\r\n * @param data - Density data, one byte per texel\r\n */\r\n setDensity(width: number, height: number, data: Uint8Array) {\r\n let tex = this._densityTexture.get();\r\n if (!tex || tex.width !== width || tex.height !== height) {\r\n tex = getDevice().createTexture2D('r8unorm', width, height, { mipmapping: false })!;\r\n tex.name = 'GrassDensity';\r\n this._densityTexture.set(tex);\r\n for (const target of this._targets) {\r\n target.bindGroup.dispose();\r\n }\r\n }\r\n // Texture uploads take views of plain array buffers only\r\n const bytes =\r\n data.buffer instanceof ArrayBuffer ? (data as Uint8Array<ArrayBuffer>) : new Uint8Array(data);\r\n tex.update(bytes, 0, 0, width, height);\r\n }\r\n /**\r\n * Uploads a rectangle of the density map\r\n * @param data - The whole density map, one byte per texel\r\n * @param width - Density map width in texels\r\n * @param x0 - Minimum x texel (inclusive)\r\n * @param z0 - Minimum z texel (inclusive)\r\n * @param x1 - Maximum x texel (exclusive)\r\n * @param z1 - Maximum z texel (exclusive)\r\n */\r\n updateDensityRegion(data: Uint8Array, width: number, x0: number, z0: number, x1: number, z1: number) {\r\n const tex = this._densityTexture.get();\r\n if (!tex || x1 <= x0 || z1 <= z0) {\r\n return;\r\n }\r\n const w = x1 - x0;\r\n const h = z1 - z0;\r\n const rect = new Uint8Array(w * h);\r\n for (let z = 0; z < h; z++) {\r\n rect.set(data.subarray((z0 + z) * width + x0, (z0 + z) * width + x1), z * w);\r\n }\r\n tex.update(rect, x0, z0, w, h);\r\n }\r\n /**\r\n * Places and culls the blades seen from a camera. Runs a compute pass, so it must be called\r\n * outside of render passes, before the draws that consume the result.\r\n * @param target - Target the blades are placed into, see draw()\r\n * @param cullPlanes - GRASS_CULL_PLANES planes (a, b, c, d) the blades are culled by instead of\r\n * the camera's frustum, whose normals point inward\r\n * @param shadowFade - Procedural blades only: (start, end) view depth over which the blades thin\r\n * out to none, each leaving at its own depth by a hash. Lets the blades casting shadows fade\r\n * out before the last cascade they are drawn into instead of stopping at its far split.\r\n */\r\n generate(\r\n camera: Camera,\r\n terrain: ClipmapTerrain,\r\n seed: number,\r\n cellsPerTexel: number,\r\n drawDistance: number,\r\n bladeWidth: number,\r\n bladeHeight: number,\r\n occlusionMode: GrassOcclusionMode,\r\n farDensity: number,\r\n bladeShape?: GrassBladeShape,\r\n windParams?: Nullable<Float32Array<ArrayBuffer>>,\r\n target = 0,\r\n cullPlanes?: Nullable<Float32Array<ArrayBuffer>>,\r\n shadowFade?: Nullable<[number, number]>\r\n ) {\r\n const placementTarget = this.getTarget(target);\r\n const density = this._densityTexture.get();\r\n const heightMap = terrain.heightMap;\r\n // Draw arguments of each detail level, whose indices follow each other: (index count,\r\n // instance count, first index, base vertex, first instance)\r\n const levels = this._lodIndexCounts.length;\r\n let firstIndex = 0;\r\n for (let i = 0; i < levels; i++) {\r\n this._args.set([this._lodIndexCounts[i], 0, firstIndex, 0, 0], i * 5);\r\n if (DEBUG_VIEWS) {\r\n // Edge index buffers hold 6 indices per triangle, twice the triangle indices\r\n this._args.set([this._lodIndexCounts[i] * 2, 0, firstIndex * 2, 0, 0], (levels + i) * 5);\r\n }\r\n firstIndex += this._lodIndexCounts[i];\r\n }\r\n placementTarget.argsBuffer.get()!.bufferSubData(0, this._args.subarray(0, levels * 5));\r\n placementTarget.edgeArgsBuffer.get()?.bufferSubData(0, this._args.subarray(levels * 5));\r\n if (!density || !heightMap) {\r\n return;\r\n }\r\n const blade = this._kind === 'blade' && !!bladeShape;\r\n const region = terrain.worldRegion;\r\n const cellsW = density.width * cellsPerTexel;\r\n const cellsH = density.height * cellsPerTexel;\r\n const cellSizeX = (region.z - region.x) / cellsW;\r\n const cellSizeZ = (region.w - region.y) / cellsH;\r\n const cameraPos = camera.getWorldPosition(GrassGpuPlacement._cameraPos);\r\n const centerX = (cameraPos.x - region.x) / cellSizeX;\r\n const centerZ = (cameraPos.z - region.y) / cellSizeZ;\r\n const drawRadius = drawDistance > 0 ? drawDistance : Infinity;\r\n // Near window: cells within the draw distance, or within the low detail distance of blades\r\n // that have one; far window: 2x2 blocks of cells from there on to the draw distance\r\n const lodDistance = blade ? grassBladeLodDistance(bladeShape[15], drawDistance) : NO_LIMIT;\r\n const nearRadius = Math.min(drawRadius, lodDistance);\r\n const near = GrassGpuPlacement.cellWindow(\r\n centerX,\r\n centerZ,\r\n nearRadius / cellSizeX,\r\n nearRadius / cellSizeZ,\r\n cellsW,\r\n cellsH,\r\n 1\r\n );\r\n const far =\r\n lodDistance < NO_LIMIT && lodDistance < drawRadius\r\n ? GrassGpuPlacement.cellWindow(\r\n centerX,\r\n centerZ,\r\n drawRadius / cellSizeX,\r\n drawRadius / cellSizeZ,\r\n cellsW,\r\n cellsH,\r\n 2\r\n )\r\n : [0, 0, 0, 0];\r\n const nearCount = near[2] * near[3];\r\n const farCount = far[2] * far[3];\r\n if (nearCount <= 0 && farCount <= 0) {\r\n return;\r\n }\r\n // Each list holds at most one blade per thread of its layer\r\n this.ensureCapacity(placementTarget, Math.max(nearCount, farCount));\r\n const bindGroup = this.getBindGroup(placementTarget);\r\n this._window.setXYZW(near[0], near[1], near[2], near[3]);\r\n this._window2.setXYZW(far[0], far[1], far[2], far[3]);\r\n // (fade start, 1 / fade length); a zero length leaves every blade in\r\n const fadeLength = shadowFade ? shadowFade[1] - shadowFade[0] : 0;\r\n this._lod.setXYZW(\r\n lodDistance,\r\n placementTarget.capacity,\r\n shadowFade ? shadowFade[0] : 0,\r\n fadeLength > 0 ? 1 / fadeLength : 0\r\n );\r\n // View depth of a point: dot(xyz, p) + w, along the camera's forward axis\r\n const m = camera.worldMatrix;\r\n const forward = GrassGpuPlacement._forward.setXYZ(-m.m02, -m.m12, -m.m22).inplaceNormalize();\r\n this._viewDepth.setXYZW(forward.x, forward.y, forward.z, -Vector3.dot(forward, cameraPos));\r\n this._cells.setXYZW(cellsW, cellsH, density.width, density.height);\r\n // Bounding sphere of a blade, centred halfway up; the density LOD widens distant blades\r\n const lod = grassDensityLod(drawDistance, farDensity);\r\n this._densityLod.setXYZW(lod[0], lod[1], 0, 0);\r\n if (blade) {\r\n // A blade reaches at most its tallest height from its base in any direction, plus half its\r\n // width, which grows fourfold toward the low detail level\r\n const maxHeight =\r\n bladeShape[0] * (1 + Math.abs(bladeShape[1])) * (1 + Math.abs(bladeShape[9])) * (1 + bladeShape[14]);\r\n const maxWidth = bladeShape[2] * (1 + Math.abs(bladeShape[3])) * 4;\r\n this._shape0.setXYZW(bladeShape[0], bladeShape[1], bladeShape[2], bladeShape[3]);\r\n this._shape1.setXYZW(bladeShape[4], bladeShape[5], bladeShape[6], bladeShape[7]);\r\n this._clump0.setXYZW(1 / Math.max(1e-3, bladeShape[8]), bladeShape[9], bladeShape[10], bladeShape[11]);\r\n this._clump1.setXYZW(bladeShape[12], bladeShape[13], 0, 0);\r\n this._params.setXYZW(seed * 4, drawDistance, maxHeight + maxWidth * 0.5, 0);\r\n bladeHeight = maxHeight;\r\n } else {\r\n const maxWidth = bladeWidth / lod[1];\r\n // The wind turns a card about its base, which takes its top up to 1.12 times its height\r\n // from the centre of the card\r\n const radius =\r\n windParams && windParams[2] > 0\r\n ? maxWidth * 0.5 + bladeHeight * 1.12\r\n : Math.sqrt(maxWidth * maxWidth * 0.25 + bladeHeight * bladeHeight * 0.25);\r\n this._params.setXYZW(seed * 4, drawDistance, radius, bladeHeight * 0.5);\r\n }\r\n this._posScale.setXYZW(terrain.scale.x, terrain.scale.y, terrain.scale.z, terrain.worldMatrix.m13);\r\n this._camera.setXYZW(cameraPos.x, cameraPos.y, cameraPos.z, 0);\r\n // Terrain occlusion needs the height pyramid, and heights that grow upwards\r\n const pyramid = terrain.heightPyramid;\r\n const occlusion = pyramid && terrain.scale.y > 0 ? occlusionMode : GrassOcclusionMode.Off;\r\n const bounds = terrain.getWorldBoundingVolume()?.toAABB();\r\n // Absorbs half float and interpolation error in the heights\r\n const epsilon = bounds ? (bounds.maxPoint.y - bounds.minPoint.y) * 1e-3 + 1e-4 : 1e-3;\r\n this._occlusion.setXYZW(occlusion, terrain.clipmapTileResolution, epsilon, bladeHeight);\r\n this._heightInfo.setXYZW(\r\n heightMap.width,\r\n heightMap.height,\r\n pyramid?.mipLevelCount ?? 1,\r\n Math.max((region.z - region.x) / heightMap.width, (region.w - region.y) / heightMap.height)\r\n );\r\n // Planes masked out by the camera become ones everything is inside of\r\n let planes: Float32Array<ArrayBuffer> = GrassGpuPlacement._planes;\r\n if (cullPlanes) {\r\n planes = cullPlanes;\r\n } else {\r\n const frustumPlanes = camera.frustum.planes;\r\n const mask = camera.clipMask || 0x3f;\r\n for (let i = 0; i < GRASS_CULL_PLANES; i++) {\r\n const p = frustumPlanes[i];\r\n const enabled = i < 6 && !!(mask & (1 << i));\r\n planes[i * 4 + 0] = enabled ? p.a : 0;\r\n planes[i * 4 + 1] = enabled ? p.b : 0;\r\n planes[i * 4 + 2] = enabled ? p.c : 0;\r\n planes[i * 4 + 3] = enabled ? p.d : 1e30;\r\n }\r\n }\r\n bindGroup.setValue('window', this._window);\r\n bindGroup.setValue('cells', this._cells);\r\n bindGroup.setValue('params', this._params);\r\n bindGroup.setValue('region', region);\r\n bindGroup.setValue('posScale', this._posScale);\r\n bindGroup.setValue('cameraPos', this._camera);\r\n bindGroup.setValue('planes', planes);\r\n bindGroup.setValue('occlusion', this._occlusion);\r\n bindGroup.setValue('densityLod', this._densityLod);\r\n bindGroup.setValue('heightInfo', this._heightInfo);\r\n if (this._kind === 'blade') {\r\n bindGroup.setValue('window2', this._window2);\r\n bindGroup.setValue('lod', this._lod);\r\n bindGroup.setValue('viewDepth', this._viewDepth);\r\n bindGroup.setValue('shape0', this._shape0);\r\n bindGroup.setValue('shape1', this._shape1);\r\n bindGroup.setValue('clump0', this._clump0);\r\n bindGroup.setValue('clump1', this._clump1);\r\n bindGroup.setValue('wind', windParams ?? GrassGpuPlacement._calmWind);\r\n }\r\n // Any texture of the right sample type does when occlusion is off. Declared unfilterable\r\n // (read with textureLoad only), so the sampler bound with it must be a non-filtering one\r\n // whatever the texture's default is: rg32f counts as filterable where the device has\r\n // float32-filterable.\r\n bindGroup.setTexture(\r\n 'heightPyramid',\r\n pyramid ?? GrassGpuPlacement.getDummyPyramid(),\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n bindGroup.setTexture('density', density);\r\n bindGroup.setTexture('heightMap', heightMap, fetchSampler('clamp_linear_nomip'));\r\n const device = getDevice();\r\n device.setProgram(GrassGpuPlacement.getProgram(this._kind));\r\n device.setBindGroup(0, bindGroup);\r\n // The far layer, when there is one, runs as z = 1 of the same dispatch\r\n device.compute(\r\n Math.ceil(Math.max(near[2], far[2]) / WORKGROUP_SIZE),\r\n Math.ceil(Math.max(near[3], far[3]) / WORKGROUP_SIZE),\r\n farCount > 0 ? 2 : 1\r\n );\r\n // The instance counts placement wrote, for drawing the edges in a wireframe view\r\n const edgeArgs = placementTarget.edgeArgsBuffer.get();\r\n if (edgeArgs) {\r\n for (let i = 0; i < this._lodIndexCounts.length; i++) {\r\n device.copyBuffer(placementTarget.argsBuffer.get()!, edgeArgs, (i * 5 + 1) * 4, (i * 5 + 1) * 4, 4);\r\n }\r\n }\r\n }\r\n /**\r\n * Window of placement units within a radius of a point, clipped to the grid and to\r\n * MAX_WINDOW_CELLS units a side: (first x, first z, units wide, units high)\r\n * @param centerX - Point x, in cells\r\n * @param centerZ - Point z, in cells\r\n * @param radiusX - Radius along x, in cells\r\n * @param radiusZ - Radius along z, in cells\r\n * @param cellsW - Grid width, in cells\r\n * @param cellsH - Grid height, in cells\r\n * @param unit - Placement unit side, in cells\r\n */\r\n private static cellWindow(\r\n centerX: number,\r\n centerZ: number,\r\n radiusX: number,\r\n radiusZ: number,\r\n cellsW: number,\r\n cellsH: number,\r\n unit: number\r\n ): [number, number, number, number] {\r\n const halfMax = MAX_WINDOW_CELLS / 2;\r\n const cx = centerX / unit;\r\n const cz = centerZ / unit;\r\n const rx = Math.min(radiusX / unit, halfMax);\r\n const rz = Math.min(radiusZ / unit, halfMax);\r\n const x0 = Math.max(0, Math.floor(cx - rx));\r\n const x1 = Math.min(Math.ceil(cellsW / unit), Math.ceil(cx + rx));\r\n const z0 = Math.max(0, Math.floor(cz - rz));\r\n const z1 = Math.min(Math.ceil(cellsH / unit), Math.ceil(cz + rz));\r\n return [x0, z0, Math.max(0, x1 - x0), Math.max(0, z1 - z0)];\r\n }\r\n /**\r\n * Instance buffer written by the last generate() call into a target\r\n * @param target - The target\r\n */\r\n getInstanceBuffer(target = 0) {\r\n return this._targets[target]?.instanceBuffer.get() ?? null;\r\n }\r\n /**\r\n * First instance of the low detail list in the instance buffer of a target (procedural blades\r\n * only); the high detail list starts at 0\r\n * @param target - The target\r\n */\r\n getLowListBase(target = 0) {\r\n return this._targets[target]?.capacity ?? 0;\r\n }\r\n /**\r\n * Draws the blades of the last generate() call into a target; the material must be bound\r\n * @param target - The target\r\n */\r\n draw(target = 0) {\r\n const placementTarget = this._targets[target];\r\n if (!placementTarget) {\r\n return;\r\n }\r\n let primitive = placementTarget.primitive.get();\r\n if (!primitive) {\r\n const instanceBuffer = placementTarget.instanceBuffer.get();\r\n if (!instanceBuffer) {\r\n return;\r\n }\r\n primitive = new Primitive();\r\n primitive.setVertexBuffer(this._baseVertexBuffer.get()!);\r\n if (this._kind === 'card') {\r\n primitive.setVertexBuffer(instanceBuffer as StructuredBuffer, 'instance');\r\n }\r\n primitive.setIndexBuffer(this._indexBuffer.get());\r\n primitive.primitiveType = 'triangle-list';\r\n primitive.indexStart = 0;\r\n primitive.indexCount = this._indexBuffer.get()!.length;\r\n placementTarget.primitive.set(primitive);\r\n }\r\n // One draw per detail level; the arguments pick its range of the index buffer\r\n const edgeArgs = placementTarget.edgeArgsBuffer.get();\r\n for (let i = 0; i < this._lodIndexCounts.length; i++) {\r\n primitive.drawIndirect(\r\n placementTarget.argsBuffer.get()!,\r\n i * 20,\r\n edgeArgs ? i * 20 : -1,\r\n edgeArgs ?? undefined\r\n );\r\n }\r\n }\r\n /**\r\n * Releases the targets from a number on, which are no longer placed into\r\n * @param count - Number of targets kept\r\n */\r\n trimTargets(count: number) {\r\n while (this._targets.length > Math.max(1, count)) {\r\n GrassGpuPlacement.disposeTarget(this._targets.pop()!);\r\n }\r\n }\r\n private getTarget(index: number) {\r\n while (this._targets.length <= index) {\r\n this._targets.push({\r\n instanceBuffer: new DRef(),\r\n argsBuffer: new DRef(\r\n // Dynamic: the arguments are reset every frame, and a dynamic buffer reuses its upload\r\n // staging buffers instead of creating and destroying one per upload\r\n getDevice().createBuffer(this._lodIndexCounts.length * 20, {\r\n usage: 'indirect',\r\n storage: true,\r\n dynamic: true\r\n })\r\n ),\r\n edgeArgsBuffer: new DRef(\r\n DEBUG_VIEWS\r\n ? getDevice().createBuffer(this._lodIndexCounts.length * 20, { usage: 'indirect', dynamic: true })\r\n : null\r\n ),\r\n bindGroup: new DRef(),\r\n primitive: new DRef(),\r\n capacity: 0\r\n });\r\n }\r\n return this._targets[index];\r\n }\r\n private static disposeTarget(target: PlacementTarget) {\r\n target.instanceBuffer.dispose();\r\n target.argsBuffer.dispose();\r\n target.edgeArgsBuffer.dispose();\r\n target.bindGroup.dispose();\r\n target.primitive.dispose();\r\n }\r\n private ensureCapacity(target: PlacementTarget, numInstances: number) {\r\n if (numInstances > target.capacity) {\r\n target.capacity = nextPowerOf2(numInstances);\r\n const device = getDevice();\r\n const buffer =\r\n this._kind === 'card'\r\n ? device.createVertexBuffer('tex1_f32x4', new Float32Array(target.capacity * 4), {\r\n storage: true\r\n })!\r\n : // The high and the low detail lists, each of the capacity\r\n device.createBuffer(target.capacity * 2 * INSTANCE_VEC4.blade * 16, {\r\n usage: 'uniform',\r\n storage: true,\r\n dynamic: false,\r\n managed: false\r\n });\r\n target.instanceBuffer.set(buffer);\r\n target.primitive.dispose();\r\n target.bindGroup.dispose();\r\n }\r\n }\r\n private getBindGroup(target: PlacementTarget) {\r\n let bindGroup = target.bindGroup.get();\r\n if (!bindGroup) {\r\n bindGroup = getDevice().createBindGroup(GrassGpuPlacement.getProgram(this._kind).bindGroupLayouts[0]);\r\n bindGroup.setBuffer('instances', target.instanceBuffer.get()!);\r\n bindGroup.setBuffer('args', target.argsBuffer.get()!);\r\n target.bindGroup.set(bindGroup);\r\n }\r\n return bindGroup;\r\n }\r\n private static _dummyPyramid: Nullable<Texture2D> = null;\r\n private static getDummyPyramid() {\r\n if (!this._dummyPyramid) {\r\n this._dummyPyramid = getDevice().createTexture2D('rg32f', 1, 1, { mipmapping: false })!;\r\n this._dummyPyramid.update(new Float32Array(2), 0, 0, 1, 1);\r\n }\r\n return this._dummyPyramid;\r\n }\r\n private static getProgram(kind: GrassLayerKind) {\r\n let program = this._programs[kind];\r\n if (!program) {\r\n const blade = kind === 'blade';\r\n program = getDevice().buildComputeProgram({\r\n label: blade ? 'GrassBladePlacement' : 'GrassPlacement',\r\n workgroupSize: [WORKGROUP_SIZE, WORKGROUP_SIZE, 1],\r\n compute(pb) {\r\n // (first cell x, first cell z, cells wide, cells high)\r\n this.window = pb.vec4().uniform(0);\r\n // (cells x, cells z, density width, density height)\r\n this.cells = pb.vec4().uniform(0);\r\n // (seed, draw distance, blade bounding radius, blade centre height)\r\n this.params = pb.vec4().uniform(0);\r\n this.region = pb.vec4().uniform(0);\r\n // (terrain scale xyz, terrain origin y)\r\n this.posScale = pb.vec4().uniform(0);\r\n this.cameraPos = pb.vec4().uniform(0);\r\n this.planes = pb.vec4[GRASS_CULL_PLANES]().uniform(0);\r\n // (mode, clipmap tile resolution, height epsilon, blade height)\r\n this.occlusion = pb.vec4().uniform(0);\r\n // (density falloff start distance, density at the draw distance, unused, unused)\r\n this.densityLod = pb.vec4().uniform(0);\r\n // (height map width, height map height, pyramid mip count, grid cell size)\r\n this.heightInfo = pb.vec4().uniform(0);\r\n if (blade) {\r\n // Far window: (first block x, first block z, blocks wide, blocks high), 2x2 cells a block\r\n this.window2 = pb.vec4().uniform(0);\r\n // (low detail distance, first instance of the low detail list, shadow fade start depth,\r\n // 1 / shadow fade length or 0 for no fade)\r\n this.lod = pb.vec4().uniform(0);\r\n // (camera forward, -dot(forward, camera position)): view depth of a point\r\n this.viewDepth = pb.vec4().uniform(0);\r\n // See GrassBladeShape\r\n this.shape0 = pb.vec4().uniform(0);\r\n this.shape1 = pb.vec4().uniform(0);\r\n // (1 / clump size, height variation, pull to the clump point, same direction)\r\n this.clump0 = pb.vec4().uniform(0);\r\n // (face away from the clump point, wind facing, unused, unused)\r\n this.clump1 = pb.vec4().uniform(0);\r\n // Scene wind, current frame then previous frame, see WindField.shaderParams\r\n this.wind = pb.vec4[8]().uniform(0);\r\n }\r\n this.heightPyramid = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.occludedFlag = pb.atomic_uint().workgroup();\r\n this.density = pb.tex2D().uniform(0);\r\n this.heightMap = pb.tex2D().uniform(0);\r\n this.instances = pb.vec4[0]().storageBuffer(0);\r\n this.args = pb.atomic_uint[0]().storageBuffer(0);\r\n // See grassHash(); unsigned integer arithmetic wraps like Math.imul\r\n pb.func('grassHash', [pb.uint('x'), pb.uint('z'), pb.uint('s')], function () {\r\n this.$l.h = pb.compXor(\r\n pb.compXor(pb.mul(this.x, pb.uint(0x27d4eb2d)), pb.mul(this.z, pb.uint(0x165667b1))),\r\n pb.mul(this.s, 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(pb.mul(pb.float(pb.sar(this.h, 8)), 1 / 16777216));\r\n });\r\n // Bilinear density, the same filtering as GrassLayer.sampleDensity()\r\n pb.func('sampleDensity', [pb.vec2('uv')], function () {\r\n this.$l.size = this.cells.zw;\r\n this.$l.p = pb.sub(pb.mul(this.uv, this.size), pb.vec2(0.5));\r\n this.$l.i = pb.floor(this.p);\r\n this.$l.f = pb.sub(this.p, this.i);\r\n this.$l.maxIndex = pb.sub(this.size, pb.vec2(1));\r\n this.$l.i0 = pb.ivec2(pb.clamp(this.i, pb.vec2(0), this.maxIndex));\r\n this.$l.i1 = pb.ivec2(pb.clamp(pb.add(this.i, pb.vec2(1)), pb.vec2(0), this.maxIndex));\r\n const texel = (scope: PBInsideFunctionScope, x: string, z: string) =>\r\n pb.textureLoad(scope.density, pb.ivec2(scope[x].x, scope[z].y), 0).r;\r\n this.$l.a = pb.mix(texel(this, 'i0', 'i0'), texel(this, 'i1', 'i0'), this.f.x);\r\n this.$l.b = pb.mix(texel(this, 'i0', 'i1'), texel(this, 'i1', 'i1'), this.f.x);\r\n this.$return(pb.mix(this.a, this.b, this.f.y));\r\n });\r\n // (max, min) height over a rectangle of height map texels [lo, hi], read from the\r\n // pyramid level where the rectangle spans at most 2x2 texels\r\n pb.func('pyramidRange', [pb.vec2('lo'), pb.vec2('hi')], function () {\r\n this.$l.extent = pb.max(pb.sub(this.hi.x, this.lo.x), pb.sub(this.hi.y, this.lo.y));\r\n this.$l.level = pb.clamp(\r\n pb.ceil(pb.log2(pb.max(this.extent, 1))),\r\n 0,\r\n pb.sub(this.heightInfo.z, 1)\r\n );\r\n this.$l.texelSize = pb.exp2(this.level);\r\n this.$l.mip = pb.int(this.level);\r\n this.$l.maxIndex = pb.sub(\r\n pb.vec2(pb.textureDimensions(this.heightPyramid, this.mip)),\r\n pb.vec2(1)\r\n );\r\n this.$l.i0 = pb.ivec2(\r\n pb.clamp(pb.floor(pb.div(this.lo, this.texelSize)), pb.vec2(0), this.maxIndex)\r\n );\r\n this.$l.i1 = pb.ivec2(\r\n pb.clamp(pb.floor(pb.div(this.hi, this.texelSize)), pb.vec2(0), this.maxIndex)\r\n );\r\n this.$l.a = pb.textureLoad(this.heightPyramid, this.i0, this.mip).rg;\r\n this.$l.b = pb.textureLoad(this.heightPyramid, pb.ivec2(this.i1.x, this.i0.y), this.mip).rg;\r\n this.$l.c = pb.textureLoad(this.heightPyramid, pb.ivec2(this.i0.x, this.i1.y), this.mip).rg;\r\n this.$l.d = pb.textureLoad(this.heightPyramid, this.i1, this.mip).rg;\r\n this.$return(\r\n pb.vec2(\r\n pb.max(pb.max(this.a.x, this.b.x), pb.max(this.c.x, this.d.x)),\r\n pb.min(pb.min(this.a.y, this.b.y), pb.min(this.c.y, this.d.y))\r\n )\r\n );\r\n });\r\n pb.main(function () {\r\n // Placement units of this thread's layer: cells of the near window, or 2x2 blocks of\r\n // cells of the far window (z = 1, procedural blades only)\r\n this.$l.far = pb.notEqual(this.$builtins.globalInvocationId.z, pb.uint(0));\r\n this.$l.win = this.window;\r\n this.$l.unit = pb.float(1);\r\n if (blade) {\r\n this.$if(this.far, function () {\r\n this.win = this.window2;\r\n this.unit = pb.float(2);\r\n });\r\n }\r\n // Terrain occlusion, one test per workgroup: the group's blades are hidden if every\r\n // line of sight to them dips below the terrain somewhere in front of them. Each\r\n // thread checks one point along the way.\r\n this.$l.occluded = pb.uint(0);\r\n this.$if(pb.greaterThan(this.occlusion.x, 0.5), function () {\r\n this.$l.cellSize = pb.div(pb.sub(this.region.zw, this.region.xy), this.cells.xy);\r\n this.$l.toTexel = pb.div(this.heightInfo.xy, pb.sub(this.region.zw, this.region.xy));\r\n this.$l.g0 = pb.mul(\r\n pb.add(this.win.xy, pb.mul(pb.vec2(this.$builtins.workGroupId.xy), WORKGROUP_SIZE)),\r\n this.unit\r\n );\r\n this.$l.g1 = pb.min(\r\n pb.add(this.g0, pb.vec2(pb.mul(this.unit, WORKGROUP_SIZE))),\r\n pb.mul(pb.add(this.win.xy, this.win.zw), this.unit)\r\n );\r\n this.$l.fmin = pb.add(this.region.xy, pb.mul(this.g0, this.cellSize));\r\n this.$l.fmax = pb.add(this.region.xy, pb.mul(this.g1, this.cellSize));\r\n this.$l.cam = this.cameraPos.xz;\r\n this.$l.camY = this.cameraPos.y;\r\n // Highest blade tip of the group; one texel of margin for the bilinear heights\r\n this.$l.groupRange = this.pyramidRange(\r\n pb.sub(pb.mul(pb.sub(this.fmin, this.region.xy), this.toTexel), pb.vec2(1)),\r\n pb.add(pb.mul(pb.sub(this.fmax, this.region.xy), this.toTexel), pb.vec2(1))\r\n );\r\n this.$l.topY = pb.add(\r\n pb.add(pb.mul(this.groupRange.x, this.posScale.y), this.posScale.w),\r\n this.occlusion.w\r\n );\r\n this.$l.dNear = pb.length(\r\n pb.max(pb.max(pb.sub(this.fmin, this.cam), pb.sub(this.cam, this.fmax)), pb.vec2(0))\r\n );\r\n this.$l.dFar = pb.length(\r\n pb.max(pb.abs(pb.sub(this.cam, this.fmin)), pb.abs(pb.sub(this.cam, this.fmax)))\r\n );\r\n this.$l.center = pb.mul(pb.add(this.fmin, this.fmax), 0.5);\r\n this.$l.groupRadius = pb.mul(pb.length(pb.sub(this.fmax, this.fmin)), 0.5);\r\n this.$l.sMin = pb.mul(this.heightInfo.w, 2);\r\n this.$l.sEnd = pb.sub(this.dNear, this.groupRadius);\r\n // A camera below the terrain would see everything as occluded\r\n this.$l.camTexel = pb.mul(pb.sub(this.cam, this.region.xy), this.toTexel);\r\n this.$l.camGround = pb.add(\r\n pb.mul(this.pyramidRange(this.camTexel, this.camTexel).y, this.posScale.y),\r\n this.posScale.w\r\n );\r\n this.$if(\r\n pb.and(pb.greaterThan(this.sEnd, this.sMin), pb.greaterThanEqual(this.camY, this.camGround)),\r\n function () {\r\n // Steepest line of sight to the group: to the nearest edge when looking up at\r\n // its highest tip, to the farthest one when looking down\r\n this.$l.slope = pb.div(\r\n pb.sub(this.topY, this.camY),\r\n pb.mix(this.dFar, this.dNear, pb.step(this.camY, this.topY))\r\n );\r\n this.$l.dir = pb.normalize(pb.sub(this.center, this.cam));\r\n this.$l.k = pb.float(\r\n pb.add(\r\n pb.mul(this.$builtins.localInvocationId.y, WORKGROUP_SIZE),\r\n this.$builtins.localInvocationId.x\r\n )\r\n );\r\n this.$l.s = pb.add(\r\n this.sMin,\r\n pb.mul(pb.sub(this.sEnd, this.sMin), pb.div(pb.add(this.k, 0.5), OCCLUSION_SAMPLES))\r\n );\r\n this.$l.p = pb.add(this.cam, pb.mul(this.dir, this.s));\r\n // Lateral spread of the lines of sight at this distance, plus how far below the\r\n // samples the rendered surface can reach: a clipmap level of 2^L cells averages\r\n // heights within 4 * 2^L cells, and 2^L <= s / (T * cell) there, doubled for safety\r\n this.$l.spread = pb.div(pb.mul(this.groupRadius, this.s), this.dNear);\r\n this.$l.lodReach = pb.mul(\r\n pb.mul(\r\n pb.max(1, pb.div(pb.mul(this.s, 2), pb.mul(this.occlusion.y, this.heightInfo.w))),\r\n this.heightInfo.w\r\n ),\r\n 4\r\n );\r\n this.$l.halfSize = pb.mul(pb.vec2(pb.add(this.spread, this.lodReach)), this.toTexel);\r\n this.$l.pc = pb.mul(pb.sub(this.p, this.region.xy), this.toTexel);\r\n this.$l.lo = pb.sub(this.pc, this.halfSize);\r\n this.$l.hi = pb.add(this.pc, this.halfSize);\r\n // Beyond the terrain there is nothing to hide behind\r\n this.$if(\r\n pb.and(\r\n pb.and(pb.greaterThanEqual(this.lo.x, 0), pb.greaterThanEqual(this.lo.y, 0)),\r\n pb.and(\r\n pb.lessThanEqual(this.hi.x, this.heightInfo.x),\r\n pb.lessThanEqual(this.hi.y, this.heightInfo.y)\r\n )\r\n ),\r\n function () {\r\n this.$l.ground = pb.sub(\r\n pb.add(\r\n pb.mul(this.pyramidRange(this.lo, this.hi).y, this.posScale.y),\r\n this.posScale.w\r\n ),\r\n this.occlusion.z\r\n );\r\n this.$if(\r\n pb.lessThan(pb.add(this.camY, pb.mul(this.slope, this.s)), this.ground),\r\n function () {\r\n pb.atomicOr(this.occludedFlag, 1);\r\n }\r\n );\r\n }\r\n );\r\n }\r\n );\r\n pb.workgroupBarrier();\r\n this.occluded = pb.atomicOr(this.occludedFlag, 0);\r\n });\r\n this.$l.id = this.$builtins.globalInvocationId.xy;\r\n this.$if(\r\n pb.and(\r\n pb.and(\r\n pb.lessThan(this.id.x, pb.uint(this.win.z)),\r\n pb.lessThan(this.id.y, pb.uint(this.win.w))\r\n ),\r\n pb.or(pb.equal(this.occluded, 0), pb.greaterThan(this.occlusion.x, 1.5))\r\n ),\r\n function () {\r\n this.$l.cx = pb.add(pb.uint(this.win.x), this.id.x);\r\n this.$l.cz = pb.add(pb.uint(this.win.y), this.id.y);\r\n this.$l.seed = pb.uint(this.params.x);\r\n // Blades that give way to the low detail level: 1 for the three cells of each\r\n // 2x2 block that the far layer does not keep\r\n this.$l.extra = pb.float(0);\r\n if (blade) {\r\n this.$l.bseed = pb.add(pb.mul(this.seed, 16), pb.uint(BLADE_SEED_BASE));\r\n // The cell of a 2x2 block the far layer keeps, picked by a hash of the block\r\n this.$l.block = this.$choice(\r\n this.far,\r\n pb.uvec2(this.cx, this.cz),\r\n pb.uvec2(pb.sar(this.cx, 1), pb.sar(this.cz, 1))\r\n );\r\n this.$l.kept = pb.min(\r\n pb.uint(pb.mul(this.grassHash(this.block.x, this.block.y, pb.add(this.bseed, 5)), 4)),\r\n pb.uint(3)\r\n );\r\n this.$if(this.far, function () {\r\n this.cx = pb.add(pb.mul(this.block.x, 2), pb.compAnd(this.kept, pb.uint(1)));\r\n this.cz = pb.add(pb.mul(this.block.y, 2), pb.sar(this.kept, 1));\r\n }).$else(function () {\r\n this.extra = pb.float(\r\n pb.notEqual(\r\n pb.add(pb.compAnd(this.cx, pb.uint(1)), pb.mul(pb.compAnd(this.cz, pb.uint(1)), 2)),\r\n this.kept\r\n )\r\n );\r\n });\r\n }\r\n this.$l.uv = pb.div(\r\n pb.add(\r\n pb.vec2(pb.float(this.cx), pb.float(this.cz)),\r\n pb.vec2(\r\n this.grassHash(this.cx, this.cz, this.seed),\r\n this.grassHash(this.cx, this.cz, pb.add(this.seed, 1))\r\n )\r\n ),\r\n this.cells.xy\r\n );\r\n this.$if(\r\n pb.and(\r\n pb.greaterThan(\r\n this.sampleDensity(this.uv),\r\n this.grassHash(this.cx, this.cz, pb.add(this.seed, 2))\r\n ),\r\n // The cell a block of the far layer keeps can fall past the grid's last row\r\n pb.and(\r\n pb.lessThan(this.cx, pb.uint(this.cells.x)),\r\n pb.lessThan(this.cz, pb.uint(this.cells.y))\r\n )\r\n ),\r\n function () {\r\n this.$l.regionSize = pb.sub(this.region.zw, this.region.xy);\r\n if (blade) {\r\n // Clumps, after \"Procedural Grass in Ghost of Tsushima\": a procedural\r\n // Voronoi over the nearest 3x3 points of a grid, each jittered by a hash;\r\n // the blade belongs to the clump of the nearest point\r\n this.$l.cp = pb.mul(\r\n pb.add(this.region.xy, pb.mul(this.uv, this.regionSize)),\r\n this.clump0.x\r\n );\r\n this.$l.cellBase = pb.floor(this.cp);\r\n this.$l.bestDist = pb.float(1e9);\r\n this.$l.clumpPoint = this.cp;\r\n this.$l.clumpCell = pb.uvec2(0);\r\n this.$l.cellF = pb.vec2(0);\r\n this.$l.cellU = pb.uvec2(0);\r\n this.$l.point = pb.vec2(0);\r\n this.$l.pointDist = pb.float(0);\r\n for (let dz = -1; dz <= 1; dz++) {\r\n for (let dx = -1; dx <= 1; dx++) {\r\n this.cellF = pb.add(this.cellBase, pb.vec2(dx, dz));\r\n // Negative cells wrap to large unsigned values, all the hash needs\r\n this.cellU = pb.uvec2(pb.ivec2(this.cellF));\r\n this.point = pb.add(\r\n this.cellF,\r\n pb.vec2(\r\n this.grassHash(this.cellU.x, this.cellU.y, pb.add(this.bseed, 8)),\r\n this.grassHash(this.cellU.x, this.cellU.y, pb.add(this.bseed, 9))\r\n )\r\n );\r\n this.pointDist = pb.dot(pb.sub(this.point, this.cp), pb.sub(this.point, this.cp));\r\n this.$if(pb.lessThan(this.pointDist, this.bestDist), function () {\r\n this.bestDist = this.pointDist;\r\n this.clumpPoint = this.point;\r\n this.clumpCell = this.cellU;\r\n });\r\n }\r\n }\r\n this.$l.clumpCenter = pb.div(this.clumpPoint, this.clump0.x);\r\n this.$l.clumpAngle = pb.mul(\r\n this.grassHash(this.clumpCell.x, this.clumpCell.y, pb.add(this.bseed, 10)),\r\n Math.PI * 2\r\n );\r\n this.$l.clumpHeight = pb.sub(\r\n pb.mul(this.grassHash(this.clumpCell.x, this.clumpCell.y, pb.add(this.bseed, 11)), 2),\r\n 1\r\n );\r\n this.$l.clumpColor = this.grassHash(\r\n this.clumpCell.x,\r\n this.clumpCell.y,\r\n pb.add(this.bseed, 12)\r\n );\r\n // Pull the blade toward its clump point before it is placed on the terrain\r\n this.uv = pb.mix(\r\n this.uv,\r\n pb.div(pb.sub(this.clumpCenter, this.region.xy), this.regionSize),\r\n this.clump0.z\r\n );\r\n }\r\n this.$l.xz = pb.add(this.region.xy, pb.mul(this.uv, this.regionSize));\r\n this.$l.height = pb.add(\r\n pb.mul(pb.textureSampleLevel(this.heightMap, this.uv, 0).r, this.posScale.y),\r\n this.posScale.w\r\n );\r\n this.$l.base = pb.vec3(this.xz.x, this.height, this.xz.y);\r\n this.$l.dist = pb.distance(this.base, this.cameraPos.xyz);\r\n this.$l.visible = pb.or(\r\n pb.lessThanEqual(this.params.y, 0),\r\n pb.lessThanEqual(this.dist, this.params.y)\r\n );\r\n this.$l.lodHash = this.grassHash(this.cx, this.cz, pb.add(this.seed, 4));\r\n if (blade) {\r\n // Detail level: each blade belongs to the near layer up to the low detail\r\n // distance and to the far layer from there on, measured the same way in both\r\n this.visible = pb.and(\r\n this.visible,\r\n pb.equal(this.far, pb.greaterThanEqual(this.dist, this.lod.x))\r\n );\r\n } else {\r\n // Density LOD, see ClipmapGrassMaterial: drop the blades the material would\r\n // shrink to nothing\r\n this.$if(pb.greaterThan(this.params.y, 0), function () {\r\n this.$l.keep = pb.mix(\r\n 1,\r\n this.densityLod.y,\r\n pb.smoothStep(this.densityLod.x, this.params.y, this.dist)\r\n );\r\n this.visible = pb.and(\r\n this.visible,\r\n pb.lessThan(pb.mul(this.lodHash, 1 - GRASS_LOD_FADE_BAND), this.keep)\r\n );\r\n });\r\n }\r\n if (blade) {\r\n // Shadow caster fade: thin out to none over a band of view depth, each blade\r\n // leaving at its own depth like the density LOD\r\n this.$if(pb.greaterThan(this.lod.w, 0), function () {\r\n this.$l.viewZ = pb.add(pb.dot(this.viewDepth.xyz, this.base), this.viewDepth.w);\r\n this.$l.fadeKeep = pb.sub(\r\n 1,\r\n pb.clamp(pb.mul(pb.sub(this.viewZ, this.lod.z), this.lod.w), 0, 1)\r\n );\r\n this.visible = pb.and(\r\n this.visible,\r\n pb.lessThan(this.grassHash(this.cx, this.cz, pb.add(this.bseed, 13)), this.fadeKeep)\r\n );\r\n });\r\n }\r\n this.$l.center = pb.add(this.base, pb.vec3(0, this.params.w, 0));\r\n for (let i = 0; i < GRASS_CULL_PLANES; i++) {\r\n this.visible = pb.and(\r\n this.visible,\r\n pb.greaterThanEqual(\r\n pb.add(pb.dot(this.planes.at(i).xyz, this.center), this.planes.at(i).w),\r\n pb.neg(this.params.z)\r\n )\r\n );\r\n }\r\n this.$if(this.visible, function () {\r\n this.$l.angle = pb.mul(\r\n this.grassHash(this.cx, this.cz, pb.add(this.seed, 3)),\r\n Math.PI * 2\r\n );\r\n // Occluded blades kept for debugging are flagged by adding 2 to the hash; blade\r\n // instances carry the extra flag in its place, their density LOD is the\r\n // detail levels\r\n this.$l.flaggedHash = pb.add(\r\n blade ? this.extra : this.lodHash,\r\n pb.mul(pb.float(pb.notEqual(this.occluded, 0)), 2)\r\n );\r\n if (blade) {\r\n // Near blades append to the high detail list, far ones to the low detail\r\n // list, whose draw arguments follow and whose instances start at lod.y\r\n this.$l.slot = pb.uint(0);\r\n this.$if(this.far, function () {\r\n this.slot = pb.add(pb.atomicAdd(this.args.at(6), 1), pb.uint(this.lod.y));\r\n }).$else(function () {\r\n this.slot = pb.atomicAdd(this.args.at(1), 1);\r\n });\r\n } else {\r\n this.$l.slot = pb.atomicAdd(this.args.at(1), 1);\r\n }\r\n if (!blade) {\r\n this.instances.setAt(this.slot, pb.vec4(this.uv, this.angle, this.flaggedHash));\r\n } else {\r\n // Layout: see ClipmapBladeGrassMaterial\r\n const signedHash = (scope: PBInsideFunctionScope, k: number) =>\r\n pb.sub(pb.mul(scope.grassHash(scope.cx, scope.cz, pb.add(scope.bseed, k)), 2), 1);\r\n this.$l.bladeHeight = pb.mul(\r\n this.shape0.x,\r\n pb.max(0, pb.add(1, pb.mul(this.shape0.y, signedHash(this, 0)))),\r\n pb.max(0, pb.add(1, pb.mul(this.clump0.y, this.clumpHeight)))\r\n );\r\n this.$l.bladeWidth = pb.mul(\r\n this.shape0.z,\r\n pb.max(0, pb.add(1, pb.mul(this.shape0.w, signedHash(this, 1))))\r\n );\r\n this.$l.tilt = pb.clamp(\r\n pb.add(this.shape1.x, pb.mul(this.shape1.y, signedHash(this, 2))),\r\n 0,\r\n 1\r\n );\r\n this.$l.bend = pb.add(this.shape1.z, pb.mul(this.shape1.w, signedHash(this, 3)));\r\n this.$l.bladeHash = this.grassHash(this.cx, this.cz, pb.add(this.bseed, 4));\r\n // Facing: toward the clump's shared direction, then away from its point\r\n this.$l.clumpDir = pb.vec2(pb.cos(this.clumpAngle), pb.sin(this.clumpAngle));\r\n this.$l.facing = pb.mix(\r\n pb.vec2(pb.cos(this.angle), pb.sin(this.angle)),\r\n this.clumpDir,\r\n this.clump0.w\r\n );\r\n this.$l.away = pb.sub(this.xz, this.clumpCenter);\r\n this.$l.awayLen = pb.length(this.away);\r\n this.$if(pb.greaterThan(this.awayLen, 1e-5), function () {\r\n this.facing = pb.mix(this.facing, pb.div(this.away, this.awayLen), this.clump1.x);\r\n });\r\n this.$if(pb.lessThan(pb.dot(this.facing, this.facing), 1e-8), function () {\r\n this.facing = this.clumpDir;\r\n });\r\n this.$l.facingAngle = pb.atan2(this.facing.y, this.facing.x);\r\n // Wind: sample the push for this frame and the last one, and turn the facing\r\n // downwind by it; the vertex shader rebuilds both frames for motion vectors\r\n this.$l.windPush = WindField.shaderPush(\r\n this,\r\n this.xz,\r\n this.wind.at(0),\r\n this.wind.at(1),\r\n this.wind.at(2),\r\n this.wind.at(3)\r\n );\r\n this.$l.windPushPrev = WindField.shaderPush(\r\n this,\r\n this.xz,\r\n this.wind.at(4),\r\n this.wind.at(5),\r\n this.wind.at(6),\r\n this.wind.at(7)\r\n );\r\n this.$l.facingNow = this.facingAngle;\r\n this.$l.facingPrev = this.facingAngle;\r\n this.$l.bladeDir = pb.vec2(pb.cos(this.facingAngle), pb.sin(this.facingAngle));\r\n const turn = (\r\n scope: PBInsideFunctionScope,\r\n out: string,\r\n push: string,\r\n dir: PBShaderExp\r\n ) => {\r\n scope.$if(\r\n pb.and(pb.greaterThan(scope[push], 0), pb.greaterThan(pb.dot(dir, dir), 1e-6)),\r\n function () {\r\n this[out] = pb.add(\r\n this.facingAngle,\r\n pb.mul(\r\n pb.atan2(\r\n pb.sub(pb.mul(this.bladeDir.x, dir.y), pb.mul(this.bladeDir.y, dir.x)),\r\n pb.dot(this.bladeDir, dir)\r\n ),\r\n pb.clamp(pb.mul(this[push], this.clump1.y), 0, 1)\r\n )\r\n );\r\n }\r\n );\r\n };\r\n turn(this, 'facingNow', 'windPush', this.wind.at(0).xy);\r\n turn(this, 'facingPrev', 'windPushPrev', this.wind.at(4).xy);\r\n // Terrain normal under the blade (central differences of the height map, as\r\n // in ClipmapGrassMaterial), x and z quantized to 12 bits each and packed into\r\n // an integer a float holds exactly. Distant blades shade toward it.\r\n this.$l.texel = pb.div(pb.vec2(1), this.heightInfo.xy);\r\n this.$l.sampleDist = pb.mul(this.regionSize, pb.mul(this.texel, 2));\r\n this.$l.hL = pb.textureSampleLevel(\r\n this.heightMap,\r\n pb.sub(this.uv, pb.vec2(this.texel.x, 0)),\r\n 0\r\n ).r;\r\n this.$l.hR = pb.textureSampleLevel(\r\n this.heightMap,\r\n pb.add(this.uv, pb.vec2(this.texel.x, 0)),\r\n 0\r\n ).r;\r\n this.$l.hU = pb.textureSampleLevel(\r\n this.heightMap,\r\n pb.sub(this.uv, pb.vec2(0, this.texel.y)),\r\n 0\r\n ).r;\r\n this.$l.hD = pb.textureSampleLevel(\r\n this.heightMap,\r\n pb.add(this.uv, pb.vec2(0, this.texel.y)),\r\n 0\r\n ).r;\r\n this.$l.terrainNormal = pb.normalize(\r\n pb.vec3(\r\n pb.neg(\r\n pb.div(pb.mul(pb.sub(this.hR, this.hL), this.posScale.y), this.sampleDist.x)\r\n ),\r\n 1,\r\n pb.neg(\r\n pb.div(pb.mul(pb.sub(this.hD, this.hU), this.posScale.y), this.sampleDist.y)\r\n )\r\n )\r\n );\r\n this.$l.quantized = pb.floor(\r\n pb.add(\r\n pb.mul(pb.add(pb.mul(this.terrainNormal.xz, 0.5), pb.vec2(0.5)), 4095),\r\n pb.vec2(0.5)\r\n )\r\n );\r\n this.$l.packedNormal = pb.add(pb.mul(this.quantized.x, 4096), this.quantized.y);\r\n this.$l.first = pb.mul(this.slot, INSTANCE_VEC4.blade);\r\n this.instances.setAt(this.first, pb.vec4(this.base, this.flaggedHash));\r\n this.instances.setAt(\r\n pb.add(this.first, 1),\r\n pb.vec4(this.facingNow, this.facingPrev, this.windPush, this.windPushPrev)\r\n );\r\n this.instances.setAt(\r\n pb.add(this.first, 2),\r\n pb.vec4(this.clumpAngle, this.clumpColor, this.packedNormal, this.bladeHash)\r\n );\r\n this.instances.setAt(\r\n pb.add(this.first, 3),\r\n pb.vec4(this.bladeHeight, this.bladeWidth, this.tilt, this.bend)\r\n );\r\n }\r\n });\r\n }\r\n );\r\n }\r\n );\r\n });\r\n }\r\n })!;\r\n this._programs[kind] = program;\r\n }\r\n return program;\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._densityTexture.dispose();\r\n for (const target of this._targets) {\r\n GrassGpuPlacement.disposeTarget(target);\r\n }\r\n this._targets.length = 0;\r\n this._baseVertexBuffer.dispose();\r\n this._indexBuffer.dispose();\r\n }\r\n}\r\n"],"names":["WORKGROUP_SIZE","MAX_WINDOW_CELLS","GRASS_LOD_FADE_BAND","GRASS_LOD_START","grassDensityLod","drawDistance","farDensity","Math","max","INSTANCE_VEC4","card","blade","BLADE_SEED_BASE","GRASS_BLADE_LOD_BAND","NO_LIMIT","grassBladeLodDistance","lodDistance","GRASS_CULL_PLANES","OCCLUSION_SAMPLES","GrassOcclusionMode","Off","Cull","Debug","grassHash","x","z","seed","h","imul","GrassGpuPlacement","Disposable","_programs","_cameraPos","Vector3","_planes","Float32Array","_densityTexture","_kind","_targets","_baseVertexBuffer","_shape0","_shape1","_clump0","_clump1","_calmWind","_indexBuffer","_args","_window","_forward","_cells","_params","_posScale","_camera","_occlusion","_heightInfo","_densityLod","isSupported","device","getDevice","type","getDeviceCaps","miscCaps","supportDrawIndirect","kind","baseVertexBuffer","indexBuffer","lodIndexCounts","_lodIndexCounts","length","Vector4","DRef","Uint32Array","DEBUG_VIEWS","_window2","_lod","_viewDepth","setBaseVertexBuffer","get","set","target","primitive","dispose","setDensity","width","height","data","tex","createTexture2D","mipmapping","name","bindGroup","bytes","buffer","ArrayBuffer","Uint8Array","update","updateDensityRegion","x0","z0","x1","z1","w","rect","subarray","generate","camera","terrain","cellsPerTexel","bladeWidth","bladeHeight","occlusionMode","bladeShape","windParams","cullPlanes","shadowFade","placementTarget","getTarget","density","heightMap","levels","firstIndex","i","argsBuffer","bufferSubData","edgeArgsBuffer","region","worldRegion","cellsW","cellsH","cellSizeX","cellSizeZ","y","cameraPos","getWorldPosition","centerX","centerZ","drawRadius","Infinity","nearRadius","min","near","cellWindow","far","nearCount","farCount","ensureCapacity","getBindGroup","setXYZW","fadeLength","capacity","m","worldMatrix","forward","setXYZ","m02","m12","m22","inplaceNormalize","dot","lod","maxHeight","abs","maxWidth","radius","sqrt","scale","m13","pyramid","heightPyramid","occlusion","bounds","getWorldBoundingVolume","toAABB","epsilon","maxPoint","minPoint","clipmapTileResolution","mipLevelCount","planes","frustumPlanes","frustum","mask","clipMask","p","enabled","a","b","c","d","setValue","setTexture","getDummyPyramid","fetchSampler","setProgram","getProgram","setBindGroup","compute","ceil","edgeArgs","copyBuffer","radiusX","radiusZ","unit","halfMax","cx","cz","rx","rz","floor","getInstanceBuffer","instanceBuffer","getLowListBase","draw","Primitive","setVertexBuffer","setIndexBuffer","primitiveType","indexStart","indexCount","drawIndirect","undefined","trimTargets","count","disposeTarget","pop","index","push","createBuffer","usage","storage","dynamic","numInstances","nextPowerOf2","createVertexBuffer","managed","createBindGroup","bindGroupLayouts","setBuffer","_dummyPyramid","program","buildComputeProgram","label","workgroupSize","pb","window","vec4","uniform","cells","params","posScale","densityLod","heightInfo","window2","viewDepth","shape0","shape1","clump0","clump1","wind","tex2D","sampleType","occludedFlag","atomic_uint","workgroup","instances","storageBuffer","args","func","uint","$l","compXor","mul","s","sar","$return","float","vec2","size","zw","sub","uv","f","maxIndex","i0","ivec2","clamp","i1","add","texel","scope","textureLoad","r","mix","extent","hi","lo","level","log2","texelSize","exp2","mip","int","textureDimensions","div","rg","main","notEqual","$builtins","globalInvocationId","win","$if","occluded","greaterThan","cellSize","xy","toTexel","g0","workGroupId","g1","fmin","fmax","cam","xz","camY","groupRange","pyramidRange","topY","dNear","dFar","center","groupRadius","sMin","sEnd","camTexel","camGround","and","greaterThanEqual","slope","step","dir","normalize","k","localInvocationId","spread","lodReach","halfSize","pc","lessThanEqual","ground","lessThan","atomicOr","workgroupBarrier","id","or","equal","extra","bseed","block","$choice","uvec2","kept","compAnd","$else","sampleDensity","regionSize","cp","cellBase","bestDist","clumpPoint","clumpCell","cellF","cellU","point","pointDist","dz","dx","clumpCenter","clumpAngle","PI","clumpHeight","clumpColor","textureSampleLevel","base","vec3","dist","distance","xyz","visible","lodHash","keep","smoothStep","viewZ","fadeKeep","at","neg","angle","flaggedHash","slot","atomicAdd","setAt","signedHash","tilt","bend","bladeHash","clumpDir","cos","sin","facing","away","awayLen","facingAngle","atan2","windPush","WindField","shaderPush","windPushPrev","facingNow","facingPrev","bladeDir","turn","out","sampleDist","hL","hR","hU","hD","terrainNormal","quantized","packedNormal","first","onDispose"],"mappings":"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"}
@@ -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 { applyMaterialMixins, MeshMaterial } from '../../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 { RENDER_PASS_TYPE_LIGHT } from '../../values.js';
12
- import { applyMaterialMixins, MeshMaterial } from '../../material/meshmaterial.js';
13
14
  import '../../material/hair.js';
14
15
  import '../../material/hairstrand.js';
15
16
  import '../../material/grassmaterial.js';
@@ -23,7 +24,9 @@ import '../../material/sprite_std.js';
23
24
  import '../../utility/blueprint/material/texture.js';
24
25
  import { mixinPBRMetallicRoughness } from '../../material/mixins/lightmodel/pbrmetallicroughness.js';
25
26
  import { mixinFoliage } from '../../material/mixins/foliage.js';
27
+ import { WindField } from '../wind.js';
26
28
  import { fetchSampler } from '../../utility/misc.js';
29
+ import { grassDensityLod, GRASS_LOD_FADE_BAND } from './grass_gpu.js';
27
30
 
28
31
  /**
29
32
  * Terrain grass material
@@ -33,6 +36,13 @@ import { fetchSampler } from '../../utility/misc.js';
33
36
  /** @internal */ _terrainPosScale;
34
37
  /** @internal */ _heightMapSize;
35
38
  /** @internal */ _textureSize;
39
+ /** @internal */ _distanceFade;
40
+ /** (density falloff start distance, density at the draw distance) @internal */ _densityLod;
41
+ /** (wind lean, sway amplitude, sway speed, unused) @internal */ _wind;
42
+ /** Scene wind of the current and the previous frame, see WindField.shaderParams @internal */ _windParams;
43
+ /** @internal */ _drawDistance;
44
+ /** @internal */ _farDensity;
45
+ /** @internal */ static FEATURE_OCCLUSION_DEBUG = this.defineFeature();
36
46
  /**
37
47
  * Creates an instance of GrassMaterial class
38
48
  * @param terrain - Clipmap terrain object
@@ -48,6 +58,13 @@ import { fetchSampler } from '../../utility/misc.js';
48
58
  this._terrainPosScale = new Vector4();
49
59
  this._heightMapSize = new Vector2(1 / terrain.heightMap.width, 1 / terrain.heightMap.height);
50
60
  this._textureSize = Vector2.one();
61
+ this._distanceFade = new Vector2(0, 0);
62
+ this._densityLod = new Vector2(0, 1);
63
+ this._wind = new Vector4(0.5, 0.15, 2.5, 0);
64
+ this._windParams = new Float32Array(32);
65
+ this._drawDistance = 0;
66
+ this._farDensity = 1;
67
+ this.useFeature(ClipmapGrassMaterial.FEATURE_OCCLUSION_DEBUG, false);
51
68
  }
52
69
  clone() {
53
70
  const other = new ClipmapGrassMaterial(this._terrain.get());
@@ -59,6 +76,100 @@ import { fetchSampler } from '../../utility/misc.js';
59
76
  this._terrainPosScale.set(other._terrainPosScale);
60
77
  this._heightMapSize.set(other._heightMapSize);
61
78
  this._textureSize.set(other._textureSize);
79
+ this._distanceFade.set(other._distanceFade);
80
+ this._densityLod.set(other._densityLod);
81
+ this._wind.set(other._wind);
82
+ this._drawDistance = other._drawDistance;
83
+ this._farDensity = other._farDensity;
84
+ }
85
+ /**
86
+ * Sets the distance beyond which blades are not drawn. Blades shrink into the ground over
87
+ * the last quarter of it so that they do not pop out. Zero or less disables the fade.
88
+ * @internal
89
+ */ setDrawDistance(distance) {
90
+ this._drawDistance = distance;
91
+ this.updateDistanceParams();
92
+ }
93
+ /**
94
+ * Sets the fraction of blades kept at the draw distance, see GrassLayer.farDensity
95
+ * @internal
96
+ */ setFarDensity(farDensity) {
97
+ this._farDensity = farDensity;
98
+ this.updateDistanceParams();
99
+ }
100
+ /**
101
+ * Updates the scene wind before drawing. Taken from the scene rather than the draw context:
102
+ * the depth prepass and the light pass must bend the cards by the same wind or the light pass's
103
+ * equal depth test rejects them.
104
+ * @internal
105
+ */ prepareDraw(wind) {
106
+ const params = wind?.shaderParams;
107
+ const p = this._windParams;
108
+ let changed = false;
109
+ for(let i = 0; i < p.length; i++){
110
+ const val = params ? params[i] : 0;
111
+ if (p[i] !== val) {
112
+ p[i] = val;
113
+ changed = true;
114
+ }
115
+ }
116
+ if (changed) {
117
+ this.uniformChanged();
118
+ }
119
+ }
120
+ /**
121
+ * How far the wind lays the cards over toward lying flat, per unit of wind push. 0 leaves them
122
+ * standing.
123
+ */ get windLean() {
124
+ return this._wind.x;
125
+ }
126
+ set windLean(val) {
127
+ val = Math.min(4, Math.max(0, val));
128
+ if (val !== this._wind.x) {
129
+ this._wind.x = val;
130
+ this.uniformChanged();
131
+ }
132
+ }
133
+ /** How far the card tops bob in the wind, as a fraction of the card height per unit of push */ get swayAmplitude() {
134
+ return this._wind.y;
135
+ }
136
+ set swayAmplitude(val) {
137
+ val = Math.min(1, Math.max(0, val));
138
+ if (val !== this._wind.y) {
139
+ this._wind.y = val;
140
+ this.uniformChanged();
141
+ }
142
+ }
143
+ /** How fast the cards bob in the wind, in radians per second */ get swaySpeed() {
144
+ return this._wind.z;
145
+ }
146
+ set swaySpeed(val) {
147
+ val = Math.min(50, Math.max(0, val));
148
+ if (val !== this._wind.z) {
149
+ this._wind.z = val;
150
+ this.uniformChanged();
151
+ }
152
+ }
153
+ /** @internal */ updateDistanceParams() {
154
+ const distance = this._drawDistance;
155
+ const start = distance > 0 ? distance * 0.75 : 0;
156
+ const end = distance > 0 ? distance : 0;
157
+ const lod = grassDensityLod(distance, this._farDensity);
158
+ if (this._distanceFade.x !== start || this._distanceFade.y !== end || this._densityLod.x !== lod[0] || this._densityLod.y !== lod[1]) {
159
+ this._distanceFade.setXY(start, end);
160
+ this._densityLod.setXY(lod[0], lod[1]);
161
+ this.uniformChanged();
162
+ }
163
+ }
164
+ /**
165
+ * Tints the blades the GPU placement pass flagged as hidden behind terrain red, instead of
166
+ * leaving them out. Debugging aid for the terrain occlusion culling.
167
+ * @internal
168
+ */ get occlusionDebug() {
169
+ return !!this.featureUsed(ClipmapGrassMaterial.FEATURE_OCCLUSION_DEBUG);
170
+ }
171
+ set occlusionDebug(val) {
172
+ this.useFeature(ClipmapGrassMaterial.FEATURE_OCCLUSION_DEBUG, !!val);
62
173
  }
63
174
  setTextureSize(w, h) {
64
175
  this._textureSize.setXY(w, h);
@@ -86,10 +197,17 @@ import { fetchSampler } from '../../utility/misc.js';
86
197
  super.applyUniformValues(bindGroup, ctx, pass);
87
198
  const terrain = this._terrain.get();
88
199
  this._terrainPosScale.setXYZW(terrain.scale.x, terrain.scale.y, terrain.scale.z, terrain.worldMatrix.m13);
89
- bindGroup.setTexture('terrainHeightMap', terrain.heightMap, fetchSampler('clamp_linear_nomip'));
200
+ const heightMap = terrain.heightMap;
201
+ // The height map can be resized or replaced after construction
202
+ this._heightMapSize.setXY(1 / heightMap.width, 1 / heightMap.height);
203
+ bindGroup.setTexture('terrainHeightMap', heightMap, fetchSampler('clamp_linear_nomip'));
90
204
  bindGroup.setValue('heightMapSize', this._heightMapSize);
91
205
  bindGroup.setValue('terrainRegion', terrain.worldRegion);
92
206
  bindGroup.setValue('terrainPosScale', this._terrainPosScale);
207
+ bindGroup.setValue('distanceFade', this._distanceFade);
208
+ bindGroup.setValue('densityLod', this._densityLod);
209
+ bindGroup.setValue('zCardWind', this._wind);
210
+ bindGroup.setValue('zWind', this._windParams);
93
211
  if (this.needFragmentColor(ctx)) {
94
212
  bindGroup.setValue('albedoTextureSize', this._textureSize);
95
213
  }
@@ -104,17 +222,25 @@ import { fetchSampler } from '../../utility/misc.js';
104
222
  scope.heightMapSize = pb.vec2().uniform(2);
105
223
  scope.terrainRegion = pb.vec4().uniform(2);
106
224
  scope.terrainPosScale = pb.vec4().uniform(2);
225
+ scope.distanceFade = pb.vec2().uniform(2);
226
+ scope.densityLod = pb.vec2().uniform(2);
227
+ // (wind lean, sway amplitude, sway speed, unused)
228
+ scope.zCardWind = pb.vec4().uniform(2);
229
+ // Scene wind, current frame then previous frame, see WindField.shaderParams
230
+ scope.zWind = pb.vec4[8]().uniform(2);
107
231
  pb.func('calcHeightMapNormal', [
108
232
  pb.vec2('uv'),
109
233
  pb.vec2('texelSize'),
110
234
  pb.vec3('scale')
111
235
  ], function() {
236
+ // World-space distance between the two samples of each central difference
237
+ this.$l.sampleDist = pb.mul(pb.sub(this.terrainRegion.zw, this.terrainRegion.xy), pb.mul(this.texelSize, 2));
112
238
  this.$l.hL = pb.textureSampleLevel(this.terrainHeightMap, pb.sub(this.uv, pb.vec2(this.texelSize.x, 0)), 0).r;
113
239
  this.$l.hR = pb.textureSampleLevel(this.terrainHeightMap, pb.add(this.uv, pb.vec2(this.texelSize.x, 0)), 0).r;
114
240
  this.$l.hD = pb.textureSampleLevel(this.terrainHeightMap, pb.add(this.uv, pb.vec2(0, this.texelSize.y)), 0).r;
115
241
  this.$l.hU = pb.textureSampleLevel(this.terrainHeightMap, pb.sub(this.uv, pb.vec2(0, this.texelSize.y)), 0).r;
116
- this.$l.dHdU = pb.div(pb.mul(pb.sub(this.hR, this.hL), this.scale.y), pb.mul(this.scale.x, 2));
117
- this.$l.dHdV = pb.div(pb.mul(pb.sub(this.hD, this.hU), this.scale.y), pb.mul(this.scale.z, 2));
242
+ this.$l.dHdU = pb.div(pb.mul(pb.sub(this.hR, this.hL), this.scale.y), this.sampleDist.x);
243
+ this.$l.dHdV = pb.div(pb.mul(pb.sub(this.hD, this.hU), this.scale.y), this.sampleDist.y);
118
244
  this.t = pb.normalize(pb.vec3(1, this.dHdU, 0));
119
245
  this.b = pb.normalize(pb.vec3(0, this.dHdV, 1));
120
246
  this.$return(pb.normalize(pb.cross(this.b, this.t)));
@@ -123,16 +249,58 @@ import { fetchSampler } from '../../utility/misc.js';
123
249
  scope.$l.heightSample = pb.textureSampleLevel(scope.terrainHeightMap, scope.uv, 0);
124
250
  scope.$l.height = pb.add(pb.mul(scope.heightSample.r, scope.terrainPosScale.y), scope.terrainPosScale.w);
125
251
  scope.$l.normal = scope.calcHeightMapNormal(scope.uv, scope.heightMapSize, scope.terrainPosScale.xyz);
126
- scope.$l.axisX = pb.vec3(scope.$inputs.placement.z, 0, scope.$inputs.placement.w);
252
+ // placement: (u, v, facing angle, density LOD hash); the GPU placement pass adds 2 to the
253
+ // hash of blades it flags as occluded
254
+ scope.$l.occluded = pb.step(1.5, scope.$inputs.placement.w);
255
+ if (this.occlusionDebug) {
256
+ scope.$outputs.occludedFlag = scope.occluded;
257
+ }
258
+ scope.$l.lodHash = pb.mul(pb.sub(scope.$inputs.placement.w, pb.mul(scope.occluded, 2)), 1 - GRASS_LOD_FADE_BAND);
259
+ scope.$l.axisX = pb.vec3(pb.sin(scope.$inputs.placement.z), 0, pb.cos(scope.$inputs.placement.z));
127
260
  scope.$l.axisZ = pb.cross(scope.axisX, scope.normal);
128
261
  scope.$l.axisX = pb.cross(scope.normal, scope.axisZ);
129
- scope.$l.rotPos = pb.mul(pb.mat3(scope.axisX, scope.normal, scope.axisZ), scope.$inputs.pos);
130
262
  scope.$l.posXZ = pb.add(pb.mul(scope.$inputs.placement.xy, pb.sub(scope.terrainRegion.zw, scope.terrainRegion.xy)), scope.terrainRegion.xy);
263
+ // (width scale, overall scale)
264
+ scope.$l.bladeScale = pb.vec2(1);
265
+ scope.$if(pb.greaterThan(scope.distanceFade.y, 0), function() {
266
+ this.$l.bladeDist = pb.distance(ShaderHelper.getCameraPosition(this), pb.vec3(this.posXZ.x, this.height, this.posXZ.y));
267
+ // Density LOD: the fraction of blades kept falls with distance and each blade leaves as
268
+ // it drops below its own hash, shrinking over a narrow band on the way. The survivors
269
+ // widen by the inverse of the fraction to keep the coverage. Mirrors the GPU placement
270
+ // pass, which skips the blades whose scale reaches zero here.
271
+ this.$l.keep = pb.mix(1, this.densityLod.y, pb.smoothStep(this.densityLod.x, this.distanceFade.y, this.bladeDist));
272
+ this.bladeScale = pb.vec2(pb.div(1, this.keep), pb.mul(pb.sub(1, pb.smoothStep(this.distanceFade.x, this.distanceFade.y, this.bladeDist)), pb.clamp(pb.div(pb.sub(this.keep, this.lodHash), GRASS_LOD_FADE_BAND), 0, 1)));
273
+ });
274
+ scope.$l.localPos = pb.mul(pb.vec3(pb.mul(scope.$inputs.pos.x, scope.bladeScale.x), scope.$inputs.pos.y, pb.mul(scope.$inputs.pos.z, scope.bladeScale.x)), scope.bladeScale.y);
275
+ scope.$l.rotPos = pb.mul(pb.mat3(scope.axisX, scope.normal, scope.axisZ), scope.localPos);
276
+ scope.$l.basePos = pb.vec3(scope.posXZ.x, scope.height, scope.posXZ.y);
131
277
  scope.$outputs.zAlbedoTexCoord = scope.$inputs.albedoUV;
132
- scope.$outputs.worldPos = pb.add(scope.rotPos, pb.vec3(scope.posXZ.x, scope.height, scope.posXZ.y));
278
+ scope.$outputs.worldPos = pb.add(scope.basePos, scope.rotPos, this.emitCardWind(scope, 0));
133
279
  ShaderHelper.setClipSpacePosition(scope, pb.mul(ShaderHelper.getViewProjectionMatrix(scope), pb.vec4(scope.$outputs.worldPos, 1)));
134
280
  scope.$outputs.worldNorm = scope.normal;
135
- ShaderHelper.resolveMotionVector(scope, scope.$outputs.worldPos, scope.$outputs.worldPos);
281
+ if (ShaderHelper.getPrevUnjitteredViewProjectionMatrix(scope)) {
282
+ // Where this vertex was last frame, for the motion vectors: bent by last frame's wind
283
+ scope.$l.prevWorldPos = pb.add(scope.basePos, scope.rotPos, this.emitCardWind(scope, 4));
284
+ ShaderHelper.resolveMotionVector(scope, scope.$outputs.worldPos, scope.prevWorldPos);
285
+ }
286
+ }
287
+ /**
288
+ * Returns the world offset the wind moves the current vertex of a card by, for the wind of the
289
+ * frame whose parameters start at `frame` in zWind.
290
+ *
291
+ * The card turns about its base toward the wind: by a lean that grows with the wind push, plus
292
+ * a sine sway whose phase comes from the card's facing hash, both scaled by the push as for the
293
+ * procedural blades (ClipmapBladeGrassMaterial). Turning keeps the card's length, so its top
294
+ * drops as it leans.
295
+ */ emitCardWind(scope, frame) {
296
+ const pb = scope.$builder;
297
+ const v = (name)=>`${name}${frame}`;
298
+ scope.$l[v('windPush')] = WindField.shaderPush(scope, scope.posXZ, scope.zWind.at(frame), scope.zWind.at(frame + 1), scope.zWind.at(frame + 2), scope.zWind.at(frame + 3));
299
+ scope.$l[v('windAngle')] = pb.add(pb.mul(pb.clamp(pb.mul(scope[v('windPush')], scope.zCardWind.x), 0, 0.95), Math.PI * 0.5), pb.mul(scope.zCardWind.y, scope[v('windPush')], // Wind clock in the fourth vec4 of the frame
300
+ pb.sin(pb.add(pb.mul(scope.zWind.at(frame + 3).y, scope.zCardWind.z), scope.$inputs.placement.z))));
301
+ // Height of the vertex above the card's base
302
+ const y = scope.localPos.y;
303
+ return pb.add(pb.mul(pb.vec3(scope.zWind.at(frame).x, 0, scope.zWind.at(frame).y), pb.mul(y, pb.sin(scope[v('windAngle')]))), pb.vec3(0, pb.mul(y, pb.sub(pb.cos(scope[v('windAngle')]), 1)), 0));
136
304
  }
137
305
  fragmentShader(scope) {
138
306
  super.fragmentShader(scope);
@@ -142,6 +310,9 @@ import { fetchSampler } from '../../utility/misc.js';
142
310
  scope.albedoTextureSize = pb.vec2().uniform(2);
143
311
  scope.$l.albedo = this.calculateAlbedoColor(scope);
144
312
  scope.albedo = that.calculateFoliageAlbedo(scope, scope.albedo, pb.mul(that.getAlbedoTexCoord(scope), scope.albedoTextureSize));
313
+ if (this.occlusionDebug) {
314
+ scope.albedo = pb.vec4(pb.mix(scope.albedo.rgb, pb.vec3(1, 0, 0), scope.$inputs.occludedFlag), scope.albedo.a);
315
+ }
145
316
  scope.$l.litColor = pb.vec3(0);
146
317
  if (this.drawContext.renderPass.type === RENDER_PASS_TYPE_LIGHT) {
147
318
  scope.$l.normalInfo = this.calculateNormalAndTBN(scope, scope.$inputs.worldPos, scope.$inputs.worldNorm);