@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.
- package/README.md +60 -27
- package/dist/animation/animation_bank.js +634 -0
- package/dist/animation/animation_bank.js.map +1 -0
- package/dist/animation/animation_bank_gpu.js +256 -0
- package/dist/animation/animation_bank_gpu.js.map +1 -0
- package/dist/animation/animationset.js +146 -30
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/cloth/gpu_cloth_component.js +406 -0
- package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
- package/dist/animation/cloth/gpu_cloth_system.js +332 -202
- package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
- package/dist/animation/gpu_animation_driver.js +289 -0
- package/dist/animation/gpu_animation_driver.js.map +1 -0
- package/dist/animation/joint_dynamics/collision.js +112 -1
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +6 -0
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +50 -12
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/animation/skeleton.js +300 -56
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skin_palette_atlas.js +252 -0
- package/dist/animation/skin_palette_atlas.js.map +1 -0
- package/dist/animation/spring/multi_chain_spring_system.js +298 -38
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
- package/dist/animation/spring/spring_chain.js +2 -0
- package/dist/animation/spring/spring_chain.js.map +1 -1
- package/dist/animation/spring/spring_collider.js +159 -21
- package/dist/animation/spring/spring_collider.js.map +1 -1
- package/dist/animation/spring/spring_particle.js +1 -0
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring/spring_solver.js +173 -0
- package/dist/animation/spring/spring_solver.js.map +1 -0
- package/dist/animation/spring/spring_system.js +249 -24
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring_modifier.js +32 -1
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/app/app.js +26 -0
- package/dist/app/app.js.map +1 -1
- package/dist/app/engine.js +86 -15
- package/dist/app/engine.js.map +1 -1
- package/dist/app/gamepad.js +191 -0
- package/dist/app/gamepad.js.map +1 -0
- package/dist/app/inputactions.js +271 -0
- package/dist/app/inputactions.js.map +1 -0
- package/dist/app/inputmgr.js +331 -22
- package/dist/app/inputmgr.js.map +1 -1
- package/dist/app/loading.js +138 -0
- package/dist/app/loading.js.map +1 -0
- package/dist/app/pipelinecache.js +209 -0
- package/dist/app/pipelinecache.js.map +1 -0
- package/dist/app/runtimescript.js +25 -0
- package/dist/app/runtimescript.js.map +1 -1
- package/dist/app/scriptingsystem.js +54 -0
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +7 -2
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/asset_manifest.js +59 -0
- package/dist/asset/asset_manifest.js.map +1 -0
- package/dist/asset/asset_preload.js +258 -0
- package/dist/asset/asset_preload.js.map +1 -0
- package/dist/asset/assetmanager.js +117 -65
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/dist/asset/loaders/ktx2/basis_location.js +17 -0
- package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
- package/dist/asset/mesh_lod_builder.js +104 -0
- package/dist/asset/mesh_lod_builder.js.map +1 -0
- package/dist/asset/mesh_settings.js +111 -0
- package/dist/asset/mesh_settings.js.map +1 -0
- package/dist/asset/meshopt_decoder.js +18 -0
- package/dist/asset/meshopt_decoder.js.map +1 -0
- package/dist/asset/meshopt_simplifier.js +26 -0
- package/dist/asset/meshopt_simplifier.js.map +1 -0
- package/dist/asset/model.js +177 -3
- package/dist/asset/model.js.map +1 -1
- package/dist/asset/texture_settings.js +231 -0
- package/dist/asset/texture_settings.js.map +1 -0
- package/dist/asset/zmsh_binary.js +131 -0
- package/dist/asset/zmsh_binary.js.map +1 -0
- package/dist/asset/zsdf_binary.js +111 -0
- package/dist/asset/zsdf_binary.js.map +1 -0
- package/dist/blitter/bilateralblur.js +1 -2
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/gaussianblur.js +1 -6
- package/dist/blitter/gaussianblur.js.map +1 -1
- package/dist/camera/base.js +31 -10
- package/dist/camera/base.js.map +1 -1
- package/dist/camera/camera.js +178 -200
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/follow.js +342 -0
- package/dist/camera/follow.js.map +1 -0
- package/dist/camera/fps.js +9 -7
- package/dist/camera/fps.js.map +1 -1
- package/dist/camera/orbit.js +46 -19
- package/dist/camera/orbit.js.map +1 -1
- package/dist/index.d.ts +30475 -19865
- package/dist/index.js +67 -12
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +3 -0
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/eye.js +1 -1
- package/dist/material/eye.js.map +1 -1
- package/dist/material/hair.js +2 -3
- package/dist/material/hair.js.map +1 -1
- package/dist/material/hairstrand.js +235 -235
- package/dist/material/hairstrand.js.map +1 -1
- package/dist/material/lambert.js +4 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +362 -300
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +118 -45
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +223 -83
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +31 -206
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mtoon.js +1 -1
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrmr.js +3 -0
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +3 -0
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/sdf_debug.js +78 -0
- package/dist/material/sdf_debug.js.map +1 -0
- package/dist/material/shader/helper.js +733 -190
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/shader/terrain_blend.js +204 -43
- package/dist/material/shader/terrain_blend.js.map +1 -1
- package/dist/material/skin.js +331 -297
- package/dist/material/skin.js.map +1 -1
- package/dist/material/skinprofile.js +1058 -0
- package/dist/material/skinprofile.js.map +1 -0
- package/dist/material/sss.js +353 -0
- package/dist/material/sss.js.map +1 -0
- package/dist/material/sss_kernel.js +265 -0
- package/dist/material/sss_kernel.js.map +1 -0
- package/dist/material/sssprofile.js +879 -0
- package/dist/material/sssprofile.js.map +1 -0
- package/dist/material/subsurfaceprofile.js +4 -8
- package/dist/material/subsurfaceprofile.js.map +1 -1
- package/dist/material/terrain-cm.js +464 -188
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/unlit.js +3 -0
- package/dist/material/unlit.js.map +1 -1
- package/dist/material/water.js +2009 -201
- package/dist/material/water.js.map +1 -1
- package/dist/node_modules/meshoptimizer/LICENSE +21 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
- package/dist/physics/character.js +226 -0
- package/dist/physics/character.js.map +1 -0
- package/dist/physics/collider.js +209 -0
- package/dist/physics/collider.js.map +1 -0
- package/dist/physics/events.js +79 -0
- package/dist/physics/events.js.map +1 -0
- package/dist/physics/joint.js +272 -0
- package/dist/physics/joint.js.map +1 -0
- package/dist/physics/node_physics.js +234 -0
- package/dist/physics/node_physics.js.map +1 -0
- package/dist/physics/part.js +91 -0
- package/dist/physics/part.js.map +1 -0
- package/dist/physics/rigid_body.js +379 -0
- package/dist/physics/rigid_body.js.map +1 -0
- package/dist/physics/vehicle.js +335 -0
- package/dist/physics/vehicle.js.map +1 -0
- package/dist/physics/world.js +25 -0
- package/dist/physics/world.js.map +1 -0
- package/dist/posteffect/bloom.js +49 -14
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/motionblur.js +668 -63
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +12 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/postsss.js +572 -0
- package/dist/posteffect/postsss.js.map +1 -0
- package/dist/posteffect/sao.js +48 -50
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +605 -355
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +91 -162
- package/dist/posteffect/ssgi.js.map +1 -1
- package/dist/posteffect/ssr.js +3 -11
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +34 -15
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js +1 -0
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/render/abuffer_oit.js +40 -39
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +328 -62
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cluster_light.js +958 -224
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +26 -5
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/debug_views.js +37 -0
- package/dist/render/debug_views.js.map +1 -0
- package/dist/render/depthpass.js +5 -1
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable_mixin.js +53 -6
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +53 -53
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +196 -113
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +8 -13
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +268 -136
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +113 -28
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/gi/probe_volume.js +1334 -0
- package/dist/render/gi/probe_volume.js.map +1 -0
- package/dist/render/gi/scene_gi.js +282 -0
- package/dist/render/gi/scene_gi.js.map +1 -0
- package/dist/render/gi/voxel_atlas.js +198 -0
- package/dist/render/gi/voxel_atlas.js.map +1 -0
- package/dist/render/gi/voxel_lighting.js +652 -0
- package/dist/render/gi/voxel_lighting.js.map +1 -0
- package/dist/render/gi/voxel_scene.js +642 -0
- package/dist/render/gi/voxel_scene.js.map +1 -0
- package/dist/render/gi/voxelize_pass.js +223 -0
- package/dist/render/gi/voxelize_pass.js.map +1 -0
- package/dist/render/globalbindgroup_allocator.js +3 -2
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/gpu_picking.js +9 -36
- package/dist/render/gpu_picking.js.map +1 -1
- package/dist/render/hzb.js +80 -22
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/instance_culling.js +499 -0
- package/dist/render/instance_culling.js.map +1 -0
- package/dist/render/lightpass.js +23 -9
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/lod.js +46 -0
- package/dist/render/lod.js.map +1 -0
- package/dist/render/oit.js +11 -11
- package/dist/render/oit.js.map +1 -1
- package/dist/render/primitive.js +301 -9
- package/dist/render/primitive.js.map +1 -1
- package/dist/render/primitive_readback.js +209 -0
- package/dist/render/primitive_readback.js.map +1 -0
- package/dist/render/render_queue.js +198 -11
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +14 -7
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +15 -1
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/executor.js +136 -0
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +585 -59
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +8 -1
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/scene_render_context.js +31 -2
- package/dist/render/rendergraph/scene_render_context.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +28 -5
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/sdf/box_allocator.js +98 -0
- package/dist/render/sdf/box_allocator.js.map +1 -0
- package/dist/render/sdf/global_sdf.js +865 -0
- package/dist/render/sdf/global_sdf.js.map +1 -0
- package/dist/render/sdf/scene_sdf.js +562 -0
- package/dist/render/sdf/scene_sdf.js.map +1 -0
- package/dist/render/sdf/sdf_atlas.js +227 -0
- package/dist/render/sdf/sdf_atlas.js.map +1 -0
- package/dist/render/sdf/sdf_programs.js +42 -0
- package/dist/render/sdf/sdf_programs.js.map +1 -0
- package/dist/render/sdf/sdf_view.js +199 -0
- package/dist/render/sdf/sdf_view.js.map +1 -0
- package/dist/render/sdf/waterline.js +610 -0
- package/dist/render/sdf/waterline.js.map +1 -0
- package/dist/render/shadow_mask_pass.js +142 -25
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/shore_wave_generator.js +1193 -0
- package/dist/render/shore_wave_generator.js.map +1 -0
- package/dist/render/sky.js +516 -86
- package/dist/render/sky.js.map +1 -1
- package/dist/render/transmission_thickness_pass.js +477 -0
- package/dist/render/transmission_thickness_pass.js.map +1 -0
- package/dist/render/underwater.js +524 -0
- package/dist/render/underwater.js.map +1 -0
- package/dist/render/virtualtexture/virtual_texture.js +1214 -0
- package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_common.js +472 -0
- package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
- package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
- package/dist/render/volumetric_cloud/debug_view.js +131 -0
- package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
- package/dist/render/volumetric_cloud/resources.js +380 -0
- package/dist/render/volumetric_cloud/resources.js.map +1 -0
- package/dist/render/volumetric_cloud/sky_cache.js +380 -0
- package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
- package/dist/render/water_caustics.js +1195 -0
- package/dist/render/water_caustics.js.map +1 -0
- package/dist/render/water_foam.js +627 -0
- package/dist/render/water_foam.js.map +1 -0
- package/dist/render/water_interaction.js +1795 -0
- package/dist/render/water_interaction.js.map +1 -0
- package/dist/render/weightedblended_oit.js +36 -36
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +9 -4
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +108 -12
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +28 -7
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/foliage.js +1020 -0
- package/dist/scene/foliage.js.map +1 -0
- package/dist/scene/foliage_buckets.js +147 -0
- package/dist/scene/foliage_buckets.js.map +1 -0
- package/dist/scene/foliage_mask.js +358 -0
- package/dist/scene/foliage_mask.js.map +1 -0
- package/dist/scene/hair.js +15 -4
- package/dist/scene/hair.js.map +1 -1
- package/dist/scene/light.js +179 -13
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +327 -45
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +6 -0
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +9 -3
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +9 -3
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +8 -2
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/physics_settings.js +157 -0
- package/dist/scene/physics_settings.js.map +1 -0
- package/dist/scene/scene.js +190 -44
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +147 -6
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
- package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +881 -42
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grass_gpu.js +929 -0
- package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
- package/dist/scene/terrain-cm/grassmaterial.js +180 -9
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +465 -36
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
- package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
- package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
- package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
- package/dist/scene/update_queue.js +54 -0
- package/dist/scene/update_queue.js.map +1 -0
- package/dist/scene/water.js +997 -96
- package/dist/scene/water.js.map +1 -1
- package/dist/scene/water_surface_sampler.js +324 -0
- package/dist/scene/water_surface_sampler.js.map +1 -0
- package/dist/scene/wind.js +317 -0
- package/dist/scene/wind.js.map +1 -0
- package/dist/shaders/atmosphere.js +388 -166
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js +100 -32
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/gi.js +365 -0
- package/dist/shaders/gi.js.map +1 -0
- package/dist/shaders/ltc_rect.js +202 -0
- package/dist/shaders/ltc_rect.js.map +1 -0
- package/dist/shaders/misc.js +1 -10
- package/dist/shaders/misc.js.map +1 -1
- package/dist/shaders/noise.js +5 -1
- package/dist/shaders/noise.js.map +1 -1
- package/dist/shaders/probes.js +309 -0
- package/dist/shaders/probes.js.map +1 -0
- package/dist/shaders/sdf.js +537 -0
- package/dist/shaders/sdf.js.map +1 -0
- package/dist/shaders/shadow.js +104 -70
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/skin_brdf.js +243 -0
- package/dist/shaders/skin_brdf.js.map +1 -0
- package/dist/shaders/ssr.js +6 -159
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shaders/temporal.js +38 -27
- package/dist/shaders/temporal.js.map +1 -1
- package/dist/shaders/water.js +40 -87
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +42 -0
- package/dist/shaders/water_medium.js.map +1 -0
- package/dist/shadow/dom.js +110 -19
- package/dist/shadow/dom.js.map +1 -1
- package/dist/shadow/esm.js +3 -3
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js +15 -48
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +15 -53
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/pcss.js +34 -9
- package/dist/shadow/pcss.js.map +1 -1
- package/dist/shadow/shadow_impl.js +3 -8
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadow_region.js +87 -49
- package/dist/shadow/shadow_region.js.map +1 -1
- package/dist/shadow/shadowmapper.js +93 -53
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js +18 -72
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js +3 -3
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/shapes/shape.js +44 -1
- package/dist/shapes/shape.js.map +1 -1
- package/dist/utility/buoyancy.js +287 -0
- package/dist/utility/buoyancy.js.map +1 -0
- package/dist/utility/physical.js +10 -1
- package/dist/utility/physical.js.map +1 -1
- package/dist/utility/pmrem.js +17 -43
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/sdf/bake.js +435 -0
- package/dist/utility/sdf/bake.js.map +1 -0
- package/dist/utility/sdf/bvh.js +576 -0
- package/dist/utility/sdf/bvh.js.map +1 -0
- package/dist/utility/serialization/manager.js +36 -6
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +77 -7
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +11 -4
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +140 -279
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/cloth.js +25 -0
- package/dist/utility/serialization/scene/cloth.js.map +1 -0
- package/dist/utility/serialization/scene/common.js +14 -6
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/foliage.js +821 -0
- package/dist/utility/serialization/scene/foliage.js.map +1 -0
- package/dist/utility/serialization/scene/hair.js +11 -4
- package/dist/utility/serialization/scene/hair.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +115 -7
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +388 -220
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +69 -4
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +140 -5
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/node_physics.js +1318 -0
- package/dist/utility/serialization/scene/node_physics.js.map +1 -0
- package/dist/utility/serialization/scene/particle.js +11 -4
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/physics.js +120 -0
- package/dist/utility/serialization/scene/physics.js.map +1 -0
- package/dist/utility/serialization/scene/primitive.js +124 -10
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +1687 -51
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +11 -4
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +163 -33
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +11 -4
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +2473 -114
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +97 -109
- package/dist/utility/shprojector.js.map +1 -1
- package/dist/utility/textures/foam.js +170 -0
- package/dist/utility/textures/foam.js.map +1 -0
- package/dist/utility/textures/ggxlut.js +17 -43
- package/dist/utility/textures/ggxlut.js.map +1 -1
- package/dist/utility/textures/ltcdata.js +4 -4
- package/dist/utility/textures/ltcdata.js.map +1 -1
- package/dist/utility/textures/ltclut.js +16 -6
- package/dist/utility/textures/ltclut.js.map +1 -1
- package/dist/utility/unsupported.js +24 -0
- package/dist/utility/unsupported.js.map +1 -0
- package/dist/values.js +13 -1
- package/dist/values.js.map +1 -1
- package/package.json +25 -12
- package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- 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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"}
|