@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,380 @@
1
+ import { Disposable, DRef, Vector3, Vector2, Matrix4x4, Vector4 } from '@zephyr3d/base';
2
+ import { getDevice } from '../../app/api.js';
3
+ import { getTransmittanceLut, getMultiScatteringLut, getAtmosphereParamsStruct } from '../../shaders/atmosphere.js';
4
+ import { fetchSampler } from '../../utility/misc.js';
5
+ import { uniformSphereSamples } from '../../values.js';
6
+ import { CLOUD_BASE_VIEW_SAMPLE_COUNT, CLOUD_VIEW_SAMPLE_COUNT_MAX, CLOUD_BASE_SHADOW_SAMPLE_COUNT, CLOUD_SHADOW_SAMPLE_COUNT_MAX, cloudCoverageThreshold, CLOUD_TOP_OFFSET, getCloudParamsStruct, cloudCacheDecode, cloudTrace, cloudDistantSkyLight } from './cloud_common.js';
7
+
8
+ /*
9
+ * Volumetric clouds cached over the sky hemisphere, after clayjohn's
10
+ * godot-volumetric-cloud-demo-v2 (cloud_sky.gd): the clouds seen from below the layer depend on
11
+ * the view direction only, so they are traced into an octahedral map of the hemisphere one block
12
+ * per frame. Three maps rotate: one is being written while the sky blends between the two that
13
+ * were completed last, by the progress of the one being written. Every input of a round (eye,
14
+ * sun, time, parameters) is frozen when it starts so the blocks of one map agree.
15
+ */ /** A rebuild needs enough steps to resolve cloud edges before the regular rounds finish. */ const REBUILD_STEP_SCALE = 0.5;
16
+ /** Margin added below the horizon dip, radians */ const HORIZON_MARGIN = Math.PI / 180;
17
+ let traceProgram = [
18
+ null,
19
+ null,
20
+ null
21
+ ];
22
+ let ambientProgram = null;
23
+ function getTraceProgram(msOctaves) {
24
+ let program = traceProgram[msOctaves];
25
+ if (!program) {
26
+ const msCount = 1 + msOctaves;
27
+ program = getDevice().buildComputeProgram({
28
+ label: `VolumetricCloudSkyCache${msCount}`,
29
+ workgroupSize: [
30
+ 8,
31
+ 8,
32
+ 1
33
+ ],
34
+ compute (pb) {
35
+ const AtmosphereParams = getAtmosphereParamsStruct(pb);
36
+ const CloudParams = getCloudParamsStruct(pb);
37
+ this.atmo = AtmosphereParams().uniform(0);
38
+ this.cloud = CloudParams().uniform(0);
39
+ // (block origin x, y, cache size, step scale)
40
+ this.block = pb.vec4().uniform(0);
41
+ // (delta, 0, 0, 0)
42
+ this.cacheParams = pb.vec4().uniform(0);
43
+ this.weatherMap = pb.tex2D().uniform(0);
44
+ this.baseNoise = pb.tex3D().uniform(0);
45
+ this.detailNoise = pb.tex3D().uniform(0);
46
+ this.tLut = pb.tex2D().uniform(0);
47
+ this.msLut = pb.tex2D().uniform(0);
48
+ this.ambientTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);
49
+ this.dst = pb.texStorage2D.rgba16float().storage(0);
50
+ pb.main(function() {
51
+ this.$l.texel = pb.add(pb.uvec2(this.block.xy), this.$builtins.globalInvocationId.xy);
52
+ this.$l.uv = pb.div(pb.add(pb.vec2(this.texel), pb.vec2(0.5)), this.block.z);
53
+ this.$l.dir = cloudCacheDecode(this, this.uv, this.cacheParams.x);
54
+ this.$l.ambient = pb.textureLoad(this.ambientTex, pb.ivec2(0), 0).rgb;
55
+ // Every cache texel is traced once per round, so a fixed screen-space noise phase
56
+ // survives the map blend as a visible grid. Sample each segment at its midpoint.
57
+ this.$l.jitter = pb.float(0.5);
58
+ this.$l.result = cloudTrace(this, msCount, this.atmo, this.cloud, this.dir, this.jitter, this.block.w, this.ambient, {
59
+ weatherMap: this.weatherMap,
60
+ baseNoise: this.baseNoise,
61
+ detailNoise: this.detailNoise,
62
+ transmittanceLut: this.tLut,
63
+ multiScatteringLut: this.msLut
64
+ });
65
+ pb.textureStore(this.dst, this.texel, this.result);
66
+ });
67
+ }
68
+ });
69
+ traceProgram[msOctaves] = program;
70
+ }
71
+ return program;
72
+ }
73
+ function getAmbientProgram() {
74
+ if (!ambientProgram) {
75
+ ambientProgram = getDevice().buildComputeProgram({
76
+ label: 'VolumetricCloudDistantSkyLight',
77
+ workgroupSize: [
78
+ 1,
79
+ 1,
80
+ 1
81
+ ],
82
+ compute (pb) {
83
+ const AtmosphereParams = getAtmosphereParamsStruct(pb);
84
+ this.atmo = AtmosphereParams().uniform(0);
85
+ this.sphereSamples = pb.vec4[64]().uniformBuffer(0);
86
+ this.tLut = pb.tex2D().uniform(0);
87
+ this.msLut = pb.tex2D().uniform(0);
88
+ this.dst = pb.texStorage2D.rgba16float().storage(0);
89
+ pb.main(function() {
90
+ this.$l.light = cloudDistantSkyLight(this, this.atmo, this.sphereSamples, this.tLut, this.msLut);
91
+ pb.textureStore(this.dst, pb.uvec2(0), pb.vec4(this.light, 1));
92
+ });
93
+ }
94
+ });
95
+ }
96
+ return ambientProgram;
97
+ }
98
+ function cloneAtmosphere(p) {
99
+ return {
100
+ ...p,
101
+ groundAlbedo: new Vector3(p.groundAlbedo),
102
+ cameraWorldMatrix: new Matrix4x4(p.cameraWorldMatrix),
103
+ lightDir: new Vector3(p.lightDir),
104
+ lightColor: new Vector4(p.lightColor),
105
+ skyViewReferential: new Matrix4x4(p.skyViewReferential)
106
+ };
107
+ }
108
+ /**
109
+ * Octahedral hemisphere cache of the volumetric clouds.
110
+ * @internal
111
+ */ class VolumetricCloudSkyCache extends Disposable {
112
+ _maps;
113
+ _ambient;
114
+ /** Elevation remap each map was traced with */ _deltas;
115
+ _writeIndex;
116
+ _fromIndex;
117
+ _toIndex;
118
+ _frame;
119
+ _framesPerUpdate;
120
+ _resolution;
121
+ _inputs;
122
+ _rebuild;
123
+ _bindGroups;
124
+ _sphereSamplesUploaded;
125
+ /** Set when a round completed this frame, i.e. the blended sky changed source maps */ roundCompleted;
126
+ constructor(){
127
+ super();
128
+ this._maps = [
129
+ new DRef(),
130
+ new DRef(),
131
+ new DRef()
132
+ ];
133
+ this._ambient = new DRef();
134
+ this._deltas = [
135
+ 0,
136
+ 0,
137
+ 0
138
+ ];
139
+ this._writeIndex = 0;
140
+ this._fromIndex = 1;
141
+ this._toIndex = 2;
142
+ this._frame = 0;
143
+ this._framesPerUpdate = 0;
144
+ this._resolution = 0;
145
+ this._inputs = null;
146
+ this._rebuild = true;
147
+ this._bindGroups = new Map();
148
+ this._sphereSamplesUploaded = false;
149
+ this.roundCompleted = false;
150
+ }
151
+ /** Older of the two completed maps the sky blends from */ get fromMap() {
152
+ return this._maps[this._fromIndex].get();
153
+ }
154
+ /** Newer of the two completed maps the sky blends to */ get toMap() {
155
+ return this._maps[this._toIndex].get();
156
+ }
157
+ get fromDelta() {
158
+ return this._deltas[this._fromIndex];
159
+ }
160
+ get toDelta() {
161
+ return this._deltas[this._toIndex];
162
+ }
163
+ /** Progress of the round in flight, the weight of {@link VolumetricCloudSkyCache.toMap} */ get blend() {
164
+ return this._framesPerUpdate > 0 ? this._frame / this._framesPerUpdate : 1;
165
+ }
166
+ /** Frozen density inputs, shared with density debug slices. */ get densityParams() {
167
+ return this._inputs?.cloud ?? null;
168
+ }
169
+ /** Forces the next update to rebuild the whole cache at once. */ invalidate() {
170
+ this._rebuild = true;
171
+ }
172
+ /**
173
+ * Advances the cache by one block, or rebuilds it at once when the inputs changed too much for
174
+ * a gradual update.
175
+ *
176
+ * @param atmosphere - Current atmosphere parameters (observer frame, sun, luminance units)
177
+ * @param cameraPos - Camera world position
178
+ * @param time - Seconds, drives the wind
179
+ */ update(params, resources, atmosphere, cameraPos, time) {
180
+ this.roundCompleted = false;
181
+ if (!resources.baseNoise || !resources.detailNoise || !resources.weatherMap) {
182
+ return;
183
+ }
184
+ if (params.cacheResolution !== this._resolution || params.framesPerUpdate !== this._framesPerUpdate) {
185
+ this._resolution = params.cacheResolution;
186
+ this._framesPerUpdate = params.framesPerUpdate;
187
+ for (const map of this._maps){
188
+ map.dispose();
189
+ }
190
+ this._rebuild = true;
191
+ }
192
+ this._ensureMaps();
193
+ if (!this._rebuild && this._inputs && this._needsRebuild(params, atmosphere, cameraPos)) {
194
+ this._rebuild = true;
195
+ }
196
+ if (this._rebuild) {
197
+ this._rebuild = false;
198
+ // Two rounds, as clayjohn's initialize_sky(): fills the map blended from and the one
199
+ // blended to, then the regular rounds take over at full quality
200
+ for(let round = 0; round < 2; round++){
201
+ this._startRound(params, atmosphere, cameraPos, time);
202
+ for(let i = 0; i < this._framesPerUpdate; i++){
203
+ this._traceBlock(resources, i, REBUILD_STEP_SCALE);
204
+ }
205
+ this._completeRound();
206
+ }
207
+ this._startRound(params, atmosphere, cameraPos, time);
208
+ this.roundCompleted = true;
209
+ return;
210
+ }
211
+ this._traceBlock(resources, this._frame, 1);
212
+ this._frame++;
213
+ if (this._frame >= this._framesPerUpdate) {
214
+ this._completeRound();
215
+ this._startRound(params, atmosphere, cameraPos, time);
216
+ this.roundCompleted = true;
217
+ }
218
+ }
219
+ onDispose() {
220
+ super.onDispose();
221
+ for (const map of this._maps){
222
+ map.dispose();
223
+ }
224
+ this._ambient.dispose();
225
+ for (const bindGroup of this._bindGroups.values()){
226
+ bindGroup.dispose();
227
+ }
228
+ this._bindGroups.clear();
229
+ }
230
+ _ensureMaps() {
231
+ const device = getDevice();
232
+ for(let i = 0; i < 3; i++){
233
+ if (!this._maps[i].get()) {
234
+ const tex = device.createTexture2D('rgba16f', this._resolution, this._resolution, {
235
+ writable: true,
236
+ // A storage binding takes a single level
237
+ mipmapping: false,
238
+ samplerOptions: {
239
+ addressU: 'clamp',
240
+ addressV: 'clamp',
241
+ mipFilter: 'none'
242
+ }
243
+ });
244
+ tex.name = `VolumetricCloudSkyCache${i}`;
245
+ this._maps[i].set(tex);
246
+ }
247
+ }
248
+ if (!this._ambient.get()) {
249
+ const tex = device.createTexture2D('rgba16f', 1, 1, {
250
+ writable: true,
251
+ mipmapping: false
252
+ });
253
+ tex.name = 'VolumetricCloudDistantSkyLight';
254
+ this._ambient.set(tex);
255
+ }
256
+ }
257
+ _needsRebuild(params, atmosphere, cameraPos) {
258
+ const inputs = this._inputs;
259
+ if (params.version !== inputs.version || params.msOctaves !== inputs.msOctaves) {
260
+ return true;
261
+ }
262
+ // A sudden sun change would otherwise fade in over two rounds
263
+ if (Vector3.dot(atmosphere.lightDir, inputs.sunDir) < Math.cos(5 * Math.PI / 180)) {
264
+ return true;
265
+ }
266
+ // A camera jump far enough for the clouds to visibly shift: about ten texels of parallax
267
+ // under the cloud base
268
+ const scale = atmosphere.cameraHeightScale;
269
+ const moved = Vector3.distance(cameraPos, inputs.cameraPos) * scale;
270
+ return moved > params.layerBottomAltitude * 0.017;
271
+ }
272
+ _bindGroup(program) {
273
+ let bindGroup = this._bindGroups.get(program);
274
+ if (!bindGroup) {
275
+ bindGroup = getDevice().createBindGroup(program.bindGroupLayouts[0]);
276
+ this._bindGroups.set(program, bindGroup);
277
+ }
278
+ return bindGroup;
279
+ }
280
+ _startRound(params, atmosphere, cameraPos, time) {
281
+ const atmo = cloneAtmosphere(atmosphere);
282
+ const R = atmo.plantRadius;
283
+ const eyeHeight = R + atmo.observerAltitude;
284
+ // Horizon dip of the raised observer plus a margin
285
+ const delta = Math.acos(Math.min(1, R / eyeHeight)) + HORIZON_MARGIN;
286
+ const bottom = R + params.layerBottomAltitude;
287
+ const top = bottom + params.layerHeight;
288
+ const wind = params.wind;
289
+ const windSpeed = Math.hypot(wind.x, wind.y);
290
+ const windDir = windSpeed > 0 ? new Vector2(wind.x / windSpeed, wind.y / windSpeed) : new Vector2(1, 0);
291
+ const sunIlluminance = new Vector3(atmo.lightColor.x, atmo.lightColor.y, atmo.lightColor.z).scaleBy(atmo.lightColor.w);
292
+ this._inputs = {
293
+ atmosphere: atmo,
294
+ cloud: {
295
+ referential: new Matrix4x4(atmo.skyViewReferential),
296
+ layer: new Vector4(bottom, top, R, params.tracingMaxDistance),
297
+ march: new Vector4(Math.min(CLOUD_BASE_VIEW_SAMPLE_COUNT * params.viewSampleCountScale, CLOUD_VIEW_SAMPLE_COUNT_MAX), Math.max(1, Math.round(Math.min(CLOUD_BASE_SHADOW_SAMPLE_COUNT * params.shadowSampleCountScale, CLOUD_SHADOW_SAMPLE_COUNT_MAX))), params.shadowTracingDistance, params.stopTracingTransmittanceThreshold),
298
+ eye: new Vector4(0, eyeHeight, 0, 0),
299
+ sunDir: new Vector4(atmo.lightDir.x, atmo.lightDir.y, atmo.lightDir.z, params.perSampleAtmosphericLightTransmittance ? 1 : 0),
300
+ sunIlluminance: new Vector4(sunIlluminance.x, sunIlluminance.y, sunIlluminance.z, 0),
301
+ phase: new Vector4(params.phaseG, params.phaseG2, params.phaseBlend, 1 - params.skyLightCloudBottomOcclusion),
302
+ ms: new Vector4(params.msContribution, params.msOcclusion, params.msEccentricity, 0),
303
+ density: new Vector4(cloudCoverageThreshold(params.coverage, params.formation), params.density, params.detailErosion, params.anvilBias),
304
+ shape: new Vector4(params.shapeStrength, params.detailBottomErosion, params.coverage, params.baseHeightVariation),
305
+ albedo: new Vector4(params.albedo.x, params.albedo.y, params.albedo.z, 0),
306
+ scales: new Vector4(1 / params.weatherMapScale, 1 / params.baseNoiseScale, 1 / params.detailNoiseScale, CLOUD_TOP_OFFSET),
307
+ // [Schneider15]: drift along the wind, rising at a tenth of its speed
308
+ windOffset: new Vector4(wind.x * time, windSpeed * 0.1 * time, wind.y * time, 0),
309
+ windDir: new Vector4(windDir.x, windDir.y, params.formation === 'isolated' ? 1 : 0, 0)
310
+ },
311
+ delta,
312
+ msOctaves: params.msOctaves,
313
+ version: params.version,
314
+ sunDir: new Vector3(atmo.lightDir),
315
+ cameraPos: new Vector3(cameraPos)
316
+ };
317
+ this._deltas[this._writeIndex] = delta;
318
+ this._frame = 0;
319
+ this._traceAmbient();
320
+ }
321
+ _completeRound() {
322
+ // The map just written becomes the newest; the oldest is written next
323
+ const oldFrom = this._fromIndex;
324
+ this._fromIndex = this._toIndex;
325
+ this._toIndex = this._writeIndex;
326
+ this._writeIndex = oldFrom;
327
+ this._frame = 0;
328
+ }
329
+ _traceAmbient() {
330
+ const device = getDevice();
331
+ const program = getAmbientProgram();
332
+ const bindGroup = this._bindGroup(program);
333
+ if (!this._sphereSamplesUploaded) {
334
+ const data = new Float32Array(64 * 4);
335
+ for(let i = 0; i < 64; i++){
336
+ data[i * 4 + 0] = uniformSphereSamples[i].x;
337
+ data[i * 4 + 1] = uniformSphereSamples[i].y;
338
+ data[i * 4 + 2] = uniformSphereSamples[i].z;
339
+ }
340
+ bindGroup.getBuffer('sphereSamples', false).bufferSubData(0, data);
341
+ this._sphereSamplesUploaded = true;
342
+ }
343
+ bindGroup.setValue('atmo', this._inputs.atmosphere);
344
+ bindGroup.setTexture('tLut', getTransmittanceLut(), fetchSampler('clamp_linear_nomip'));
345
+ bindGroup.setTexture('msLut', getMultiScatteringLut(), fetchSampler('clamp_linear_nomip'));
346
+ bindGroup.setTexture('dst', this._ambient.get());
347
+ device.setProgram(program);
348
+ device.setBindGroup(0, bindGroup);
349
+ device.compute(1, 1, 1);
350
+ }
351
+ _traceBlock(resources, index, stepScale) {
352
+ const inputs = this._inputs;
353
+ const device = getDevice();
354
+ const program = getTraceProgram(inputs.msOctaves);
355
+ const bindGroup = this._bindGroup(program);
356
+ const blocksPerSide = Math.round(Math.sqrt(this._framesPerUpdate));
357
+ const blockSize = this._resolution / blocksPerSide;
358
+ const bx = index % blocksPerSide * blockSize;
359
+ const by = Math.floor(index / blocksPerSide) * blockSize;
360
+ bindGroup.setValue('atmo', inputs.atmosphere);
361
+ bindGroup.setValue('cloud', inputs.cloud);
362
+ bindGroup.setValue('block', new Vector4(bx, by, this._resolution, stepScale));
363
+ bindGroup.setValue('cacheParams', new Vector4(inputs.delta, 0, 0, 0));
364
+ bindGroup.setTexture('weatherMap', resources.weatherMap, fetchSampler('repeat_linear'));
365
+ // Their own samplers: the predefined ones leave the w axis clamped
366
+ bindGroup.setTexture('baseNoise', resources.baseNoise);
367
+ bindGroup.setTexture('detailNoise', resources.detailNoise);
368
+ bindGroup.setTexture('tLut', getTransmittanceLut(), fetchSampler('clamp_linear_nomip'));
369
+ bindGroup.setTexture('msLut', getMultiScatteringLut(), fetchSampler('clamp_linear_nomip'));
370
+ bindGroup.setTexture('ambientTex', this._ambient.get(), fetchSampler('clamp_nearest_nomip'));
371
+ bindGroup.setTexture('dst', this._maps[this._writeIndex].get());
372
+ device.setProgram(program);
373
+ device.setBindGroup(0, bindGroup);
374
+ const groups = Math.ceil(blockSize / 8);
375
+ device.compute(groups, groups, 1);
376
+ }
377
+ }
378
+
379
+ export { VolumetricCloudSkyCache };
380
+ //# sourceMappingURL=sky_cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sky_cache.js","sources":["../../../src/render/volumetric_cloud/sky_cache.ts"],"sourcesContent":["import type { Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Disposable, DRef, Matrix4x4, Vector2, Vector3, Vector4 } from '@zephyr3d/base';\r\nimport type { BindGroup, GPUProgram, Texture2D } from '@zephyr3d/device';\r\nimport { getDevice } from '../../app/api';\r\nimport type { AtmosphereParams } from '../../shaders/atmosphere';\r\nimport {\r\n getAtmosphereParamsStruct,\r\n getMultiScatteringLut,\r\n getTransmittanceLut\r\n} from '../../shaders/atmosphere';\r\nimport { fetchSampler } from '../../utility/misc';\r\nimport { uniformSphereSamples } from '../../values';\r\nimport {\r\n CLOUD_BASE_SHADOW_SAMPLE_COUNT,\r\n CLOUD_BASE_VIEW_SAMPLE_COUNT,\r\n CLOUD_SHADOW_SAMPLE_COUNT_MAX,\r\n CLOUD_TOP_OFFSET,\r\n CLOUD_VIEW_SAMPLE_COUNT_MAX,\r\n cloudCacheDecode,\r\n cloudCoverageThreshold,\r\n cloudDistantSkyLight,\r\n cloudTrace,\r\n getCloudParamsStruct\r\n} from './cloud_common';\r\nimport type { VolumetricCloudResources } from './resources';\r\nimport type { VolumetricCloud } from './volumetric_cloud';\r\n\r\n/*\r\n * Volumetric clouds cached over the sky hemisphere, after clayjohn's\r\n * godot-volumetric-cloud-demo-v2 (cloud_sky.gd): the clouds seen from below the layer depend on\r\n * the view direction only, so they are traced into an octahedral map of the hemisphere one block\r\n * per frame. Three maps rotate: one is being written while the sky blends between the two that\r\n * were completed last, by the progress of the one being written. Every input of a round (eye,\r\n * sun, time, parameters) is frozen when it starts so the blocks of one map agree.\r\n */\r\n\r\n/** A rebuild needs enough steps to resolve cloud edges before the regular rounds finish. */\r\nconst REBUILD_STEP_SCALE = 0.5;\r\n/** Margin added below the horizon dip, radians */\r\nconst HORIZON_MARGIN = Math.PI / 180;\r\n\r\nlet traceProgram: Nullable<GPUProgram>[] = [null, null, null];\r\nlet ambientProgram: Nullable<GPUProgram> = null;\r\n\r\nfunction getTraceProgram(msOctaves: number) {\r\n let program = traceProgram[msOctaves];\r\n if (!program) {\r\n const msCount = 1 + msOctaves;\r\n program = getDevice().buildComputeProgram({\r\n label: `VolumetricCloudSkyCache${msCount}`,\r\n workgroupSize: [8, 8, 1],\r\n compute(pb) {\r\n const AtmosphereParams = getAtmosphereParamsStruct(pb);\r\n const CloudParams = getCloudParamsStruct(pb);\r\n this.atmo = AtmosphereParams().uniform(0);\r\n this.cloud = CloudParams().uniform(0);\r\n // (block origin x, y, cache size, step scale)\r\n this.block = pb.vec4().uniform(0);\r\n // (delta, 0, 0, 0)\r\n this.cacheParams = pb.vec4().uniform(0);\r\n this.weatherMap = pb.tex2D().uniform(0);\r\n this.baseNoise = pb.tex3D().uniform(0);\r\n this.detailNoise = pb.tex3D().uniform(0);\r\n this.tLut = pb.tex2D().uniform(0);\r\n this.msLut = pb.tex2D().uniform(0);\r\n this.ambientTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.dst = pb.texStorage2D.rgba16float().storage(0);\r\n pb.main(function () {\r\n this.$l.texel = pb.add(pb.uvec2(this.block.xy), this.$builtins.globalInvocationId.xy);\r\n this.$l.uv = pb.div(pb.add(pb.vec2(this.texel), pb.vec2(0.5)), this.block.z);\r\n this.$l.dir = cloudCacheDecode(this, this.uv, this.cacheParams.x);\r\n this.$l.ambient = pb.textureLoad(this.ambientTex, pb.ivec2(0), 0).rgb;\r\n // Every cache texel is traced once per round, so a fixed screen-space noise phase\r\n // survives the map blend as a visible grid. Sample each segment at its midpoint.\r\n this.$l.jitter = pb.float(0.5);\r\n this.$l.result = cloudTrace(\r\n this,\r\n msCount,\r\n this.atmo,\r\n this.cloud,\r\n this.dir,\r\n this.jitter,\r\n this.block.w,\r\n this.ambient,\r\n {\r\n weatherMap: this.weatherMap,\r\n baseNoise: this.baseNoise,\r\n detailNoise: this.detailNoise,\r\n transmittanceLut: this.tLut,\r\n multiScatteringLut: this.msLut\r\n }\r\n );\r\n pb.textureStore(this.dst, this.texel, this.result);\r\n });\r\n }\r\n })!;\r\n traceProgram[msOctaves] = program;\r\n }\r\n return program;\r\n}\r\n\r\nfunction getAmbientProgram() {\r\n if (!ambientProgram) {\r\n ambientProgram = getDevice().buildComputeProgram({\r\n label: 'VolumetricCloudDistantSkyLight',\r\n workgroupSize: [1, 1, 1],\r\n compute(pb) {\r\n const AtmosphereParams = getAtmosphereParamsStruct(pb);\r\n this.atmo = AtmosphereParams().uniform(0);\r\n this.sphereSamples = pb.vec4[64]().uniformBuffer(0);\r\n this.tLut = pb.tex2D().uniform(0);\r\n this.msLut = pb.tex2D().uniform(0);\r\n this.dst = pb.texStorage2D.rgba16float().storage(0);\r\n pb.main(function () {\r\n this.$l.light = cloudDistantSkyLight(this, this.atmo, this.sphereSamples, this.tLut, this.msLut);\r\n pb.textureStore(this.dst, pb.uvec2(0), pb.vec4(this.light, 1));\r\n });\r\n }\r\n })!;\r\n }\r\n return ambientProgram;\r\n}\r\n\r\n/** Inputs of one round, frozen when it starts. */\r\ntype RoundInputs = {\r\n atmosphere: AtmosphereParams;\r\n cloud: Record<string, Vector4 | Matrix4x4>;\r\n delta: number;\r\n msOctaves: number;\r\n version: number;\r\n sunDir: Vector3;\r\n cameraPos: Vector3;\r\n};\r\n\r\nfunction cloneAtmosphere(p: AtmosphereParams): AtmosphereParams {\r\n return {\r\n ...p,\r\n groundAlbedo: new Vector3(p.groundAlbedo),\r\n cameraWorldMatrix: new Matrix4x4(p.cameraWorldMatrix),\r\n lightDir: new Vector3(p.lightDir),\r\n lightColor: new Vector4(p.lightColor),\r\n skyViewReferential: new Matrix4x4(p.skyViewReferential)\r\n };\r\n}\r\n\r\n/**\r\n * Octahedral hemisphere cache of the volumetric clouds.\r\n * @internal\r\n */\r\nexport class VolumetricCloudSkyCache extends Disposable {\r\n private readonly _maps: DRef<Texture2D>[];\r\n private readonly _ambient: DRef<Texture2D>;\r\n /** Elevation remap each map was traced with */\r\n private readonly _deltas: number[];\r\n private _writeIndex: number;\r\n private _fromIndex: number;\r\n private _toIndex: number;\r\n private _frame: number;\r\n private _framesPerUpdate: number;\r\n private _resolution: number;\r\n private _inputs: Nullable<RoundInputs>;\r\n private _rebuild: boolean;\r\n private readonly _bindGroups: Map<GPUProgram, BindGroup>;\r\n private _sphereSamplesUploaded: boolean;\r\n /** Set when a round completed this frame, i.e. the blended sky changed source maps */\r\n roundCompleted: boolean;\r\n constructor() {\r\n super();\r\n this._maps = [new DRef(), new DRef(), new DRef()];\r\n this._ambient = new DRef();\r\n this._deltas = [0, 0, 0];\r\n this._writeIndex = 0;\r\n this._fromIndex = 1;\r\n this._toIndex = 2;\r\n this._frame = 0;\r\n this._framesPerUpdate = 0;\r\n this._resolution = 0;\r\n this._inputs = null;\r\n this._rebuild = true;\r\n this._bindGroups = new Map();\r\n this._sphereSamplesUploaded = false;\r\n this.roundCompleted = false;\r\n }\r\n /** Older of the two completed maps the sky blends from */\r\n get fromMap() {\r\n return this._maps[this._fromIndex].get();\r\n }\r\n /** Newer of the two completed maps the sky blends to */\r\n get toMap() {\r\n return this._maps[this._toIndex].get();\r\n }\r\n get fromDelta() {\r\n return this._deltas[this._fromIndex];\r\n }\r\n get toDelta() {\r\n return this._deltas[this._toIndex];\r\n }\r\n /** Progress of the round in flight, the weight of {@link VolumetricCloudSkyCache.toMap} */\r\n get blend() {\r\n return this._framesPerUpdate > 0 ? this._frame / this._framesPerUpdate : 1;\r\n }\r\n /** Frozen density inputs, shared with density debug slices. */\r\n get densityParams() {\r\n return this._inputs?.cloud ?? null;\r\n }\r\n /** Forces the next update to rebuild the whole cache at once. */\r\n invalidate() {\r\n this._rebuild = true;\r\n }\r\n /**\r\n * Advances the cache by one block, or rebuilds it at once when the inputs changed too much for\r\n * a gradual update.\r\n *\r\n * @param atmosphere - Current atmosphere parameters (observer frame, sun, luminance units)\r\n * @param cameraPos - Camera world position\r\n * @param time - Seconds, drives the wind\r\n */\r\n update(\r\n params: VolumetricCloud,\r\n resources: VolumetricCloudResources,\r\n atmosphere: AtmosphereParams,\r\n cameraPos: Immutable<Vector3>,\r\n time: number\r\n ) {\r\n this.roundCompleted = false;\r\n if (!resources.baseNoise || !resources.detailNoise || !resources.weatherMap) {\r\n return;\r\n }\r\n if (params.cacheResolution !== this._resolution || params.framesPerUpdate !== this._framesPerUpdate) {\r\n this._resolution = params.cacheResolution;\r\n this._framesPerUpdate = params.framesPerUpdate;\r\n for (const map of this._maps) {\r\n map.dispose();\r\n }\r\n this._rebuild = true;\r\n }\r\n this._ensureMaps();\r\n if (!this._rebuild && this._inputs && this._needsRebuild(params, atmosphere, cameraPos)) {\r\n this._rebuild = true;\r\n }\r\n if (this._rebuild) {\r\n this._rebuild = false;\r\n // Two rounds, as clayjohn's initialize_sky(): fills the map blended from and the one\r\n // blended to, then the regular rounds take over at full quality\r\n for (let round = 0; round < 2; round++) {\r\n this._startRound(params, atmosphere, cameraPos, time);\r\n for (let i = 0; i < this._framesPerUpdate; i++) {\r\n this._traceBlock(resources, i, REBUILD_STEP_SCALE);\r\n }\r\n this._completeRound();\r\n }\r\n this._startRound(params, atmosphere, cameraPos, time);\r\n this.roundCompleted = true;\r\n return;\r\n }\r\n this._traceBlock(resources, this._frame, 1);\r\n this._frame++;\r\n if (this._frame >= this._framesPerUpdate) {\r\n this._completeRound();\r\n this._startRound(params, atmosphere, cameraPos, time);\r\n this.roundCompleted = true;\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n for (const map of this._maps) {\r\n map.dispose();\r\n }\r\n this._ambient.dispose();\r\n for (const bindGroup of this._bindGroups.values()) {\r\n bindGroup.dispose();\r\n }\r\n this._bindGroups.clear();\r\n }\r\n private _ensureMaps() {\r\n const device = getDevice();\r\n for (let i = 0; i < 3; i++) {\r\n if (!this._maps[i].get()) {\r\n const tex = device.createTexture2D('rgba16f', this._resolution, this._resolution, {\r\n writable: true,\r\n // A storage binding takes a single level\r\n mipmapping: false,\r\n samplerOptions: { addressU: 'clamp', addressV: 'clamp', mipFilter: 'none' }\r\n })!;\r\n tex.name = `VolumetricCloudSkyCache${i}`;\r\n this._maps[i].set(tex);\r\n }\r\n }\r\n if (!this._ambient.get()) {\r\n const tex = device.createTexture2D('rgba16f', 1, 1, { writable: true, mipmapping: false })!;\r\n tex.name = 'VolumetricCloudDistantSkyLight';\r\n this._ambient.set(tex);\r\n }\r\n }\r\n private _needsRebuild(\r\n params: VolumetricCloud,\r\n atmosphere: AtmosphereParams,\r\n cameraPos: Immutable<Vector3>\r\n ) {\r\n const inputs = this._inputs!;\r\n if (params.version !== inputs.version || params.msOctaves !== inputs.msOctaves) {\r\n return true;\r\n }\r\n // A sudden sun change would otherwise fade in over two rounds\r\n if (Vector3.dot(atmosphere.lightDir, inputs.sunDir) < Math.cos((5 * Math.PI) / 180)) {\r\n return true;\r\n }\r\n // A camera jump far enough for the clouds to visibly shift: about ten texels of parallax\r\n // under the cloud base\r\n const scale = atmosphere.cameraHeightScale;\r\n const moved = Vector3.distance(cameraPos, inputs.cameraPos) * scale;\r\n return moved > params.layerBottomAltitude * 0.017;\r\n }\r\n private _bindGroup(program: GPUProgram) {\r\n let bindGroup = this._bindGroups.get(program);\r\n if (!bindGroup) {\r\n bindGroup = getDevice().createBindGroup(program.bindGroupLayouts[0]);\r\n this._bindGroups.set(program, bindGroup);\r\n }\r\n return bindGroup;\r\n }\r\n private _startRound(\r\n params: VolumetricCloud,\r\n atmosphere: AtmosphereParams,\r\n cameraPos: Immutable<Vector3>,\r\n time: number\r\n ) {\r\n const atmo = cloneAtmosphere(atmosphere);\r\n const R = atmo.plantRadius;\r\n const eyeHeight = R + atmo.observerAltitude;\r\n // Horizon dip of the raised observer plus a margin\r\n const delta = Math.acos(Math.min(1, R / eyeHeight)) + HORIZON_MARGIN;\r\n const bottom = R + params.layerBottomAltitude;\r\n const top = bottom + params.layerHeight;\r\n const wind = params.wind;\r\n const windSpeed = Math.hypot(wind.x, wind.y);\r\n const windDir = windSpeed > 0 ? new Vector2(wind.x / windSpeed, wind.y / windSpeed) : new Vector2(1, 0);\r\n const sunIlluminance = new Vector3(atmo.lightColor.x, atmo.lightColor.y, atmo.lightColor.z).scaleBy(\r\n atmo.lightColor.w\r\n );\r\n this._inputs = {\r\n atmosphere: atmo,\r\n cloud: {\r\n referential: new Matrix4x4(atmo.skyViewReferential),\r\n layer: new Vector4(bottom, top, R, params.tracingMaxDistance),\r\n march: new Vector4(\r\n Math.min(CLOUD_BASE_VIEW_SAMPLE_COUNT * params.viewSampleCountScale, CLOUD_VIEW_SAMPLE_COUNT_MAX),\r\n Math.max(\r\n 1,\r\n Math.round(\r\n Math.min(\r\n CLOUD_BASE_SHADOW_SAMPLE_COUNT * params.shadowSampleCountScale,\r\n CLOUD_SHADOW_SAMPLE_COUNT_MAX\r\n )\r\n )\r\n ),\r\n params.shadowTracingDistance,\r\n params.stopTracingTransmittanceThreshold\r\n ),\r\n eye: new Vector4(0, eyeHeight, 0, 0),\r\n sunDir: new Vector4(\r\n atmo.lightDir.x,\r\n atmo.lightDir.y,\r\n atmo.lightDir.z,\r\n params.perSampleAtmosphericLightTransmittance ? 1 : 0\r\n ),\r\n sunIlluminance: new Vector4(sunIlluminance.x, sunIlluminance.y, sunIlluminance.z, 0),\r\n phase: new Vector4(\r\n params.phaseG,\r\n params.phaseG2,\r\n params.phaseBlend,\r\n 1 - params.skyLightCloudBottomOcclusion\r\n ),\r\n ms: new Vector4(params.msContribution, params.msOcclusion, params.msEccentricity, 0),\r\n density: new Vector4(\r\n cloudCoverageThreshold(params.coverage, params.formation),\r\n params.density,\r\n params.detailErosion,\r\n params.anvilBias\r\n ),\r\n shape: new Vector4(\r\n params.shapeStrength,\r\n params.detailBottomErosion,\r\n params.coverage,\r\n params.baseHeightVariation\r\n ),\r\n albedo: new Vector4(params.albedo.x, params.albedo.y, params.albedo.z, 0),\r\n scales: new Vector4(\r\n 1 / params.weatherMapScale,\r\n 1 / params.baseNoiseScale,\r\n 1 / params.detailNoiseScale,\r\n CLOUD_TOP_OFFSET\r\n ),\r\n // [Schneider15]: drift along the wind, rising at a tenth of its speed\r\n windOffset: new Vector4(wind.x * time, windSpeed * 0.1 * time, wind.y * time, 0),\r\n windDir: new Vector4(windDir.x, windDir.y, params.formation === 'isolated' ? 1 : 0, 0)\r\n },\r\n delta,\r\n msOctaves: params.msOctaves,\r\n version: params.version,\r\n sunDir: new Vector3(atmo.lightDir),\r\n cameraPos: new Vector3(cameraPos)\r\n };\r\n this._deltas[this._writeIndex] = delta;\r\n this._frame = 0;\r\n this._traceAmbient();\r\n }\r\n private _completeRound() {\r\n // The map just written becomes the newest; the oldest is written next\r\n const oldFrom = this._fromIndex;\r\n this._fromIndex = this._toIndex;\r\n this._toIndex = this._writeIndex;\r\n this._writeIndex = oldFrom;\r\n this._frame = 0;\r\n }\r\n private _traceAmbient() {\r\n const device = getDevice();\r\n const program = getAmbientProgram();\r\n const bindGroup = this._bindGroup(program);\r\n if (!this._sphereSamplesUploaded) {\r\n const data = new Float32Array(64 * 4);\r\n for (let i = 0; i < 64; i++) {\r\n data[i * 4 + 0] = uniformSphereSamples[i].x;\r\n data[i * 4 + 1] = uniformSphereSamples[i].y;\r\n data[i * 4 + 2] = uniformSphereSamples[i].z;\r\n }\r\n bindGroup.getBuffer('sphereSamples', false)!.bufferSubData(0, data);\r\n this._sphereSamplesUploaded = true;\r\n }\r\n bindGroup.setValue('atmo', this._inputs!.atmosphere);\r\n bindGroup.setTexture('tLut', getTransmittanceLut(), fetchSampler('clamp_linear_nomip'));\r\n bindGroup.setTexture('msLut', getMultiScatteringLut(), fetchSampler('clamp_linear_nomip'));\r\n bindGroup.setTexture('dst', this._ambient.get()!);\r\n device.setProgram(program);\r\n device.setBindGroup(0, bindGroup);\r\n device.compute(1, 1, 1);\r\n }\r\n private _traceBlock(resources: VolumetricCloudResources, index: number, stepScale: number) {\r\n const inputs = this._inputs!;\r\n const device = getDevice();\r\n const program = getTraceProgram(inputs.msOctaves);\r\n const bindGroup = this._bindGroup(program);\r\n const blocksPerSide = Math.round(Math.sqrt(this._framesPerUpdate));\r\n const blockSize = this._resolution / blocksPerSide;\r\n const bx = (index % blocksPerSide) * blockSize;\r\n const by = Math.floor(index / blocksPerSide) * blockSize;\r\n bindGroup.setValue('atmo', inputs.atmosphere);\r\n bindGroup.setValue('cloud', inputs.cloud);\r\n bindGroup.setValue('block', new Vector4(bx, by, this._resolution, stepScale));\r\n bindGroup.setValue('cacheParams', new Vector4(inputs.delta, 0, 0, 0));\r\n bindGroup.setTexture('weatherMap', resources.weatherMap!, fetchSampler('repeat_linear'));\r\n // Their own samplers: the predefined ones leave the w axis clamped\r\n bindGroup.setTexture('baseNoise', resources.baseNoise!);\r\n bindGroup.setTexture('detailNoise', resources.detailNoise!);\r\n bindGroup.setTexture('tLut', getTransmittanceLut(), fetchSampler('clamp_linear_nomip'));\r\n bindGroup.setTexture('msLut', getMultiScatteringLut(), fetchSampler('clamp_linear_nomip'));\r\n bindGroup.setTexture('ambientTex', this._ambient.get()!, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('dst', this._maps[this._writeIndex].get()!);\r\n device.setProgram(program);\r\n device.setBindGroup(0, bindGroup);\r\n const groups = Math.ceil(blockSize / 8);\r\n device.compute(groups, groups, 1);\r\n }\r\n}\r\n"],"names":["REBUILD_STEP_SCALE","HORIZON_MARGIN","Math","PI","traceProgram","ambientProgram","getTraceProgram","msOctaves","program","msCount","getDevice","buildComputeProgram","label","workgroupSize","compute","pb","AtmosphereParams","getAtmosphereParamsStruct","CloudParams","getCloudParamsStruct","atmo","uniform","cloud","block","vec4","cacheParams","weatherMap","tex2D","baseNoise","tex3D","detailNoise","tLut","msLut","ambientTex","sampleType","dst","texStorage2D","rgba16float","storage","main","$l","texel","add","uvec2","xy","$builtins","globalInvocationId","uv","div","vec2","z","dir","cloudCacheDecode","x","ambient","textureLoad","ivec2","rgb","jitter","float","result","cloudTrace","w","transmittanceLut","multiScatteringLut","textureStore","getAmbientProgram","sphereSamples","uniformBuffer","light","cloudDistantSkyLight","cloneAtmosphere","p","groundAlbedo","Vector3","cameraWorldMatrix","Matrix4x4","lightDir","lightColor","Vector4","skyViewReferential","VolumetricCloudSkyCache","Disposable","_maps","_ambient","_writeIndex","_fromIndex","_toIndex","_frame","_framesPerUpdate","_resolution","_inputs","_rebuild","_bindGroups","_sphereSamplesUploaded","roundCompleted","DRef","_deltas","Map","fromMap","get","toMap","fromDelta","toDelta","blend","densityParams","invalidate","update","params","resources","atmosphere","cameraPos","time","cacheResolution","framesPerUpdate","map","dispose","_ensureMaps","_needsRebuild","round","_startRound","i","_traceBlock","_completeRound","onDispose","bindGroup","values","clear","device","tex","createTexture2D","writable","mipmapping","samplerOptions","addressU","addressV","mipFilter","name","set","inputs","version","dot","sunDir","cos","scale","cameraHeightScale","moved","distance","layerBottomAltitude","_bindGroup","createBindGroup","bindGroupLayouts","R","plantRadius","eyeHeight","observerAltitude","delta","acos","min","bottom","top","layerHeight","wind","windSpeed","hypot","y","windDir","Vector2","sunIlluminance","scaleBy","referential","layer","tracingMaxDistance","march","CLOUD_BASE_VIEW_SAMPLE_COUNT","viewSampleCountScale","CLOUD_VIEW_SAMPLE_COUNT_MAX","max","CLOUD_BASE_SHADOW_SAMPLE_COUNT","shadowSampleCountScale","CLOUD_SHADOW_SAMPLE_COUNT_MAX","shadowTracingDistance","stopTracingTransmittanceThreshold","eye","perSampleAtmosphericLightTransmittance","phase","phaseG","phaseG2","phaseBlend","skyLightCloudBottomOcclusion","ms","msContribution","msOcclusion","msEccentricity","density","cloudCoverageThreshold","coverage","formation","detailErosion","anvilBias","shape","shapeStrength","detailBottomErosion","baseHeightVariation","albedo","scales","weatherMapScale","baseNoiseScale","detailNoiseScale","CLOUD_TOP_OFFSET","windOffset","_traceAmbient","oldFrom","data","Float32Array","uniformSphereSamples","getBuffer","bufferSubData","setValue","setTexture","getTransmittanceLut","fetchSampler","getMultiScatteringLut","setProgram","setBindGroup","index","stepScale","blocksPerSide","sqrt","blockSize","bx","by","floor","groups","ceil"],"mappings":"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"}