@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,472 @@
1
+ import { getAtmosphereParamsStruct, rayIntersectSphere, transmittanceToSky, getSkyView } from '../../shaders/atmosphere.js';
2
+
3
+ /** @internal */ const CLOUD_SAMPLE_COUNT_MIN = 2;
4
+ /** @internal */ const CLOUD_DISTANCE_TO_SAMPLE_COUNT_MAX = 15000;
5
+ /** @internal */ const CLOUD_TRACING_START_MAX_DISTANCE = 350000;
6
+ /** @internal */ const CLOUD_BASE_VIEW_SAMPLE_COUNT = 96;
7
+ /** @internal */ const CLOUD_VIEW_SAMPLE_COUNT_MAX = 768;
8
+ /** @internal */ const CLOUD_BASE_SHADOW_SAMPLE_COUNT = 10;
9
+ /** @internal */ const CLOUD_SHADOW_SAMPLE_COUNT_MAX = 80;
10
+ /** @internal */ const CLOUD_DISTANT_SKY_LIGHT_ALTITUDE = 6000;
11
+ /**
12
+ * 5th/95th percentiles of the generated Perlin-Worley base shape (seeds 0-2), remapped to [0, 1].
13
+ * Imported volumes may have another range.
14
+ */ const CLOUD_COVERAGE_BASE_RANGE = [
15
+ 0.1552,
16
+ 0.4032
17
+ ];
18
+ /** 5th/95th percentiles of the generated detail fbm (0.625 R + 0.25 G + 0.125 B), remapped to [0, 1]. */ const CLOUD_DETAIL_RANGE = [
19
+ 0.53,
20
+ 0.85
21
+ ];
22
+ /** Largest envelope erosion by the base noise; envelope values above it stay solid. */ const CLOUD_SHAPE_EROSION = 0.6;
23
+ /** Largest envelope erosion by the detail noise, at detail erosion 1. */ const CLOUD_DETAIL_EROSION = 0.4;
24
+ /** Envelope margin over which the density rises from 0 to 1 below the cloud surface. */ const CLOUD_EDGE_WIDTH = 0.35;
25
+ /**
26
+ * Softer edge for the march towards the sun: its few unjittered x^2 samples would otherwise
27
+ * streak the lighting along the sun direction.
28
+ */ const CLOUD_SHADOW_EDGE_WIDTH = 0.7;
29
+ /** Weather value range over which the local coverage ramps from 0 to 1. */ const CLOUD_COVERAGE_RAMP = 0.4;
30
+ /**
31
+ * Weather threshold of a global coverage: connected can fill the map, isolated keeps its gaps.
32
+ * @internal
33
+ */ function cloudCoverageThreshold(coverage, formation) {
34
+ const c = Math.min(1, Math.max(0, coverage));
35
+ return 1 - c * (formation === 'connected' ? 1 + CLOUD_COVERAGE_RAMP : 1);
36
+ }
37
+ /** Width of the cloud base transition, in meters. */ const CLOUD_BOTTOM_TRANSITION_METERS = 150;
38
+ /** [Schneider15] cloud_top_offset: how far the wind pushes cloud tops ahead of their base, in meters */ const CLOUD_TOP_OFFSET = 500;
39
+ /**
40
+ * Uniform block of the cloud passes.
41
+ * @internal
42
+ */ function getCloudParamsStruct(pb) {
43
+ return pb.defineStruct([
44
+ // World (planet-fixed) to observer-local rotation the trace was set up with
45
+ pb.mat4('referential'),
46
+ // (bottom radius, top radius, planet radius, tracing max distance)
47
+ pb.vec4('layer'),
48
+ // (view sample count max, shadow sample count max, shadow tracing distance, stop transmittance)
49
+ pb.vec4('march'),
50
+ // (observer-local eye position, 0)
51
+ pb.vec4('eye'),
52
+ // (direction to the sun, per-sample atmosphere transmittance 0/1)
53
+ pb.vec4('sunDir'),
54
+ // (sun illuminance outside the atmosphere, 0)
55
+ pb.vec4('sunIlluminance'),
56
+ // (phase g, phase g2, phase blend, sky light bottom visibility)
57
+ pb.vec4('phase'),
58
+ // (multiple scattering contribution, occlusion, eccentricity, 0)
59
+ pb.vec4('ms'),
60
+ // (weather coverage threshold, extinction per meter, detail erosion, anvil bias)
61
+ pb.vec4('density'),
62
+ // (base noise shaping strength, bottom detail erosion multiplier, global coverage, base variation meters)
63
+ pb.vec4('shape'),
64
+ // (albedo, 0)
65
+ pb.vec4('albedo'),
66
+ // (1 / weather map scale, 1 / base noise scale, 1 / detail noise scale, cloud top offset)
67
+ pb.vec4('scales'),
68
+ // (wind offset of the noise in planet-fixed meters, 0)
69
+ pb.vec4('windOffset'),
70
+ // (horizontal wind direction x, z, formation: 0 connected / 1 isolated, 0)
71
+ pb.vec4('windDir')
72
+ ]);
73
+ }
74
+ /**
75
+ * Both roots of a ray / origin-centred sphere intersection, (-1, -1) when missed.
76
+ */ function raySphereSolutions(scope, origin, dir, radius) {
77
+ const pb = scope.$builder;
78
+ const funcName = 'Z_cloudRaySphereSolutions';
79
+ pb.func(funcName, [
80
+ pb.vec3('o'),
81
+ pb.vec3('d'),
82
+ pb.float('r')
83
+ ], function() {
84
+ this.$l.b = pb.dot(this.o, this.d);
85
+ this.$l.c = pb.sub(pb.dot(this.o, this.o), pb.mul(this.r, this.r));
86
+ this.$l.disc = pb.sub(pb.mul(this.b, this.b), this.c);
87
+ this.$if(pb.lessThan(this.disc, 0), function() {
88
+ this.$return(pb.vec2(-1));
89
+ });
90
+ this.$l.s = pb.sqrt(this.disc);
91
+ this.$return(pb.vec2(pb.sub(pb.neg(this.b), this.s), pb.add(pb.neg(this.b), this.s)));
92
+ });
93
+ return pb.getGlobalScope()[funcName](origin, dir, radius);
94
+ }
95
+ /** Henyey-Greenstein with the forward peak where the view looks into the light. */ function hgPhase(scope, g, cosTheta) {
96
+ const pb = scope.$builder;
97
+ const funcName = 'Z_cloudHGPhase';
98
+ pb.func(funcName, [
99
+ pb.float('g'),
100
+ pb.float('c')
101
+ ], function() {
102
+ this.$l.numer = pb.sub(1, pb.mul(this.g, this.g));
103
+ this.$l.denom = pb.max(pb.sub(pb.add(1, pb.mul(this.g, this.g)), pb.mul(this.g, this.c, 2)), 1e-6);
104
+ this.$return(pb.div(this.numer, pb.mul(4 * Math.PI, this.denom, pb.sqrt(this.denom))));
105
+ });
106
+ return pb.getGlobalScope()[funcName](g, cosTheta);
107
+ }
108
+ /**
109
+ * Returns (height profile, height within the cloud type, bottom ramp, top cut) for a cloud type
110
+ * of 0 (stratus), 0.5 (stratocumulus) or 1 (cumulus), the base lifted by `baseOffsetMeters`.
111
+ * @internal
112
+ */ function cloudHeightProfile(scope, heightFrac, cloudType, layerHeight, baseOffsetMeters = 0) {
113
+ const pb = scope.$builder;
114
+ const funcName = 'Z_cloudVerticalProfile';
115
+ pb.func(funcName, [
116
+ pb.float('h'),
117
+ pb.float('t'),
118
+ pb.float('layerHeight'),
119
+ pb.float('baseOffsetMeters')
120
+ ], function() {
121
+ this.$l.cloudType = pb.clamp(this.t, 0, 1);
122
+ this.$l.stratus = pb.sub(1, pb.clamp(pb.mul(this.cloudType, 2), 0, 1));
123
+ this.$l.stratocumulus = pb.sub(1, pb.mul(pb.abs(pb.sub(this.cloudType, 0.5)), 2));
124
+ this.$l.cumulus = pb.mul(pb.clamp(pb.sub(this.cloudType, 0.5), 0, 1), 2);
125
+ // (base, nominal end of the bottom ramp, start of the top falloff, top)
126
+ this.$l.g = pb.add(pb.mul(pb.vec4(0, 0.05, 0.09, 0.11), this.stratus), pb.mul(pb.vec4(0, 0.2, 0.2, 0.625), this.stratocumulus), pb.mul(pb.vec4(0, 0.0625, 0.2, 1), this.cumulus));
127
+ this.$l.bottomWidth = pb.min(pb.min(this.g.y, pb.div(CLOUD_BOTTOM_TRANSITION_METERS, pb.max(this.layerHeight, 1))), pb.mul(this.g.w, 0.15));
128
+ this.$l.localBase = pb.clamp(pb.div(this.baseOffsetMeters, pb.max(this.layerHeight, 1)), 0, pb.mul(this.g.w, 0.25));
129
+ this.$l.bottom = pb.smoothStep(this.localBase, pb.add(this.localBase, pb.max(this.bottomWidth, 1e-6)), this.h);
130
+ this.$l.top = pb.sub(1, pb.smoothStep(this.g.z, this.g.w, this.h));
131
+ this.$return(pb.vec4(pb.mul(this.bottom, this.top), pb.clamp(pb.div(pb.sub(this.h, this.localBase), pb.max(pb.sub(this.g.w, this.localBase), 1e-6)), 0, 1), this.bottom, pb.sub(1, this.top)));
132
+ });
133
+ return pb.getGlobalScope()[funcName](heightFrac, cloudType, layerHeight, baseOffsetMeters);
134
+ }
135
+ /** remap(v, l0, h0, l1, h1) of [Schneider15] */ function remap(pb, v, l0, h0, l1, h1) {
136
+ return pb.add(l1, pb.mul(pb.div(pb.sub(v, l0), pb.sub(h0, l0)), h1 - l1));
137
+ }
138
+ /**
139
+ * Cloud medium at an observer-local position.
140
+ *
141
+ * Returns (extinction per meter, conservative density, normalized altitude in the layer,
142
+ * altitude in the layer in meters). The conservative density omits the detail erosion, so a
143
+ * zero lets the march skip the sample.
144
+ *
145
+ * envelope = bottom(h) * max(coverage - topCut(h), 0)
146
+ * margin = envelope - shape * CLOUD_SHAPE_EROSION * (1 - baseNoise)
147
+ * - detail * CLOUD_DETAIL_EROSION * detailModifier
148
+ * density = saturate(margin / edgeWidth)
149
+ *
150
+ * @internal
151
+ */ function cloudSampleDensity(scope, cloud, pos, weatherMap, baseNoise, detailNoise, stage = 'density', edgeWidth = CLOUD_EDGE_WIDTH) {
152
+ const pb = scope.$builder;
153
+ const CloudParams = getCloudParamsStruct(pb);
154
+ const funcName = `Z_cloudSampleDensity_${stage}${edgeWidth === CLOUD_EDGE_WIDTH ? '' : '_shadow'}`;
155
+ pb.func(funcName, [
156
+ CloudParams('cloud'),
157
+ pb.vec3('p')
158
+ ], function() {
159
+ this.$l.r = pb.length(this.p);
160
+ this.$l.altInLayer = pb.sub(this.r, this.cloud.layer.x);
161
+ this.$l.h = pb.div(this.altInLayer, pb.sub(this.cloud.layer.y, this.cloud.layer.x));
162
+ this.$if(pb.or(pb.lessThanEqual(this.cloud.shape.z, 0), pb.lessThanEqual(this.h, 0), pb.greaterThanEqual(this.h, 1)), function() {
163
+ this.$return(pb.vec4(0, 0, this.h, this.altInLayer));
164
+ });
165
+ // Planet-fixed position, altitude as height so the noise follows the curvature
166
+ this.$l.planet = pb.mul(pb.vec4(this.p, 0), this.cloud.referential).xyz;
167
+ this.$l.q = pb.vec3(this.planet.x, pb.sub(this.r, this.cloud.layer.z), this.planet.z);
168
+ // Tops skewed along the wind (Nubis 2017); the noise drifts, the coverage stays put
169
+ this.q = pb.add(this.q, pb.mul(pb.vec3(this.cloud.windDir.x, 0, this.cloud.windDir.y), pb.mul(this.cloud.scales.w, this.h)));
170
+ this.$l.weather = pb.clamp(pb.textureSampleLevel(weatherMap, pb.mul(this.q.xz, this.cloud.scales.x), 0), pb.vec4(0), pb.vec4(1));
171
+ this.q = pb.add(this.q, this.cloud.windOffset.xyz);
172
+ this.$l.coverage = pb.clamp(pb.div(pb.sub(pb.mix(this.weather.r, this.weather.g, this.cloud.windDir.z), this.cloud.density.x), CLOUD_COVERAGE_RAMP), 0, 1);
173
+ // Anvils: coverage inflated towards the layer top (Nubis 2017)
174
+ this.coverage = pb.pow(this.coverage, pb.mix(1, pb.mix(1, 0.5, this.cloud.density.w), pb.clamp(pb.mul(pb.sub(this.h, 0.7), 10), 0, 1)));
175
+ this.$if(pb.lessThanEqual(this.coverage, 0), function() {
176
+ this.$return(pb.vec4(0, 0, this.h, this.altInLayer));
177
+ });
178
+ // Base lift: higher for cumulus and towards the footprint edges
179
+ this.$l.baseOffset = pb.mul(this.cloud.shape.w, pb.add(0.15, pb.mul(this.weather.b, 0.45), pb.mul(pb.sub(1, this.coverage), 0.4)));
180
+ this.$l.heightProfile = cloudHeightProfile(this, this.h, this.weather.b, pb.sub(this.cloud.layer.y, this.cloud.layer.x), this.baseOffset);
181
+ this.$l.profile = pb.mul(this.heightProfile.z, pb.max(pb.sub(this.coverage, this.heightProfile.w), 0));
182
+ if (stage === 'profile') {
183
+ this.$return(pb.vec4(pb.mul(this.profile, this.cloud.density.y), this.profile, this.h, this.altInLayer));
184
+ return;
185
+ }
186
+ this.$l.noise = pb.float(1);
187
+ this.$if(pb.greaterThan(this.cloud.shape.x, 0), function() {
188
+ this.$l.n = pb.textureSampleLevel(baseNoise, pb.mul(this.q, this.cloud.scales.y), 0);
189
+ this.$l.lowFbm = pb.add(pb.mul(this.n.g, 0.625), pb.mul(this.n.b, 0.25), pb.mul(this.n.a, 0.125));
190
+ this.$l.rawBase = remap(pb, this.n.r, pb.sub(this.lowFbm, 1), 1, 0, 1);
191
+ this.noise = pb.clamp(remap(pb, this.rawBase, CLOUD_COVERAGE_BASE_RANGE[0], CLOUD_COVERAGE_BASE_RANGE[1], 0, 1), 0, 1);
192
+ });
193
+ this.$l.margin = pb.sub(this.profile, pb.mul(this.cloud.shape.x, CLOUD_SHAPE_EROSION, pb.sub(1, this.noise)));
194
+ this.$l.base = pb.clamp(pb.div(this.margin, edgeWidth), 0, 1);
195
+ this.$if(pb.lessThanEqual(this.base, 0), function() {
196
+ this.$return(pb.vec4(0, 0, this.h, this.altInLayer));
197
+ });
198
+ if (stage === 'base') {
199
+ this.$return(pb.vec4(pb.mul(this.base, this.cloud.density.y), this.base, this.h, this.altInLayer));
200
+ return;
201
+ }
202
+ this.$if(pb.lessThanEqual(this.cloud.density.z, 0), function() {
203
+ this.$return(pb.vec4(pb.mul(this.base, this.cloud.density.y), this.base, this.h, this.altInLayer));
204
+ });
205
+ this.$l.d = pb.textureSampleLevel(detailNoise, pb.mul(this.q, this.cloud.scales.z), 0).rgb;
206
+ this.$l.highFbm = pb.clamp(remap(pb, pb.add(pb.mul(this.d.r, 0.625), pb.mul(this.d.g, 0.25), pb.mul(this.d.b, 0.125)), CLOUD_DETAIL_RANGE[0], CLOUD_DETAIL_RANGE[1], 0, 1), 0, 1);
207
+ // Wispy at the base, billowy above
208
+ this.$l.modifier = pb.mix(this.highFbm, pb.sub(1, this.highFbm), pb.clamp(pb.mul(this.heightProfile.y, 10), 0, 1));
209
+ this.$l.bottomErosion = pb.mix(this.cloud.shape.y, 1, pb.smoothStep(0, 0.25, this.heightProfile.y));
210
+ this.margin = pb.sub(this.margin, pb.mul(this.modifier, this.cloud.density.z, this.bottomErosion, CLOUD_DETAIL_EROSION));
211
+ this.$l.eroded = pb.clamp(pb.div(this.margin, edgeWidth), 0, 1);
212
+ this.$return(pb.vec4(pb.mul(this.eroded, this.cloud.density.y), this.base, this.h, this.altInLayer));
213
+ });
214
+ return pb.getGlobalScope()[funcName](cloud, pos);
215
+ }
216
+ /**
217
+ * Traces the clouds along one view ray from the cloud eye position.
218
+ *
219
+ * Returns (scattered luminance with aerial perspective, mean transmittance), the luminance in the
220
+ * units of the atmosphere (`params.lightColor`) so it composites directly over `skyBox()`:
221
+ * `sky * a + rgb`.
222
+ *
223
+ * @param msCount - 1 + multiple scattering octaves, compile time
224
+ * @param jitter - start offset of the march in steps, 0..1
225
+ * @param stepScale - scales the sample count, below 1 for quick previews
226
+ * @internal
227
+ */ function cloudTrace(scope, msCount, atmosphere, cloud, dir, jitter, stepScale, ambient, textures) {
228
+ const pb = scope.$builder;
229
+ const AtmosphereParams = getAtmosphereParamsStruct(pb);
230
+ const CloudParams = getCloudParamsStruct(pb);
231
+ const funcName = `Z_cloudTrace${msCount}`;
232
+ const density = (s, p, edgeWidth = CLOUD_EDGE_WIDTH)=>cloudSampleDensity(s, s.cloud, p, textures.weatherMap, textures.baseNoise, textures.detailNoise, 'density', edgeWidth);
233
+ pb.func(funcName, [
234
+ AtmosphereParams('atmo'),
235
+ CloudParams('cloud'),
236
+ pb.vec3('dir'),
237
+ pb.float('jitter'),
238
+ pb.float('stepScale'),
239
+ pb.vec3('ambient')
240
+ ], function() {
241
+ this.$l.eye = this.cloud.eye.xyz;
242
+ this.$l.tTop2 = raySphereSolutions(this, this.eye, this.dir, this.cloud.layer.y);
243
+ this.$l.tBottom2 = raySphereSolutions(this, this.eye, this.dir, this.cloud.layer.x);
244
+ this.$l.tMin = pb.float(0);
245
+ this.$l.tMax = pb.float(0);
246
+ this.$if(pb.and(pb.lessThan(this.tTop2.x, 0), pb.lessThan(this.tTop2.y, 0)), function() {
247
+ this.$return(pb.vec4(0, 0, 0, 1));
248
+ });
249
+ this.$if(pb.greaterThan(pb.abs(pb.sub(this.tBottom2.x, this.tBottom2.y)), 0), function() {
250
+ this.$l.bottomBothAhead = pb.all(pb.greaterThan(this.tBottom2, pb.vec2(0)));
251
+ this.$l.tempTop = this.$choice(pb.all(pb.greaterThan(this.tTop2, pb.vec2(0))), pb.min(this.tTop2.x, this.tTop2.y), pb.max(this.tTop2.x, this.tTop2.y));
252
+ this.$l.tempBottom = this.$choice(this.bottomBothAhead, pb.min(this.tBottom2.x, this.tBottom2.y), pb.max(this.tBottom2.x, this.tBottom2.y));
253
+ this.$if(this.bottomBothAhead, function() {
254
+ this.tempTop = pb.max(0, pb.min(this.tTop2.x, this.tTop2.y));
255
+ });
256
+ this.tMin = pb.min(this.tempBottom, this.tempTop);
257
+ this.tMax = pb.max(this.tempBottom, this.tempTop);
258
+ }).$else(function() {
259
+ this.tMin = this.tTop2.x;
260
+ this.tMax = this.tTop2.y;
261
+ });
262
+ this.tMin = pb.max(this.tMin, 0);
263
+ this.tMax = pb.max(this.tMax, 0);
264
+ this.$l.tGround = rayIntersectSphere(this, pb.vec3(0), this.cloud.layer.z, this.eye, this.dir);
265
+ this.$if(pb.greaterThan(this.tGround, 0), function() {
266
+ this.tMax = pb.min(this.tMax, this.tGround);
267
+ });
268
+ this.$if(pb.or(pb.lessThanEqual(this.tMax, this.tMin), pb.greaterThan(this.tMin, CLOUD_TRACING_START_MAX_DISTANCE)), function() {
269
+ this.$return(pb.vec4(0, 0, 0, 1));
270
+ });
271
+ // TracingMaxDistanceMode 0: distance after the layer entry
272
+ this.tMax = pb.add(this.tMin, pb.min(this.cloud.layer.w, pb.sub(this.tMax, this.tMin)));
273
+ this.$l.stepCount = pb.max(pb.floor(pb.mul(this.cloud.march.x, this.stepScale, pb.clamp(pb.div(pb.sub(this.tMax, this.tMin), CLOUD_DISTANCE_TO_SAMPLE_COUNT_MAX), 0, 1))), CLOUD_SAMPLE_COUNT_MIN);
274
+ this.$l.stepT = pb.div(pb.sub(this.tMax, this.tMin), this.stepCount);
275
+ this.$l.iStepCount = pb.int(this.stepCount);
276
+ this.$l.msScatt = this.cloud.ms.x;
277
+ this.$l.msExtin = pb.clamp(this.cloud.ms.y, 0, 1);
278
+ this.$l.cosTheta = pb.dot(this.cloud.sunDir.xyz, this.dir);
279
+ this.$l.phase0 = pb.mix(hgPhase(this, this.cloud.phase.x, this.cosTheta), hgPhase(this, this.cloud.phase.y, this.cosTheta), this.cloud.phase.z);
280
+ // SetupParticipatingMediaPhaseContext
281
+ const isotropic = 1 / (4 * Math.PI);
282
+ this.$l.msPhaseFactor = pb.clamp(this.cloud.ms.z, 0, 1);
283
+ for(let ms = 0; ms < msCount; ms++){
284
+ if (ms === 0) {
285
+ this.$l.phaseMs0 = this.phase0;
286
+ } else {
287
+ this.$l[`phaseMs${ms}`] = pb.mix(isotropic, this.phase0, this.msPhaseFactor);
288
+ this.msPhaseFactor = pb.mul(this.msPhaseFactor, this.msPhaseFactor);
289
+ }
290
+ }
291
+ // Sun illuminance: outside the atmosphere with per-sample transmittance, else at the eye
292
+ this.$l.perSample = pb.notEqual(this.cloud.sunDir.w, 0);
293
+ this.$l.lightIlluminance = this.cloud.sunIlluminance.xyz;
294
+ this.$if(pb.not(this.perSample), function() {
295
+ this.lightIlluminance = pb.mul(this.lightIlluminance, transmittanceToSky(this, this.atmo, this.eye, this.cloud.sunDir.xyz, textures.transmittanceLut));
296
+ });
297
+ this.$l.luminance = pb.vec3(0);
298
+ this.$l.transmittanceToView = pb.float(1);
299
+ this.$l.tAPWeightedSum = pb.float(0);
300
+ this.$l.tAPWeightsSum = pb.float(0);
301
+ this.$l.t = pb.add(this.tMin, pb.mul(this.jitter, this.stepT));
302
+ this.$l.shadowCount = this.cloud.march.y;
303
+ this.$l.shadowLength = this.cloud.march.z;
304
+ this.$for(pb.int('i'), 0, this.iStepCount, function() {
305
+ this.$l.samplePos = pb.add(this.eye, pb.mul(this.dir, this.t));
306
+ this.$l.medium = density(this, this.samplePos);
307
+ // Conservative density 0 or outside the layer: skip (StepSizeOnZeroConservativeDensity 1)
308
+ this.$if(pb.lessThanEqual(this.medium.y, 0), function() {
309
+ this.t = pb.add(this.t, this.stepT);
310
+ this.$continue();
311
+ });
312
+ this.$l.extinction = this.medium.x;
313
+ this.$l.scattering = pb.mul(this.cloud.albedo.xyz, this.extinction);
314
+ // SetupParticipatingMediaContext
315
+ this.$l.sFactor = this.msScatt;
316
+ this.$l.eFactor = this.msExtin;
317
+ this.$l.atmoTransmittance = pb.vec3(1);
318
+ this.$if(this.perSample, function() {
319
+ this.atmoTransmittance = transmittanceToSky(this, this.atmo, this.samplePos, this.cloud.sunDir.xyz, textures.transmittanceLut);
320
+ });
321
+ for(let ms = 0; ms < msCount; ms++){
322
+ if (ms === 0) {
323
+ this.$l.scat0 = this.scattering;
324
+ this.$l.ext0 = this.extinction;
325
+ } else {
326
+ this.$l[`scat${ms}`] = pb.mul(this[`scat${ms - 1}`], this.sFactor);
327
+ this.$l[`ext${ms}`] = pb.mul(this[`ext${ms - 1}`], this.eFactor);
328
+ this.sFactor = pb.mul(this.sFactor, this.sFactor);
329
+ this.eFactor = pb.mul(this.eFactor, this.eFactor);
330
+ }
331
+ this.$l[`lightT${ms}`] = this.atmoTransmittance;
332
+ }
333
+ this.$l.distantLight = pb.mul(this.ambient, pb.clamp(pb.add(this.cloud.phase.w, this.medium.z), 0, 1));
334
+ this.$if(pb.greaterThan(this.extinction, 0), function() {
335
+ for(let ms = 0; ms < msCount; ms++){
336
+ this.$l[`extAcc${ms}`] = pb.float(0);
337
+ }
338
+ this.$l.prevNormT = pb.float(0);
339
+ this.$for(pb.int('j'), 1, pb.add(pb.int(this.shadowCount), 1), function() {
340
+ this.$l.normT = pb.div(pb.float(this.j), this.shadowCount);
341
+ this.$l.curNormT = pb.mul(this.normT, this.normT);
342
+ this.$l.deltaNormT = pb.sub(this.curNormT, this.prevNormT);
343
+ this.$l.shadowPos = pb.add(this.samplePos, pb.mul(this.cloud.sunDir.xyz, this.shadowLength, pb.add(this.prevNormT, pb.mul(this.deltaNormT, 0.5))));
344
+ this.prevNormT = this.curNormT;
345
+ this.$l.shadowMedium = density(this, this.shadowPos, CLOUD_SHADOW_EDGE_WIDTH);
346
+ this.$if(pb.or(pb.lessThanEqual(this.shadowMedium.z, 0), pb.greaterThanEqual(this.shadowMedium.z, 1)), function() {
347
+ this.$break();
348
+ });
349
+ this.$if(pb.lessThanEqual(this.shadowMedium.y, 0), function() {
350
+ this.$continue();
351
+ });
352
+ this.$l.shadowExt = this.shadowMedium.x;
353
+ this.$l.shadowEFactor = this.msExtin;
354
+ for(let ms = 0; ms < msCount; ms++){
355
+ this[`extAcc${ms}`] = pb.add(this[`extAcc${ms}`], pb.mul(this.shadowExt, this.deltaNormT));
356
+ if (ms + 1 < msCount) {
357
+ this.shadowExt = pb.mul(this.shadowExt, this.shadowEFactor);
358
+ this.shadowEFactor = pb.mul(this.shadowEFactor, this.shadowEFactor);
359
+ }
360
+ }
361
+ });
362
+ for(let ms = 0; ms < msCount; ms++){
363
+ this[`lightT${ms}`] = pb.mul(this[`lightT${ms}`], pb.exp(pb.neg(pb.mul(this[`extAcc${ms}`], this.shadowLength))));
364
+ }
365
+ // Transmittance-weighted depth for the aerial perspective
366
+ this.tAPWeightedSum = pb.add(this.tAPWeightedSum, pb.mul(this.t, this.transmittanceToView));
367
+ this.tAPWeightsSum = pb.add(this.tAPWeightsSum, this.transmittanceToView);
368
+ });
369
+ for(let ms = msCount - 1; ms >= 0; ms--){
370
+ this.$l.sunSky = pb.mul(this[`lightT${ms}`], this.lightIlluminance, this[`phaseMs${ms}`]);
371
+ if (ms === 0) {
372
+ this.sunSky = pb.add(this.sunSky, this.distantLight);
373
+ }
374
+ this.$l.scattered = pb.mul(this.sunSky, this[`scat${ms}`]);
375
+ this.$l.safeExt = pb.max(this[`ext${ms}`], 1e-6);
376
+ this.$l.segT = pb.exp(pb.neg(pb.mul(this.safeExt, this.stepT)));
377
+ this.luminance = pb.add(this.luminance, pb.mul(this.transmittanceToView, pb.div(pb.sub(this.scattered, pb.mul(this.scattered, this.segT)), this.safeExt)));
378
+ if (ms === 0) {
379
+ this.transmittanceToView = pb.mul(this.transmittanceToView, this.segT);
380
+ }
381
+ }
382
+ this.$if(pb.lessThan(this.transmittanceToView, this.cloud.march.w), function() {
383
+ this.$break();
384
+ });
385
+ this.t = pb.add(this.t, this.stepT);
386
+ });
387
+ // Aerial perspective at the mean cloud depth, integrated along the direction since
388
+ // the cache covers directions outside any camera's AP froxel volume
389
+ this.$if(pb.greaterThan(this.tAPWeightsSum, 0), function() {
390
+ this.$l.tAP = pb.div(this.tAPWeightedSum, pb.max(this.tAPWeightsSum, 1e-10));
391
+ this.$l.ap = getSkyView(this, this.atmo, this.eye, this.dir, this.tAP, textures.transmittanceLut, textures.multiScatteringLut);
392
+ this.luminance = pb.add(pb.mul(this.ap.rgb, pb.sub(1, this.transmittanceToView)), pb.mul(this.luminance, this.ap.a));
393
+ });
394
+ this.$return(pb.vec4(this.luminance, this.transmittanceToView));
395
+ });
396
+ return pb.getGlobalScope()[funcName](atmosphere, cloud, dir, jitter, stepScale, ambient);
397
+ }
398
+ /**
399
+ * Average sky luminance over the sphere at the distant sky light altitude.
400
+ * @internal
401
+ */ function cloudDistantSkyLight(scope, atmosphere, sphereSamples, transmittanceLut, multiScatteringLut) {
402
+ const pb = scope.$builder;
403
+ const AtmosphereParams = getAtmosphereParamsStruct(pb);
404
+ const funcName = 'Z_cloudDistantSkyLight';
405
+ pb.func(funcName, [
406
+ AtmosphereParams('atmo')
407
+ ], function() {
408
+ this.$l.pos = pb.vec3(0, pb.add(this.atmo.plantRadius, CLOUD_DISTANT_SKY_LIGHT_ALTITUDE), 0);
409
+ this.$l.sum = pb.vec3(0);
410
+ this.$for(pb.int('i'), 0, 64, function() {
411
+ this.sum = pb.add(this.sum, getSkyView(this, this.atmo, this.pos, sphereSamples.at(this.i).xyz, pb.float(-1), transmittanceLut, multiScatteringLut, false).rgb);
412
+ });
413
+ // sum * (4 pi / 64) * (1 / (4 pi))
414
+ this.$return(pb.div(this.sum, 64));
415
+ });
416
+ return pb.getGlobalScope()[funcName](atmosphere);
417
+ }
418
+ /**
419
+ * Elevation of the cached sky remapped so [-delta, pi/2] fills the hemisphere: the cache also
420
+ * holds clouds a raised observer sees below the horizon.
421
+ */ function remapElevation(pb, elevation, delta, encode) {
422
+ const span = pb.add(Math.PI / 2, delta);
423
+ return encode ? pb.mul(pb.div(pb.add(elevation, delta), span), Math.PI / 2) : pb.sub(pb.mul(pb.div(elevation, Math.PI / 2), span), delta);
424
+ }
425
+ /**
426
+ * Observer-local direction to cloud cache uv: the upper hemisphere octahedron rotated 45 degrees
427
+ * to fill the square (clayjohn clouds.gdshader vec3_to_oct, after J. White, "Signed Octahedron
428
+ * Normal Encoding"), elevation remapped by `delta`. Directions below -delta are clamped to it.
429
+ * @internal
430
+ */ function cloudCacheEncode(scope, dir, delta) {
431
+ const pb = scope.$builder;
432
+ const funcName = 'Z_cloudCacheEncode';
433
+ pb.func(funcName, [
434
+ pb.vec3('d'),
435
+ pb.float('delta')
436
+ ], function() {
437
+ this.$l.horizontal = pb.length(this.d.xz);
438
+ this.$l.azimuth = this.$choice(pb.greaterThan(this.horizontal, 1e-6), pb.div(this.d.xz, this.horizontal), pb.vec2(1, 0));
439
+ this.$l.elevation = pb.asin(pb.clamp(this.d.y, -1, 1));
440
+ this.elevation = pb.clamp(remapElevation(pb, this.elevation, this.delta, true), 0, Math.PI / 2);
441
+ // Octahedron frame: x, y horizontal, z up
442
+ this.$l.e = pb.vec3(pb.mul(this.azimuth, pb.cos(this.elevation)), pb.sin(this.elevation));
443
+ this.e = pb.div(this.e, pb.add(pb.abs(this.e.x), pb.abs(this.e.y), pb.abs(this.e.z)));
444
+ this.$return(pb.vec2(pb.add(0.5, pb.mul(pb.add(this.e.x, this.e.y), 0.5)), pb.add(0.5, pb.mul(pb.sub(this.e.y, this.e.x), 0.5))));
445
+ });
446
+ return pb.getGlobalScope()[funcName](dir, delta);
447
+ }
448
+ /**
449
+ * Cloud cache uv to observer-local direction, inverse of {@link cloudCacheEncode}
450
+ * (clayjohn clouds.glsl oct_to_vec3).
451
+ * @internal
452
+ */ function cloudCacheDecode(scope, uv, delta) {
453
+ const pb = scope.$builder;
454
+ const funcName = 'Z_cloudCacheDecode';
455
+ pb.func(funcName, [
456
+ pb.vec2('uv'),
457
+ pb.float('delta')
458
+ ], function() {
459
+ this.$l.n = pb.vec3(pb.sub(this.uv.x, this.uv.y), pb.sub(pb.add(this.uv.x, this.uv.y), 1), 0);
460
+ this.n.z = pb.max(pb.sub(pb.sub(1, pb.abs(this.n.x)), pb.abs(this.n.y)), 0);
461
+ this.n = pb.normalize(this.n);
462
+ this.$l.elevation = remapElevation(pb, pb.asin(this.n.z), this.delta, false);
463
+ this.$l.horizontal = pb.length(this.n.xy);
464
+ this.$l.azimuth = this.$choice(pb.greaterThan(this.horizontal, 1e-6), pb.div(this.n.xy, this.horizontal), pb.vec2(1, 0));
465
+ this.$l.c = pb.cos(this.elevation);
466
+ this.$return(pb.vec3(pb.mul(this.azimuth.x, this.c), pb.sin(this.elevation), pb.mul(this.azimuth.y, this.c)));
467
+ });
468
+ return pb.getGlobalScope()[funcName](uv, delta);
469
+ }
470
+
471
+ export { CLOUD_BASE_SHADOW_SAMPLE_COUNT, CLOUD_BASE_VIEW_SAMPLE_COUNT, CLOUD_BOTTOM_TRANSITION_METERS, CLOUD_COVERAGE_BASE_RANGE, CLOUD_COVERAGE_RAMP, CLOUD_DETAIL_EROSION, CLOUD_DETAIL_RANGE, CLOUD_DISTANCE_TO_SAMPLE_COUNT_MAX, CLOUD_DISTANT_SKY_LIGHT_ALTITUDE, CLOUD_EDGE_WIDTH, CLOUD_SAMPLE_COUNT_MIN, CLOUD_SHADOW_EDGE_WIDTH, CLOUD_SHADOW_SAMPLE_COUNT_MAX, CLOUD_SHAPE_EROSION, CLOUD_TOP_OFFSET, CLOUD_TRACING_START_MAX_DISTANCE, CLOUD_VIEW_SAMPLE_COUNT_MAX, cloudCacheDecode, cloudCacheEncode, cloudCoverageThreshold, cloudDistantSkyLight, cloudHeightProfile, cloudSampleDensity, cloudTrace, getCloudParamsStruct };
472
+ //# sourceMappingURL=cloud_common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud_common.js","sources":["../../../src/render/volumetric_cloud/cloud_common.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp, ProgramBuilder } from '@zephyr3d/device';\r\nimport type { CloudFormation } from './volumetric_cloud';\r\nimport {\r\n getAtmosphereParamsStruct,\r\n getSkyView,\r\n rayIntersectSphere,\r\n transmittanceToSky\r\n} from '../../shaders/atmosphere';\r\n\r\n/** @internal */\r\nexport const CLOUD_SAMPLE_COUNT_MIN = 2;\r\n/** @internal */\r\nexport const CLOUD_DISTANCE_TO_SAMPLE_COUNT_MAX = 15000;\r\n/** @internal */\r\nexport const CLOUD_TRACING_START_MAX_DISTANCE = 350000;\r\n/** @internal */\r\nexport const CLOUD_BASE_VIEW_SAMPLE_COUNT = 96;\r\n/** @internal */\r\nexport const CLOUD_VIEW_SAMPLE_COUNT_MAX = 768;\r\n/** @internal */\r\nexport const CLOUD_BASE_SHADOW_SAMPLE_COUNT = 10;\r\n/** @internal */\r\nexport const CLOUD_SHADOW_SAMPLE_COUNT_MAX = 80;\r\n/** @internal */\r\nexport const CLOUD_DISTANT_SKY_LIGHT_ALTITUDE = 6000;\r\n/**\r\n * 5th/95th percentiles of the generated Perlin-Worley base shape (seeds 0-2), remapped to [0, 1].\r\n * Imported volumes may have another range.\r\n */\r\nexport const CLOUD_COVERAGE_BASE_RANGE = [0.1552, 0.4032];\r\n/** 5th/95th percentiles of the generated detail fbm (0.625 R + 0.25 G + 0.125 B), remapped to [0, 1]. */\r\nexport const CLOUD_DETAIL_RANGE = [0.53, 0.85];\r\n/** Largest envelope erosion by the base noise; envelope values above it stay solid. */\r\nexport const CLOUD_SHAPE_EROSION = 0.6;\r\n/** Largest envelope erosion by the detail noise, at detail erosion 1. */\r\nexport const CLOUD_DETAIL_EROSION = 0.4;\r\n/** Envelope margin over which the density rises from 0 to 1 below the cloud surface. */\r\nexport const CLOUD_EDGE_WIDTH = 0.35;\r\n/**\r\n * Softer edge for the march towards the sun: its few unjittered x^2 samples would otherwise\r\n * streak the lighting along the sun direction.\r\n */\r\nexport const CLOUD_SHADOW_EDGE_WIDTH = 0.7;\r\n/** Weather value range over which the local coverage ramps from 0 to 1. */\r\nexport const CLOUD_COVERAGE_RAMP = 0.4;\r\n/**\r\n * Weather threshold of a global coverage: connected can fill the map, isolated keeps its gaps.\r\n * @internal\r\n */\r\nexport function cloudCoverageThreshold(coverage: number, formation: CloudFormation) {\r\n const c = Math.min(1, Math.max(0, coverage));\r\n return 1 - c * (formation === 'connected' ? 1 + CLOUD_COVERAGE_RAMP : 1);\r\n}\r\n/** Width of the cloud base transition, in meters. */\r\nexport const CLOUD_BOTTOM_TRANSITION_METERS = 150;\r\n/** [Schneider15] cloud_top_offset: how far the wind pushes cloud tops ahead of their base, in meters */\r\nexport const CLOUD_TOP_OFFSET = 500;\r\n\r\n/**\r\n * Uniform block of the cloud passes.\r\n * @internal\r\n */\r\nexport function getCloudParamsStruct(pb: ProgramBuilder) {\r\n return pb.defineStruct([\r\n // World (planet-fixed) to observer-local rotation the trace was set up with\r\n pb.mat4('referential'),\r\n // (bottom radius, top radius, planet radius, tracing max distance)\r\n pb.vec4('layer'),\r\n // (view sample count max, shadow sample count max, shadow tracing distance, stop transmittance)\r\n pb.vec4('march'),\r\n // (observer-local eye position, 0)\r\n pb.vec4('eye'),\r\n // (direction to the sun, per-sample atmosphere transmittance 0/1)\r\n pb.vec4('sunDir'),\r\n // (sun illuminance outside the atmosphere, 0)\r\n pb.vec4('sunIlluminance'),\r\n // (phase g, phase g2, phase blend, sky light bottom visibility)\r\n pb.vec4('phase'),\r\n // (multiple scattering contribution, occlusion, eccentricity, 0)\r\n pb.vec4('ms'),\r\n // (weather coverage threshold, extinction per meter, detail erosion, anvil bias)\r\n pb.vec4('density'),\r\n // (base noise shaping strength, bottom detail erosion multiplier, global coverage, base variation meters)\r\n pb.vec4('shape'),\r\n // (albedo, 0)\r\n pb.vec4('albedo'),\r\n // (1 / weather map scale, 1 / base noise scale, 1 / detail noise scale, cloud top offset)\r\n pb.vec4('scales'),\r\n // (wind offset of the noise in planet-fixed meters, 0)\r\n pb.vec4('windOffset'),\r\n // (horizontal wind direction x, z, formation: 0 connected / 1 isolated, 0)\r\n pb.vec4('windDir')\r\n ]);\r\n}\r\n\r\n/**\r\n * Both roots of a ray / origin-centred sphere intersection, (-1, -1) when missed.\r\n */\r\nfunction raySphereSolutions(\r\n scope: PBInsideFunctionScope,\r\n origin: PBShaderExp,\r\n dir: PBShaderExp,\r\n radius: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_cloudRaySphereSolutions';\r\n pb.func(funcName, [pb.vec3('o'), pb.vec3('d'), pb.float('r')], function () {\r\n this.$l.b = pb.dot(this.o, this.d);\r\n this.$l.c = pb.sub(pb.dot(this.o, this.o), pb.mul(this.r, this.r));\r\n this.$l.disc = pb.sub(pb.mul(this.b, this.b), this.c);\r\n this.$if(pb.lessThan(this.disc, 0), function () {\r\n this.$return(pb.vec2(-1));\r\n });\r\n this.$l.s = pb.sqrt(this.disc);\r\n this.$return(pb.vec2(pb.sub(pb.neg(this.b), this.s), pb.add(pb.neg(this.b), this.s)));\r\n });\r\n return pb.getGlobalScope()[funcName](origin, dir, radius) as PBShaderExp;\r\n}\r\n\r\n/** Henyey-Greenstein with the forward peak where the view looks into the light. */\r\nfunction hgPhase(scope: PBInsideFunctionScope, g: PBShaderExp, cosTheta: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_cloudHGPhase';\r\n pb.func(funcName, [pb.float('g'), pb.float('c')], function () {\r\n this.$l.numer = pb.sub(1, pb.mul(this.g, this.g));\r\n this.$l.denom = pb.max(pb.sub(pb.add(1, pb.mul(this.g, this.g)), pb.mul(this.g, this.c, 2)), 1e-6);\r\n this.$return(pb.div(this.numer, pb.mul(4 * Math.PI, this.denom, pb.sqrt(this.denom))));\r\n });\r\n return pb.getGlobalScope()[funcName](g, cosTheta) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Returns (height profile, height within the cloud type, bottom ramp, top cut) for a cloud type\r\n * of 0 (stratus), 0.5 (stratocumulus) or 1 (cumulus), the base lifted by `baseOffsetMeters`.\r\n * @internal\r\n */\r\nexport function cloudHeightProfile(\r\n scope: PBInsideFunctionScope,\r\n heightFrac: PBShaderExp,\r\n cloudType: PBShaderExp,\r\n layerHeight: PBShaderExp,\r\n baseOffsetMeters: PBShaderExp | number = 0\r\n) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_cloudVerticalProfile';\r\n pb.func(\r\n funcName,\r\n [pb.float('h'), pb.float('t'), pb.float('layerHeight'), pb.float('baseOffsetMeters')],\r\n function () {\r\n this.$l.cloudType = pb.clamp(this.t, 0, 1);\r\n this.$l.stratus = pb.sub(1, pb.clamp(pb.mul(this.cloudType, 2), 0, 1));\r\n this.$l.stratocumulus = pb.sub(1, pb.mul(pb.abs(pb.sub(this.cloudType, 0.5)), 2));\r\n this.$l.cumulus = pb.mul(pb.clamp(pb.sub(this.cloudType, 0.5), 0, 1), 2);\r\n // (base, nominal end of the bottom ramp, start of the top falloff, top)\r\n this.$l.g = pb.add(\r\n pb.mul(pb.vec4(0, 0.05, 0.09, 0.11), this.stratus),\r\n pb.mul(pb.vec4(0, 0.2, 0.2, 0.625), this.stratocumulus),\r\n pb.mul(pb.vec4(0, 0.0625, 0.2, 1), this.cumulus)\r\n );\r\n this.$l.bottomWidth = pb.min(\r\n pb.min(this.g.y, pb.div(CLOUD_BOTTOM_TRANSITION_METERS, pb.max(this.layerHeight, 1))),\r\n pb.mul(this.g.w, 0.15)\r\n );\r\n this.$l.localBase = pb.clamp(\r\n pb.div(this.baseOffsetMeters, pb.max(this.layerHeight, 1)),\r\n 0,\r\n pb.mul(this.g.w, 0.25)\r\n );\r\n this.$l.bottom = pb.smoothStep(\r\n this.localBase,\r\n pb.add(this.localBase, pb.max(this.bottomWidth, 1e-6)),\r\n this.h\r\n );\r\n this.$l.top = pb.sub(1, pb.smoothStep(this.g.z, this.g.w, this.h));\r\n this.$return(\r\n pb.vec4(\r\n pb.mul(this.bottom, this.top),\r\n pb.clamp(\r\n pb.div(pb.sub(this.h, this.localBase), pb.max(pb.sub(this.g.w, this.localBase), 1e-6)),\r\n 0,\r\n 1\r\n ),\r\n this.bottom,\r\n pb.sub(1, this.top)\r\n )\r\n );\r\n }\r\n );\r\n return pb.getGlobalScope()[funcName](heightFrac, cloudType, layerHeight, baseOffsetMeters) as PBShaderExp;\r\n}\r\n\r\n/** remap(v, l0, h0, l1, h1) of [Schneider15] */\r\nfunction remap(\r\n pb: ProgramBuilder,\r\n v: PBShaderExp | number,\r\n l0: PBShaderExp | number,\r\n h0: PBShaderExp | number,\r\n l1: number,\r\n h1: number\r\n) {\r\n return pb.add(l1, pb.mul(pb.div(pb.sub(v, l0), pb.sub(h0, l0)), h1 - l1));\r\n}\r\n\r\n/**\r\n * Cloud medium at an observer-local position.\r\n *\r\n * Returns (extinction per meter, conservative density, normalized altitude in the layer,\r\n * altitude in the layer in meters). The conservative density omits the detail erosion, so a\r\n * zero lets the march skip the sample.\r\n *\r\n * envelope = bottom(h) * max(coverage - topCut(h), 0)\r\n * margin = envelope - shape * CLOUD_SHAPE_EROSION * (1 - baseNoise)\r\n * - detail * CLOUD_DETAIL_EROSION * detailModifier\r\n * density = saturate(margin / edgeWidth)\r\n *\r\n * @internal\r\n */\r\nexport function cloudSampleDensity(\r\n scope: PBInsideFunctionScope,\r\n cloud: PBShaderExp,\r\n pos: PBShaderExp,\r\n weatherMap: PBShaderExp,\r\n baseNoise: PBShaderExp,\r\n detailNoise: PBShaderExp,\r\n stage: 'profile' | 'base' | 'density' = 'density',\r\n edgeWidth = CLOUD_EDGE_WIDTH\r\n) {\r\n const pb = scope.$builder;\r\n const CloudParams = getCloudParamsStruct(pb);\r\n const funcName = `Z_cloudSampleDensity_${stage}${edgeWidth === CLOUD_EDGE_WIDTH ? '' : '_shadow'}`;\r\n pb.func(funcName, [CloudParams('cloud'), pb.vec3('p')], function () {\r\n this.$l.r = pb.length(this.p);\r\n this.$l.altInLayer = pb.sub(this.r, this.cloud.layer.x);\r\n this.$l.h = pb.div(this.altInLayer, pb.sub(this.cloud.layer.y, this.cloud.layer.x));\r\n this.$if(\r\n pb.or(\r\n pb.lessThanEqual(this.cloud.shape.z, 0),\r\n pb.lessThanEqual(this.h, 0),\r\n pb.greaterThanEqual(this.h, 1)\r\n ),\r\n function () {\r\n this.$return(pb.vec4(0, 0, this.h, this.altInLayer));\r\n }\r\n );\r\n // Planet-fixed position, altitude as height so the noise follows the curvature\r\n this.$l.planet = pb.mul(pb.vec4(this.p, 0), this.cloud.referential).xyz;\r\n this.$l.q = pb.vec3(this.planet.x, pb.sub(this.r, this.cloud.layer.z), this.planet.z);\r\n // Tops skewed along the wind (Nubis 2017); the noise drifts, the coverage stays put\r\n this.q = pb.add(\r\n this.q,\r\n pb.mul(pb.vec3(this.cloud.windDir.x, 0, this.cloud.windDir.y), pb.mul(this.cloud.scales.w, this.h))\r\n );\r\n this.$l.weather = pb.clamp(\r\n pb.textureSampleLevel(weatherMap, pb.mul(this.q.xz, this.cloud.scales.x), 0),\r\n pb.vec4(0),\r\n pb.vec4(1)\r\n );\r\n this.q = pb.add(this.q, this.cloud.windOffset.xyz);\r\n this.$l.coverage = pb.clamp(\r\n pb.div(\r\n pb.sub(pb.mix(this.weather.r, this.weather.g, this.cloud.windDir.z), this.cloud.density.x),\r\n CLOUD_COVERAGE_RAMP\r\n ),\r\n 0,\r\n 1\r\n );\r\n // Anvils: coverage inflated towards the layer top (Nubis 2017)\r\n this.coverage = pb.pow(\r\n this.coverage,\r\n pb.mix(1, pb.mix(1, 0.5, this.cloud.density.w), pb.clamp(pb.mul(pb.sub(this.h, 0.7), 10), 0, 1))\r\n );\r\n this.$if(pb.lessThanEqual(this.coverage, 0), function () {\r\n this.$return(pb.vec4(0, 0, this.h, this.altInLayer));\r\n });\r\n // Base lift: higher for cumulus and towards the footprint edges\r\n this.$l.baseOffset = pb.mul(\r\n this.cloud.shape.w,\r\n pb.add(0.15, pb.mul(this.weather.b, 0.45), pb.mul(pb.sub(1, this.coverage), 0.4))\r\n );\r\n this.$l.heightProfile = cloudHeightProfile(\r\n this,\r\n this.h,\r\n this.weather.b,\r\n pb.sub(this.cloud.layer.y, this.cloud.layer.x),\r\n this.baseOffset\r\n );\r\n this.$l.profile = pb.mul(this.heightProfile.z, pb.max(pb.sub(this.coverage, this.heightProfile.w), 0));\r\n if (stage === 'profile') {\r\n this.$return(\r\n pb.vec4(pb.mul(this.profile, this.cloud.density.y), this.profile, this.h, this.altInLayer)\r\n );\r\n return;\r\n }\r\n this.$l.noise = pb.float(1);\r\n this.$if(pb.greaterThan(this.cloud.shape.x, 0), function () {\r\n this.$l.n = pb.textureSampleLevel(baseNoise, pb.mul(this.q, this.cloud.scales.y), 0);\r\n this.$l.lowFbm = pb.add(pb.mul(this.n.g, 0.625), pb.mul(this.n.b, 0.25), pb.mul(this.n.a, 0.125));\r\n this.$l.rawBase = remap(pb, this.n.r, pb.sub(this.lowFbm, 1), 1, 0, 1);\r\n this.noise = pb.clamp(\r\n remap(pb, this.rawBase, CLOUD_COVERAGE_BASE_RANGE[0], CLOUD_COVERAGE_BASE_RANGE[1], 0, 1),\r\n 0,\r\n 1\r\n );\r\n });\r\n this.$l.margin = pb.sub(\r\n this.profile,\r\n pb.mul(this.cloud.shape.x, CLOUD_SHAPE_EROSION, pb.sub(1, this.noise))\r\n );\r\n this.$l.base = pb.clamp(pb.div(this.margin, edgeWidth), 0, 1);\r\n this.$if(pb.lessThanEqual(this.base, 0), function () {\r\n this.$return(pb.vec4(0, 0, this.h, this.altInLayer));\r\n });\r\n if (stage === 'base') {\r\n this.$return(pb.vec4(pb.mul(this.base, this.cloud.density.y), this.base, this.h, this.altInLayer));\r\n return;\r\n }\r\n this.$if(pb.lessThanEqual(this.cloud.density.z, 0), function () {\r\n this.$return(pb.vec4(pb.mul(this.base, this.cloud.density.y), this.base, this.h, this.altInLayer));\r\n });\r\n this.$l.d = pb.textureSampleLevel(detailNoise, pb.mul(this.q, this.cloud.scales.z), 0).rgb;\r\n this.$l.highFbm = pb.clamp(\r\n remap(\r\n pb,\r\n pb.add(pb.mul(this.d.r, 0.625), pb.mul(this.d.g, 0.25), pb.mul(this.d.b, 0.125)),\r\n CLOUD_DETAIL_RANGE[0],\r\n CLOUD_DETAIL_RANGE[1],\r\n 0,\r\n 1\r\n ),\r\n 0,\r\n 1\r\n );\r\n // Wispy at the base, billowy above\r\n this.$l.modifier = pb.mix(\r\n this.highFbm,\r\n pb.sub(1, this.highFbm),\r\n pb.clamp(pb.mul(this.heightProfile.y, 10), 0, 1)\r\n );\r\n this.$l.bottomErosion = pb.mix(this.cloud.shape.y, 1, pb.smoothStep(0, 0.25, this.heightProfile.y));\r\n this.margin = pb.sub(\r\n this.margin,\r\n pb.mul(this.modifier, this.cloud.density.z, this.bottomErosion, CLOUD_DETAIL_EROSION)\r\n );\r\n this.$l.eroded = pb.clamp(pb.div(this.margin, edgeWidth), 0, 1);\r\n this.$return(pb.vec4(pb.mul(this.eroded, this.cloud.density.y), this.base, this.h, this.altInLayer));\r\n });\r\n return pb.getGlobalScope()[funcName](cloud, pos) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Traces the clouds along one view ray from the cloud eye position.\r\n *\r\n * Returns (scattered luminance with aerial perspective, mean transmittance), the luminance in the\r\n * units of the atmosphere (`params.lightColor`) so it composites directly over `skyBox()`:\r\n * `sky * a + rgb`.\r\n *\r\n * @param msCount - 1 + multiple scattering octaves, compile time\r\n * @param jitter - start offset of the march in steps, 0..1\r\n * @param stepScale - scales the sample count, below 1 for quick previews\r\n * @internal\r\n */\r\nexport function cloudTrace(\r\n scope: PBInsideFunctionScope,\r\n msCount: number,\r\n atmosphere: PBShaderExp,\r\n cloud: PBShaderExp,\r\n dir: PBShaderExp,\r\n jitter: PBShaderExp,\r\n stepScale: PBShaderExp,\r\n ambient: PBShaderExp,\r\n textures: {\r\n weatherMap: PBShaderExp;\r\n baseNoise: PBShaderExp;\r\n detailNoise: PBShaderExp;\r\n transmittanceLut: PBShaderExp;\r\n multiScatteringLut: PBShaderExp;\r\n }\r\n) {\r\n const pb = scope.$builder;\r\n const AtmosphereParams = getAtmosphereParamsStruct(pb);\r\n const CloudParams = getCloudParamsStruct(pb);\r\n const funcName = `Z_cloudTrace${msCount}`;\r\n const density = (s: PBInsideFunctionScope, p: PBShaderExp, edgeWidth = CLOUD_EDGE_WIDTH) =>\r\n cloudSampleDensity(\r\n s,\r\n s.cloud,\r\n p,\r\n textures.weatherMap,\r\n textures.baseNoise,\r\n textures.detailNoise,\r\n 'density',\r\n edgeWidth\r\n );\r\n pb.func(\r\n funcName,\r\n [\r\n AtmosphereParams('atmo'),\r\n CloudParams('cloud'),\r\n pb.vec3('dir'),\r\n pb.float('jitter'),\r\n pb.float('stepScale'),\r\n pb.vec3('ambient')\r\n ],\r\n function () {\r\n this.$l.eye = this.cloud.eye.xyz;\r\n this.$l.tTop2 = raySphereSolutions(this, this.eye, this.dir, this.cloud.layer.y);\r\n this.$l.tBottom2 = raySphereSolutions(this, this.eye, this.dir, this.cloud.layer.x);\r\n this.$l.tMin = pb.float(0);\r\n this.$l.tMax = pb.float(0);\r\n this.$if(pb.and(pb.lessThan(this.tTop2.x, 0), pb.lessThan(this.tTop2.y, 0)), function () {\r\n this.$return(pb.vec4(0, 0, 0, 1));\r\n });\r\n this.$if(pb.greaterThan(pb.abs(pb.sub(this.tBottom2.x, this.tBottom2.y)), 0), function () {\r\n this.$l.bottomBothAhead = pb.all(pb.greaterThan(this.tBottom2, pb.vec2(0)));\r\n this.$l.tempTop = this.$choice(\r\n pb.all(pb.greaterThan(this.tTop2, pb.vec2(0))),\r\n pb.min(this.tTop2.x, this.tTop2.y),\r\n pb.max(this.tTop2.x, this.tTop2.y)\r\n );\r\n this.$l.tempBottom = this.$choice(\r\n this.bottomBothAhead,\r\n pb.min(this.tBottom2.x, this.tBottom2.y),\r\n pb.max(this.tBottom2.x, this.tBottom2.y)\r\n );\r\n this.$if(this.bottomBothAhead, function () {\r\n this.tempTop = pb.max(0, pb.min(this.tTop2.x, this.tTop2.y));\r\n });\r\n this.tMin = pb.min(this.tempBottom, this.tempTop);\r\n this.tMax = pb.max(this.tempBottom, this.tempTop);\r\n }).$else(function () {\r\n this.tMin = this.tTop2.x;\r\n this.tMax = this.tTop2.y;\r\n });\r\n this.tMin = pb.max(this.tMin, 0);\r\n this.tMax = pb.max(this.tMax, 0);\r\n this.$l.tGround = rayIntersectSphere(this, pb.vec3(0), this.cloud.layer.z, this.eye, this.dir);\r\n this.$if(pb.greaterThan(this.tGround, 0), function () {\r\n this.tMax = pb.min(this.tMax, this.tGround);\r\n });\r\n this.$if(\r\n pb.or(\r\n pb.lessThanEqual(this.tMax, this.tMin),\r\n pb.greaterThan(this.tMin, CLOUD_TRACING_START_MAX_DISTANCE)\r\n ),\r\n function () {\r\n this.$return(pb.vec4(0, 0, 0, 1));\r\n }\r\n );\r\n // TracingMaxDistanceMode 0: distance after the layer entry\r\n this.tMax = pb.add(this.tMin, pb.min(this.cloud.layer.w, pb.sub(this.tMax, this.tMin)));\r\n this.$l.stepCount = pb.max(\r\n pb.floor(\r\n pb.mul(\r\n this.cloud.march.x,\r\n this.stepScale,\r\n pb.clamp(pb.div(pb.sub(this.tMax, this.tMin), CLOUD_DISTANCE_TO_SAMPLE_COUNT_MAX), 0, 1)\r\n )\r\n ),\r\n CLOUD_SAMPLE_COUNT_MIN\r\n );\r\n this.$l.stepT = pb.div(pb.sub(this.tMax, this.tMin), this.stepCount);\r\n this.$l.iStepCount = pb.int(this.stepCount);\r\n\r\n this.$l.msScatt = this.cloud.ms.x;\r\n this.$l.msExtin = pb.clamp(this.cloud.ms.y, 0, 1);\r\n this.$l.cosTheta = pb.dot(this.cloud.sunDir.xyz, this.dir);\r\n this.$l.phase0 = pb.mix(\r\n hgPhase(this, this.cloud.phase.x, this.cosTheta),\r\n hgPhase(this, this.cloud.phase.y, this.cosTheta),\r\n this.cloud.phase.z\r\n );\r\n // SetupParticipatingMediaPhaseContext\r\n const isotropic = 1 / (4 * Math.PI);\r\n this.$l.msPhaseFactor = pb.clamp(this.cloud.ms.z, 0, 1);\r\n for (let ms = 0; ms < msCount; ms++) {\r\n if (ms === 0) {\r\n this.$l.phaseMs0 = this.phase0;\r\n } else {\r\n this.$l[`phaseMs${ms}`] = pb.mix(isotropic, this.phase0, this.msPhaseFactor);\r\n this.msPhaseFactor = pb.mul(this.msPhaseFactor, this.msPhaseFactor);\r\n }\r\n }\r\n // Sun illuminance: outside the atmosphere with per-sample transmittance, else at the eye\r\n this.$l.perSample = pb.notEqual(this.cloud.sunDir.w, 0);\r\n this.$l.lightIlluminance = this.cloud.sunIlluminance.xyz;\r\n this.$if(pb.not(this.perSample), function () {\r\n this.lightIlluminance = pb.mul(\r\n this.lightIlluminance,\r\n transmittanceToSky(this, this.atmo, this.eye, this.cloud.sunDir.xyz, textures.transmittanceLut)\r\n );\r\n });\r\n\r\n this.$l.luminance = pb.vec3(0);\r\n this.$l.transmittanceToView = pb.float(1);\r\n this.$l.tAPWeightedSum = pb.float(0);\r\n this.$l.tAPWeightsSum = pb.float(0);\r\n this.$l.t = pb.add(this.tMin, pb.mul(this.jitter, this.stepT));\r\n this.$l.shadowCount = this.cloud.march.y;\r\n this.$l.shadowLength = this.cloud.march.z;\r\n this.$for(pb.int('i'), 0, this.iStepCount, function () {\r\n this.$l.samplePos = pb.add(this.eye, pb.mul(this.dir, this.t));\r\n this.$l.medium = density(this, this.samplePos);\r\n // Conservative density 0 or outside the layer: skip (StepSizeOnZeroConservativeDensity 1)\r\n this.$if(pb.lessThanEqual(this.medium.y, 0), function () {\r\n this.t = pb.add(this.t, this.stepT);\r\n this.$continue();\r\n });\r\n this.$l.extinction = this.medium.x;\r\n this.$l.scattering = pb.mul(this.cloud.albedo.xyz, this.extinction);\r\n // SetupParticipatingMediaContext\r\n this.$l.sFactor = this.msScatt;\r\n this.$l.eFactor = this.msExtin;\r\n this.$l.atmoTransmittance = pb.vec3(1);\r\n this.$if(this.perSample, function () {\r\n this.atmoTransmittance = transmittanceToSky(\r\n this,\r\n this.atmo,\r\n this.samplePos,\r\n this.cloud.sunDir.xyz,\r\n textures.transmittanceLut\r\n );\r\n });\r\n for (let ms = 0; ms < msCount; ms++) {\r\n if (ms === 0) {\r\n this.$l.scat0 = this.scattering;\r\n this.$l.ext0 = this.extinction;\r\n } else {\r\n this.$l[`scat${ms}`] = pb.mul(this[`scat${ms - 1}`], this.sFactor);\r\n this.$l[`ext${ms}`] = pb.mul(this[`ext${ms - 1}`], this.eFactor);\r\n this.sFactor = pb.mul(this.sFactor, this.sFactor);\r\n this.eFactor = pb.mul(this.eFactor, this.eFactor);\r\n }\r\n this.$l[`lightT${ms}`] = this.atmoTransmittance;\r\n }\r\n this.$l.distantLight = pb.mul(\r\n this.ambient,\r\n pb.clamp(pb.add(this.cloud.phase.w, this.medium.z), 0, 1)\r\n );\r\n this.$if(pb.greaterThan(this.extinction, 0), function () {\r\n for (let ms = 0; ms < msCount; ms++) {\r\n this.$l[`extAcc${ms}`] = pb.float(0);\r\n }\r\n this.$l.prevNormT = pb.float(0);\r\n this.$for(pb.int('j'), 1, pb.add(pb.int(this.shadowCount), 1), function () {\r\n this.$l.normT = pb.div(pb.float(this.j), this.shadowCount);\r\n this.$l.curNormT = pb.mul(this.normT, this.normT);\r\n this.$l.deltaNormT = pb.sub(this.curNormT, this.prevNormT);\r\n this.$l.shadowPos = pb.add(\r\n this.samplePos,\r\n pb.mul(\r\n this.cloud.sunDir.xyz,\r\n this.shadowLength,\r\n pb.add(this.prevNormT, pb.mul(this.deltaNormT, 0.5))\r\n )\r\n );\r\n this.prevNormT = this.curNormT;\r\n this.$l.shadowMedium = density(this, this.shadowPos, CLOUD_SHADOW_EDGE_WIDTH);\r\n this.$if(\r\n pb.or(pb.lessThanEqual(this.shadowMedium.z, 0), pb.greaterThanEqual(this.shadowMedium.z, 1)),\r\n function () {\r\n this.$break();\r\n }\r\n );\r\n this.$if(pb.lessThanEqual(this.shadowMedium.y, 0), function () {\r\n this.$continue();\r\n });\r\n this.$l.shadowExt = this.shadowMedium.x;\r\n this.$l.shadowEFactor = this.msExtin;\r\n for (let ms = 0; ms < msCount; ms++) {\r\n this[`extAcc${ms}`] = pb.add(this[`extAcc${ms}`], pb.mul(this.shadowExt, this.deltaNormT));\r\n if (ms + 1 < msCount) {\r\n this.shadowExt = pb.mul(this.shadowExt, this.shadowEFactor);\r\n this.shadowEFactor = pb.mul(this.shadowEFactor, this.shadowEFactor);\r\n }\r\n }\r\n });\r\n for (let ms = 0; ms < msCount; ms++) {\r\n this[`lightT${ms}`] = pb.mul(\r\n this[`lightT${ms}`],\r\n pb.exp(pb.neg(pb.mul(this[`extAcc${ms}`], this.shadowLength)))\r\n );\r\n }\r\n // Transmittance-weighted depth for the aerial perspective\r\n this.tAPWeightedSum = pb.add(this.tAPWeightedSum, pb.mul(this.t, this.transmittanceToView));\r\n this.tAPWeightsSum = pb.add(this.tAPWeightsSum, this.transmittanceToView);\r\n });\r\n for (let ms = msCount - 1; ms >= 0; ms--) {\r\n this.$l.sunSky = pb.mul(this[`lightT${ms}`], this.lightIlluminance, this[`phaseMs${ms}`]);\r\n if (ms === 0) {\r\n this.sunSky = pb.add(this.sunSky, this.distantLight);\r\n }\r\n this.$l.scattered = pb.mul(this.sunSky, this[`scat${ms}`]);\r\n this.$l.safeExt = pb.max(this[`ext${ms}`], 1e-6);\r\n this.$l.segT = pb.exp(pb.neg(pb.mul(this.safeExt, this.stepT)));\r\n this.luminance = pb.add(\r\n this.luminance,\r\n pb.mul(\r\n this.transmittanceToView,\r\n pb.div(pb.sub(this.scattered, pb.mul(this.scattered, this.segT)), this.safeExt)\r\n )\r\n );\r\n if (ms === 0) {\r\n this.transmittanceToView = pb.mul(this.transmittanceToView, this.segT);\r\n }\r\n }\r\n this.$if(pb.lessThan(this.transmittanceToView, this.cloud.march.w), function () {\r\n this.$break();\r\n });\r\n this.t = pb.add(this.t, this.stepT);\r\n });\r\n // Aerial perspective at the mean cloud depth, integrated along the direction since\r\n // the cache covers directions outside any camera's AP froxel volume\r\n this.$if(pb.greaterThan(this.tAPWeightsSum, 0), function () {\r\n this.$l.tAP = pb.div(this.tAPWeightedSum, pb.max(this.tAPWeightsSum, 1e-10));\r\n this.$l.ap = getSkyView(\r\n this,\r\n this.atmo,\r\n this.eye,\r\n this.dir,\r\n this.tAP,\r\n textures.transmittanceLut,\r\n textures.multiScatteringLut\r\n );\r\n this.luminance = pb.add(\r\n pb.mul(this.ap.rgb, pb.sub(1, this.transmittanceToView)),\r\n pb.mul(this.luminance, this.ap.a)\r\n );\r\n });\r\n this.$return(pb.vec4(this.luminance, this.transmittanceToView));\r\n }\r\n );\r\n return pb.getGlobalScope()[funcName](atmosphere, cloud, dir, jitter, stepScale, ambient) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Average sky luminance over the sphere at the distant sky light altitude.\r\n * @internal\r\n */\r\nexport function cloudDistantSkyLight(\r\n scope: PBInsideFunctionScope,\r\n atmosphere: PBShaderExp,\r\n sphereSamples: PBShaderExp,\r\n transmittanceLut: PBShaderExp,\r\n multiScatteringLut: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n const AtmosphereParams = getAtmosphereParamsStruct(pb);\r\n const funcName = 'Z_cloudDistantSkyLight';\r\n pb.func(funcName, [AtmosphereParams('atmo')], function () {\r\n this.$l.pos = pb.vec3(0, pb.add(this.atmo.plantRadius, CLOUD_DISTANT_SKY_LIGHT_ALTITUDE), 0);\r\n this.$l.sum = pb.vec3(0);\r\n this.$for(pb.int('i'), 0, 64, function () {\r\n this.sum = pb.add(\r\n this.sum,\r\n getSkyView(\r\n this,\r\n this.atmo,\r\n this.pos,\r\n sphereSamples.at(this.i).xyz,\r\n pb.float(-1),\r\n transmittanceLut,\r\n multiScatteringLut,\r\n false\r\n ).rgb\r\n );\r\n });\r\n // sum * (4 pi / 64) * (1 / (4 pi))\r\n this.$return(pb.div(this.sum, 64));\r\n });\r\n return pb.getGlobalScope()[funcName](atmosphere) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Elevation of the cached sky remapped so [-delta, pi/2] fills the hemisphere: the cache also\r\n * holds clouds a raised observer sees below the horizon.\r\n */\r\nfunction remapElevation(pb: ProgramBuilder, elevation: PBShaderExp, delta: PBShaderExp, encode: boolean) {\r\n const span = pb.add(Math.PI / 2, delta);\r\n return encode\r\n ? pb.mul(pb.div(pb.add(elevation, delta), span), Math.PI / 2)\r\n : pb.sub(pb.mul(pb.div(elevation, Math.PI / 2), span), delta);\r\n}\r\n\r\n/**\r\n * Observer-local direction to cloud cache uv: the upper hemisphere octahedron rotated 45 degrees\r\n * to fill the square (clayjohn clouds.gdshader vec3_to_oct, after J. White, \"Signed Octahedron\r\n * Normal Encoding\"), elevation remapped by `delta`. Directions below -delta are clamped to it.\r\n * @internal\r\n */\r\nexport function cloudCacheEncode(scope: PBInsideFunctionScope, dir: PBShaderExp, delta: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_cloudCacheEncode';\r\n pb.func(funcName, [pb.vec3('d'), pb.float('delta')], function () {\r\n this.$l.horizontal = pb.length(this.d.xz);\r\n this.$l.azimuth = this.$choice(\r\n pb.greaterThan(this.horizontal, 1e-6),\r\n pb.div(this.d.xz, this.horizontal),\r\n pb.vec2(1, 0)\r\n );\r\n this.$l.elevation = pb.asin(pb.clamp(this.d.y, -1, 1));\r\n this.elevation = pb.clamp(remapElevation(pb, this.elevation, this.delta, true), 0, Math.PI / 2);\r\n // Octahedron frame: x, y horizontal, z up\r\n this.$l.e = pb.vec3(pb.mul(this.azimuth, pb.cos(this.elevation)), pb.sin(this.elevation));\r\n this.e = pb.div(this.e, pb.add(pb.abs(this.e.x), pb.abs(this.e.y), pb.abs(this.e.z)));\r\n this.$return(\r\n pb.vec2(\r\n pb.add(0.5, pb.mul(pb.add(this.e.x, this.e.y), 0.5)),\r\n pb.add(0.5, pb.mul(pb.sub(this.e.y, this.e.x), 0.5))\r\n )\r\n );\r\n });\r\n return pb.getGlobalScope()[funcName](dir, delta) as PBShaderExp;\r\n}\r\n\r\n/**\r\n * Cloud cache uv to observer-local direction, inverse of {@link cloudCacheEncode}\r\n * (clayjohn clouds.glsl oct_to_vec3).\r\n * @internal\r\n */\r\nexport function cloudCacheDecode(scope: PBInsideFunctionScope, uv: PBShaderExp, delta: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_cloudCacheDecode';\r\n pb.func(funcName, [pb.vec2('uv'), pb.float('delta')], function () {\r\n this.$l.n = pb.vec3(pb.sub(this.uv.x, this.uv.y), pb.sub(pb.add(this.uv.x, this.uv.y), 1), 0);\r\n this.n.z = pb.max(pb.sub(pb.sub(1, pb.abs(this.n.x)), pb.abs(this.n.y)), 0);\r\n this.n = pb.normalize(this.n);\r\n this.$l.elevation = remapElevation(pb, pb.asin(this.n.z), this.delta, false);\r\n this.$l.horizontal = pb.length(this.n.xy);\r\n this.$l.azimuth = this.$choice(\r\n pb.greaterThan(this.horizontal, 1e-6),\r\n pb.div(this.n.xy, this.horizontal),\r\n pb.vec2(1, 0)\r\n );\r\n this.$l.c = pb.cos(this.elevation);\r\n this.$return(\r\n pb.vec3(pb.mul(this.azimuth.x, this.c), pb.sin(this.elevation), pb.mul(this.azimuth.y, this.c))\r\n );\r\n });\r\n return pb.getGlobalScope()[funcName](uv, delta) as PBShaderExp;\r\n}\r\n"],"names":["CLOUD_SAMPLE_COUNT_MIN","CLOUD_DISTANCE_TO_SAMPLE_COUNT_MAX","CLOUD_TRACING_START_MAX_DISTANCE","CLOUD_BASE_VIEW_SAMPLE_COUNT","CLOUD_VIEW_SAMPLE_COUNT_MAX","CLOUD_BASE_SHADOW_SAMPLE_COUNT","CLOUD_SHADOW_SAMPLE_COUNT_MAX","CLOUD_DISTANT_SKY_LIGHT_ALTITUDE","CLOUD_COVERAGE_BASE_RANGE","CLOUD_DETAIL_RANGE","CLOUD_SHAPE_EROSION","CLOUD_DETAIL_EROSION","CLOUD_EDGE_WIDTH","CLOUD_SHADOW_EDGE_WIDTH","CLOUD_COVERAGE_RAMP","cloudCoverageThreshold","coverage","formation","c","Math","min","max","CLOUD_BOTTOM_TRANSITION_METERS","CLOUD_TOP_OFFSET","getCloudParamsStruct","pb","defineStruct","mat4","vec4","raySphereSolutions","scope","origin","dir","radius","$builder","funcName","func","vec3","float","$l","b","dot","o","d","sub","mul","r","disc","$if","lessThan","$return","vec2","s","sqrt","neg","add","getGlobalScope","hgPhase","g","cosTheta","numer","denom","div","PI","cloudHeightProfile","heightFrac","cloudType","layerHeight","baseOffsetMeters","clamp","t","stratus","stratocumulus","abs","cumulus","bottomWidth","y","w","localBase","bottom","smoothStep","h","top","z","remap","v","l0","h0","l1","h1","cloudSampleDensity","cloud","pos","weatherMap","baseNoise","detailNoise","stage","edgeWidth","CloudParams","length","p","altInLayer","layer","x","or","lessThanEqual","shape","greaterThanEqual","planet","referential","xyz","q","windDir","scales","weather","textureSampleLevel","xz","windOffset","mix","density","pow","baseOffset","heightProfile","profile","noise","greaterThan","n","lowFbm","a","rawBase","margin","base","rgb","highFbm","modifier","bottomErosion","eroded","cloudTrace","msCount","atmosphere","jitter","stepScale","ambient","textures","AtmosphereParams","getAtmosphereParamsStruct","eye","tTop2","tBottom2","tMin","tMax","and","bottomBothAhead","all","tempTop","$choice","tempBottom","$else","tGround","rayIntersectSphere","stepCount","floor","march","stepT","iStepCount","int","msScatt","ms","msExtin","sunDir","phase0","phase","isotropic","msPhaseFactor","phaseMs0","perSample","notEqual","lightIlluminance","sunIlluminance","not","transmittanceToSky","atmo","transmittanceLut","luminance","transmittanceToView","tAPWeightedSum","tAPWeightsSum","shadowCount","shadowLength","$for","samplePos","medium","$continue","extinction","scattering","albedo","sFactor","eFactor","atmoTransmittance","scat0","ext0","distantLight","prevNormT","normT","j","curNormT","deltaNormT","shadowPos","shadowMedium","$break","shadowExt","shadowEFactor","exp","sunSky","scattered","safeExt","segT","tAP","ap","getSkyView","multiScatteringLut","cloudDistantSkyLight","sphereSamples","plantRadius","sum","at","i","remapElevation","elevation","delta","encode","span","cloudCacheEncode","horizontal","azimuth","asin","e","cos","sin","cloudCacheDecode","uv","normalize","xy"],"mappings":"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"}