@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, Vector4, Vector3 } from '@zephyr3d/base';
|
|
2
|
+
import { getDevice } from '../../app/api.js';
|
|
3
|
+
import { fetchSampler } from '../../utility/misc.js';
|
|
4
|
+
import { cloudWorleyFbm, cloudPerlinWorley, cloudPerlinFbm, cloudWorleyNoise } from './cloud_noise.js';
|
|
5
|
+
|
|
6
|
+
/** Edge of the base shape volume, [Schneider15]: 128^3 Perlin-Worley + Worley fbm. */ const CLOUD_BASE_NOISE_SIZE = 128;
|
|
7
|
+
/** Edge of the detail volume: 64^3 Worley fbm. */ const CLOUD_DETAIL_NOISE_SIZE = 64;
|
|
8
|
+
/** Edge of the generated weather map. */ const CLOUD_WEATHER_MAP_SIZE = 512;
|
|
9
|
+
/*
|
|
10
|
+
* Lattice frequencies of the generated volumes: base after 3dVXDc (Worley fbm at 4, 8 and 16
|
|
11
|
+
* cells, Perlin-Worley at 4), detail at 2, 4 and 8 cells. Worley needs at least two cells, or
|
|
12
|
+
* every neighbour wraps onto the same feature point.
|
|
13
|
+
*/ const BASE_FREQ = 4;
|
|
14
|
+
const DETAIL_FREQ = 2;
|
|
15
|
+
/*
|
|
16
|
+
* Cloud map after Nubis 2017: R connected coverage (Perlin footprints), G isolated coverage
|
|
17
|
+
* (Worley domes), both modulated by a low frequency air mass noise; B cloud type.
|
|
18
|
+
* Periods below are at the default 64 km weather scale.
|
|
19
|
+
*/ /** Connected footprints of 8 km */ const WEATHER_FOOTPRINT_FREQ = 8;
|
|
20
|
+
/** Isolated cells of 4 km */ const WEATHER_ISOLATED_FREQ = 16;
|
|
21
|
+
/** Air masses of 32 km */ const WEATHER_MODULATION_FREQ = 2;
|
|
22
|
+
const WEATHER_TYPE_FREQ = 2;
|
|
23
|
+
/**
|
|
24
|
+
* 16-quantiles of the raw connected coverage (Perlin footprints x modulation). Mapping a value
|
|
25
|
+
* through this table (its empirical CDF) makes the stored coverage uniform on [0, 1].
|
|
26
|
+
*/ const WEATHER_CONNECTED_QUANTILES = [
|
|
27
|
+
0.0496,
|
|
28
|
+
0.1364,
|
|
29
|
+
0.1608,
|
|
30
|
+
0.1791,
|
|
31
|
+
0.1944,
|
|
32
|
+
0.2076,
|
|
33
|
+
0.2193,
|
|
34
|
+
0.2309,
|
|
35
|
+
0.2431,
|
|
36
|
+
0.255,
|
|
37
|
+
0.2684,
|
|
38
|
+
0.2829,
|
|
39
|
+
0.3,
|
|
40
|
+
0.3216,
|
|
41
|
+
0.3513,
|
|
42
|
+
0.3956,
|
|
43
|
+
0.6949
|
|
44
|
+
];
|
|
45
|
+
/** Piecewise linear empirical CDF: a sum of one ramp per quantile interval. */ function empiricalCDF(scope, v, quantiles) {
|
|
46
|
+
const pb = scope.$builder;
|
|
47
|
+
const n = quantiles.length - 1;
|
|
48
|
+
let sum = 0;
|
|
49
|
+
for(let i = 0; i < n; i++){
|
|
50
|
+
const lo = quantiles[i];
|
|
51
|
+
const hi = quantiles[i + 1];
|
|
52
|
+
sum = pb.add(sum, pb.mul(pb.clamp(pb.div(pb.sub(v, lo), Math.max(hi - lo, 1e-6)), 0, 1), 1 / n));
|
|
53
|
+
}
|
|
54
|
+
return sum;
|
|
55
|
+
}
|
|
56
|
+
let baseProgram = null;
|
|
57
|
+
let detailProgram = null;
|
|
58
|
+
let weatherProgram = null;
|
|
59
|
+
let atlasProgram = null;
|
|
60
|
+
/**
|
|
61
|
+
* Integer seed offset of the hash lattice. Whole cells keep the generated volumes periodic; the
|
|
62
|
+
* primes decorrelate the axes.
|
|
63
|
+
*/ function seedOffset(seed) {
|
|
64
|
+
return new Vector3(seed * 1031, seed * 2053, seed * 4099);
|
|
65
|
+
}
|
|
66
|
+
function getVolumeProgram(kind) {
|
|
67
|
+
const cached = kind === 'base' ? baseProgram : detailProgram;
|
|
68
|
+
if (cached) {
|
|
69
|
+
return cached;
|
|
70
|
+
}
|
|
71
|
+
const program = getDevice().buildComputeProgram({
|
|
72
|
+
label: kind === 'base' ? 'CloudBaseNoise' : 'CloudDetailNoise',
|
|
73
|
+
workgroupSize: [
|
|
74
|
+
4,
|
|
75
|
+
4,
|
|
76
|
+
4
|
|
77
|
+
],
|
|
78
|
+
compute (pb) {
|
|
79
|
+
this.dst = pb.texStorage3D.rgba8unorm().storage(0);
|
|
80
|
+
// (size, freq, 0, 0)
|
|
81
|
+
this.params = pb.vec4().uniform(0);
|
|
82
|
+
this.seed = pb.vec3().uniform(0);
|
|
83
|
+
pb.main(function() {
|
|
84
|
+
this.$l.size = pb.uint(this.params.x);
|
|
85
|
+
this.$if(pb.all(pb.lessThan(this.$builtins.globalInvocationId, pb.uvec3(this.size))), function() {
|
|
86
|
+
this.$l.p = pb.div(pb.add(pb.vec3(this.$builtins.globalInvocationId), pb.vec3(0.5)), this.params.x);
|
|
87
|
+
this.$l.freq = this.params.y;
|
|
88
|
+
this.$l.w0 = cloudWorleyFbm(this, this.p, this.freq, this.seed);
|
|
89
|
+
this.$l.w1 = cloudWorleyFbm(this, this.p, pb.mul(this.freq, 2), this.seed);
|
|
90
|
+
this.$l.w2 = cloudWorleyFbm(this, this.p, pb.mul(this.freq, 4), this.seed);
|
|
91
|
+
if (kind === 'base') {
|
|
92
|
+
// R: Perlin-Worley (4 octaves, 4..32 cells), GBA: Worley fbm of increasing frequency
|
|
93
|
+
this.$l.r = cloudPerlinWorley(this, this.p, this.freq, this.w0, this.seed, 4);
|
|
94
|
+
this.$l.value = pb.vec4(this.r, this.w0, this.w1, this.w2);
|
|
95
|
+
} else {
|
|
96
|
+
// RGB: Worley fbm of increasing frequency
|
|
97
|
+
this.$l.value = pb.vec4(this.w0, this.w1, this.w2, 1);
|
|
98
|
+
}
|
|
99
|
+
pb.textureStore(this.dst, this.$builtins.globalInvocationId, pb.clamp(this.value, pb.vec4(0), pb.vec4(1)));
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
if (kind === 'base') {
|
|
105
|
+
baseProgram = program;
|
|
106
|
+
} else {
|
|
107
|
+
detailProgram = program;
|
|
108
|
+
}
|
|
109
|
+
return program;
|
|
110
|
+
}
|
|
111
|
+
function getWeatherProgram() {
|
|
112
|
+
if (!weatherProgram) {
|
|
113
|
+
weatherProgram = getDevice().buildComputeProgram({
|
|
114
|
+
label: 'CloudWeatherMap',
|
|
115
|
+
workgroupSize: [
|
|
116
|
+
8,
|
|
117
|
+
8,
|
|
118
|
+
1
|
|
119
|
+
],
|
|
120
|
+
compute (pb) {
|
|
121
|
+
this.dst = pb.texStorage2D.rgba8unorm().storage(0);
|
|
122
|
+
// (size, footprint freq, type freq, modulation freq)
|
|
123
|
+
this.params = pb.vec4().uniform(0);
|
|
124
|
+
this.seed = pb.vec3().uniform(0);
|
|
125
|
+
pb.main(function() {
|
|
126
|
+
this.$l.size = pb.uint(this.params.x);
|
|
127
|
+
this.$if(pb.all(pb.lessThan(this.$builtins.globalInvocationId.xy, pb.uvec2(this.size))), function() {
|
|
128
|
+
// A z = 0 slice of the periodic volume noise tiles in x and y
|
|
129
|
+
this.$l.p = pb.vec3(pb.div(pb.add(pb.vec2(this.$builtins.globalInvocationId.xy), pb.vec2(0.5)), this.params.x), 0);
|
|
130
|
+
this.$l.modulation = pb.clamp(pb.add(pb.mul(cloudPerlinFbm(this, this.p, this.params.w, 4, this.seed), 0.5), 0.5), 0, 1);
|
|
131
|
+
this.$l.connectedRaw = pb.mul(pb.clamp(pb.add(pb.mul(cloudPerlinFbm(this, this.p, this.params.y, 4, this.seed), 0.5), 0.5), 0, 1), this.modulation);
|
|
132
|
+
// One dome per Worley cell: saturate(1 - d^2 / 0.7) x modulation
|
|
133
|
+
this.$l.isolated = pb.mul(pb.clamp(pb.add(pb.mul(pb.sub(cloudWorleyNoise(this, pb.mul(this.p, WEATHER_ISOLATED_FREQ), pb.float(WEATHER_ISOLATED_FREQ), this.seed), 1), 1 / 0.7), 1), 0, 1), pb.smoothStep(0.15, 0.65, this.modulation));
|
|
134
|
+
this.$l.connected = empiricalCDF(this, this.connectedRaw, WEATHER_CONNECTED_QUANTILES);
|
|
135
|
+
// fbm + 0.5 spans 0 (stratus) to 1 (cumulus)
|
|
136
|
+
this.$l.cloudType = pb.add(cloudPerlinFbm(this, this.p, this.params.z, 4, this.seed), 0.5);
|
|
137
|
+
pb.textureStore(this.dst, this.$builtins.globalInvocationId.xy, pb.clamp(pb.vec4(this.connected, this.isolated, this.cloudType, 1), pb.vec4(0), pb.vec4(1)));
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return weatherProgram;
|
|
144
|
+
}
|
|
145
|
+
function getAtlasProgram() {
|
|
146
|
+
if (!atlasProgram) {
|
|
147
|
+
atlasProgram = getDevice().buildComputeProgram({
|
|
148
|
+
label: 'CloudVolumeFromAtlas',
|
|
149
|
+
workgroupSize: [
|
|
150
|
+
4,
|
|
151
|
+
4,
|
|
152
|
+
4
|
|
153
|
+
],
|
|
154
|
+
compute (pb) {
|
|
155
|
+
this.src = pb.tex2D().sampleType('unfilterable-float').uniform(0);
|
|
156
|
+
this.dst = pb.texStorage3D.rgba8unorm().storage(0);
|
|
157
|
+
// (slice edge, slices per atlas row, 0, 0)
|
|
158
|
+
this.params = pb.vec4().uniform(0);
|
|
159
|
+
pb.main(function() {
|
|
160
|
+
this.$l.edge = pb.uint(this.params.x);
|
|
161
|
+
this.$l.cols = pb.uint(this.params.y);
|
|
162
|
+
this.$l.id = this.$builtins.globalInvocationId;
|
|
163
|
+
this.$if(pb.all(pb.lessThan(this.id, pb.uvec3(this.edge))), function() {
|
|
164
|
+
// Slice z sits in atlas column z % cols, row z / cols, rows running down
|
|
165
|
+
this.$l.texel = pb.add(pb.mul(pb.uvec2(pb.mod(this.id.z, this.cols), pb.div(this.id.z, this.cols)), this.edge), this.id.xy);
|
|
166
|
+
pb.textureStore(this.dst, this.id, pb.textureLoad(this.src, pb.ivec2(this.texel), 0));
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
return atlasProgram;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Slice layout of a 2D atlas holding a cubic volume: N slices of N x N texels in a grid of
|
|
176
|
+
* `cols` x `rows` slices, so that N^3 = width * height. Null when the size is no such layout.
|
|
177
|
+
* @internal
|
|
178
|
+
*/ function getVolumeAtlasLayout(width, height) {
|
|
179
|
+
const edge = Math.round(Math.cbrt(width * height));
|
|
180
|
+
if (edge < 1 || width % edge !== 0 || height % edge !== 0) {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
const cols = width / edge;
|
|
184
|
+
const rows = height / edge;
|
|
185
|
+
return cols * rows === edge ? {
|
|
186
|
+
edge,
|
|
187
|
+
cols,
|
|
188
|
+
rows
|
|
189
|
+
} : null;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Noise volumes and weather map of the volumetric clouds.
|
|
193
|
+
*
|
|
194
|
+
* Each is generated on the GPU when no texture was assigned, or converted from the assigned
|
|
195
|
+
* texture: the noise volumes are imported as 2D atlases of their slices (see
|
|
196
|
+
* {@link getVolumeAtlasLayout}), the weather map is used as is. Generation runs once per seed;
|
|
197
|
+
* every volume gets a full mip chain.
|
|
198
|
+
*
|
|
199
|
+
* @internal
|
|
200
|
+
*/ class VolumetricCloudResources extends Disposable {
|
|
201
|
+
_baseNoise;
|
|
202
|
+
_detailNoise;
|
|
203
|
+
_weatherMap;
|
|
204
|
+
_baseNoiseSource;
|
|
205
|
+
_detailNoiseSource;
|
|
206
|
+
_weatherMapSource;
|
|
207
|
+
/** Seed and source the current textures were made from; -1 when not made yet. */ _baseSeed;
|
|
208
|
+
_detailSeed;
|
|
209
|
+
_weatherSeed;
|
|
210
|
+
_baseFrom;
|
|
211
|
+
_detailFrom;
|
|
212
|
+
/** One bind group per program, so dispatches recorded in one frame never share one. */ _bindGroups;
|
|
213
|
+
constructor(){
|
|
214
|
+
super();
|
|
215
|
+
this._baseNoise = new DRef();
|
|
216
|
+
this._detailNoise = new DRef();
|
|
217
|
+
this._weatherMap = new DRef();
|
|
218
|
+
this._baseNoiseSource = new DRef();
|
|
219
|
+
this._detailNoiseSource = new DRef();
|
|
220
|
+
this._weatherMapSource = new DRef();
|
|
221
|
+
this._baseSeed = -1;
|
|
222
|
+
this._detailSeed = -1;
|
|
223
|
+
this._weatherSeed = -1;
|
|
224
|
+
this._baseFrom = null;
|
|
225
|
+
this._detailFrom = null;
|
|
226
|
+
this._bindGroups = new Map();
|
|
227
|
+
}
|
|
228
|
+
/** Imported base shape volume as a slice atlas, or null to generate it. */ get baseNoiseSource() {
|
|
229
|
+
return this._baseNoiseSource.get();
|
|
230
|
+
}
|
|
231
|
+
set baseNoiseSource(tex) {
|
|
232
|
+
this._baseNoiseSource.set(tex);
|
|
233
|
+
}
|
|
234
|
+
/** Imported detail volume as a slice atlas, or null to generate it. */ get detailNoiseSource() {
|
|
235
|
+
return this._detailNoiseSource.get();
|
|
236
|
+
}
|
|
237
|
+
set detailNoiseSource(tex) {
|
|
238
|
+
this._detailNoiseSource.set(tex);
|
|
239
|
+
}
|
|
240
|
+
/** Imported weather map, or null to generate it. */ get weatherMapSource() {
|
|
241
|
+
return this._weatherMapSource.get();
|
|
242
|
+
}
|
|
243
|
+
set weatherMapSource(tex) {
|
|
244
|
+
this._weatherMapSource.set(tex);
|
|
245
|
+
}
|
|
246
|
+
/** Base shape volume, valid after {@link VolumetricCloudResources.update}. */ get baseNoise() {
|
|
247
|
+
return this._baseNoise.get();
|
|
248
|
+
}
|
|
249
|
+
/** Detail volume, valid after {@link VolumetricCloudResources.update}. */ get detailNoise() {
|
|
250
|
+
return this._detailNoise.get();
|
|
251
|
+
}
|
|
252
|
+
/** Weather map, valid after {@link VolumetricCloudResources.update}. */ get weatherMap() {
|
|
253
|
+
return this._weatherMapSource.get() ?? this._weatherMap.get();
|
|
254
|
+
}
|
|
255
|
+
/** Makes or remakes whatever is missing or out of date. */ update(seed) {
|
|
256
|
+
this._updateVolume('base', seed);
|
|
257
|
+
this._updateVolume('detail', seed);
|
|
258
|
+
if (!this._weatherMapSource.get() && (this._weatherSeed !== seed || !this._weatherMap.get())) {
|
|
259
|
+
this._generateWeatherMap(seed);
|
|
260
|
+
this._weatherSeed = seed;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
onDispose() {
|
|
264
|
+
super.onDispose();
|
|
265
|
+
this._baseNoise.dispose();
|
|
266
|
+
this._detailNoise.dispose();
|
|
267
|
+
this._weatherMap.dispose();
|
|
268
|
+
this._baseNoiseSource.dispose();
|
|
269
|
+
this._detailNoiseSource.dispose();
|
|
270
|
+
this._weatherMapSource.dispose();
|
|
271
|
+
for (const bindGroup of this._bindGroups.values()){
|
|
272
|
+
bindGroup.dispose();
|
|
273
|
+
}
|
|
274
|
+
this._bindGroups.clear();
|
|
275
|
+
}
|
|
276
|
+
_updateVolume(kind, seed) {
|
|
277
|
+
const target = kind === 'base' ? this._baseNoise : this._detailNoise;
|
|
278
|
+
const source = (kind === 'base' ? this._baseNoiseSource : this._detailNoiseSource).get();
|
|
279
|
+
const from = kind === 'base' ? this._baseFrom : this._detailFrom;
|
|
280
|
+
const madeSeed = kind === 'base' ? this._baseSeed : this._detailSeed;
|
|
281
|
+
let layout = source ? getVolumeAtlasLayout(source.width, source.height) : null;
|
|
282
|
+
if (source && !layout) {
|
|
283
|
+
console.error(`Volumetric cloud ${kind} noise: ${source.width}x${source.height} is not an atlas of N slices of NxN texels, using generated noise`);
|
|
284
|
+
layout = null;
|
|
285
|
+
}
|
|
286
|
+
if (layout && source) {
|
|
287
|
+
if (from !== source || !target.get()) {
|
|
288
|
+
this._fromAtlas(target, source, layout.edge, layout.cols, kind === 'base' ? 'CloudBaseNoise(Imported)' : 'CloudDetailNoise(Imported)');
|
|
289
|
+
this._setMade(kind, -1, source);
|
|
290
|
+
}
|
|
291
|
+
} else if (from || madeSeed !== seed || !target.get()) {
|
|
292
|
+
this._generateVolume(kind, target, seed);
|
|
293
|
+
this._setMade(kind, seed, null);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
_setMade(kind, seed, from) {
|
|
297
|
+
if (kind === 'base') {
|
|
298
|
+
this._baseSeed = seed;
|
|
299
|
+
this._baseFrom = from;
|
|
300
|
+
} else {
|
|
301
|
+
this._detailSeed = seed;
|
|
302
|
+
this._detailFrom = from;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
_ensureVolume(target, edge, name) {
|
|
306
|
+
let tex = target.get();
|
|
307
|
+
if (!tex || tex.width !== edge) {
|
|
308
|
+
tex = getDevice().createTexture3D('rgba8unorm', edge, edge, edge, {
|
|
309
|
+
writable: true,
|
|
310
|
+
samplerOptions: {
|
|
311
|
+
addressU: 'repeat',
|
|
312
|
+
addressV: 'repeat',
|
|
313
|
+
addressW: 'repeat',
|
|
314
|
+
magFilter: 'linear',
|
|
315
|
+
minFilter: 'linear',
|
|
316
|
+
mipFilter: 'linear'
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
target.set(tex);
|
|
320
|
+
}
|
|
321
|
+
tex.name = name;
|
|
322
|
+
return tex;
|
|
323
|
+
}
|
|
324
|
+
_dispatch(program, setup, x, y, z) {
|
|
325
|
+
const device = getDevice();
|
|
326
|
+
let bindGroup = this._bindGroups.get(program);
|
|
327
|
+
if (!bindGroup) {
|
|
328
|
+
bindGroup = device.createBindGroup(program.bindGroupLayouts[0]);
|
|
329
|
+
this._bindGroups.set(program, bindGroup);
|
|
330
|
+
}
|
|
331
|
+
setup(bindGroup);
|
|
332
|
+
device.setProgram(program);
|
|
333
|
+
device.setBindGroup(0, bindGroup);
|
|
334
|
+
device.compute(x, y, z);
|
|
335
|
+
}
|
|
336
|
+
_generateVolume(kind, target, seed) {
|
|
337
|
+
const edge = kind === 'base' ? CLOUD_BASE_NOISE_SIZE : CLOUD_DETAIL_NOISE_SIZE;
|
|
338
|
+
const tex = this._ensureVolume(target, edge, kind === 'base' ? 'CloudBaseNoise' : 'CloudDetailNoise');
|
|
339
|
+
const groups = Math.ceil(edge / 4);
|
|
340
|
+
this._dispatch(getVolumeProgram(kind), (bindGroup)=>{
|
|
341
|
+
bindGroup.setTextureView('dst', tex, 0, 0, 1);
|
|
342
|
+
bindGroup.setValue('params', new Vector4(edge, kind === 'base' ? BASE_FREQ : DETAIL_FREQ, 0, 0));
|
|
343
|
+
bindGroup.setValue('seed', seedOffset(seed));
|
|
344
|
+
}, groups, groups, groups);
|
|
345
|
+
tex.generateMipmaps();
|
|
346
|
+
}
|
|
347
|
+
_fromAtlas(target, source, edge, cols, name) {
|
|
348
|
+
const tex = this._ensureVolume(target, edge, name);
|
|
349
|
+
const groups = Math.ceil(edge / 4);
|
|
350
|
+
this._dispatch(getAtlasProgram(), (bindGroup)=>{
|
|
351
|
+
bindGroup.setTexture('src', source, fetchSampler('clamp_nearest_nomip'));
|
|
352
|
+
bindGroup.setTextureView('dst', tex, 0, 0, 1);
|
|
353
|
+
bindGroup.setValue('params', new Vector4(edge, cols, 0, 0));
|
|
354
|
+
}, groups, groups, groups);
|
|
355
|
+
tex.generateMipmaps();
|
|
356
|
+
}
|
|
357
|
+
_generateWeatherMap(seed) {
|
|
358
|
+
let tex = this._weatherMap.get();
|
|
359
|
+
if (!tex) {
|
|
360
|
+
tex = getDevice().createTexture2D('rgba8unorm', CLOUD_WEATHER_MAP_SIZE, CLOUD_WEATHER_MAP_SIZE, {
|
|
361
|
+
samplerOptions: {
|
|
362
|
+
addressU: 'repeat',
|
|
363
|
+
addressV: 'repeat'
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
this._weatherMap.set(tex);
|
|
367
|
+
}
|
|
368
|
+
tex.name = 'CloudWeatherMap';
|
|
369
|
+
const groups = Math.ceil(CLOUD_WEATHER_MAP_SIZE / 8);
|
|
370
|
+
this._dispatch(getWeatherProgram(), (bindGroup)=>{
|
|
371
|
+
bindGroup.setTextureView('dst', tex, 0, 0, 1);
|
|
372
|
+
bindGroup.setValue('params', new Vector4(CLOUD_WEATHER_MAP_SIZE, WEATHER_FOOTPRINT_FREQ, WEATHER_TYPE_FREQ, WEATHER_MODULATION_FREQ));
|
|
373
|
+
bindGroup.setValue('seed', seedOffset(seed));
|
|
374
|
+
}, groups, groups, 1);
|
|
375
|
+
tex.generateMipmaps();
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
export { CLOUD_BASE_NOISE_SIZE, CLOUD_DETAIL_NOISE_SIZE, CLOUD_WEATHER_MAP_SIZE, VolumetricCloudResources, getVolumeAtlasLayout };
|
|
380
|
+
//# sourceMappingURL=resources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.js","sources":["../../../src/render/volumetric_cloud/resources.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { Disposable, DRef, Vector3, Vector4 } from '@zephyr3d/base';\r\nimport type {\r\n BindGroup,\r\n GPUProgram,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n Texture2D,\r\n Texture3D\r\n} from '@zephyr3d/device';\r\nimport { getDevice } from '../../app/api';\r\nimport { fetchSampler } from '../../utility/misc';\r\nimport { cloudPerlinFbm, cloudPerlinWorley, cloudWorleyFbm, cloudWorleyNoise } from './cloud_noise';\r\n\r\n/** Edge of the base shape volume, [Schneider15]: 128^3 Perlin-Worley + Worley fbm. */\r\nexport const CLOUD_BASE_NOISE_SIZE = 128;\r\n/** Edge of the detail volume: 64^3 Worley fbm. */\r\nexport const CLOUD_DETAIL_NOISE_SIZE = 64;\r\n/** Edge of the generated weather map. */\r\nexport const CLOUD_WEATHER_MAP_SIZE = 512;\r\n\r\n/*\r\n * Lattice frequencies of the generated volumes: base after 3dVXDc (Worley fbm at 4, 8 and 16\r\n * cells, Perlin-Worley at 4), detail at 2, 4 and 8 cells. Worley needs at least two cells, or\r\n * every neighbour wraps onto the same feature point.\r\n */\r\nconst BASE_FREQ = 4;\r\nconst DETAIL_FREQ = 2;\r\n/*\r\n * Cloud map after Nubis 2017: R connected coverage (Perlin footprints), G isolated coverage\r\n * (Worley domes), both modulated by a low frequency air mass noise; B cloud type.\r\n * Periods below are at the default 64 km weather scale.\r\n */\r\n/** Connected footprints of 8 km */\r\nconst WEATHER_FOOTPRINT_FREQ = 8;\r\n/** Isolated cells of 4 km */\r\nconst WEATHER_ISOLATED_FREQ = 16;\r\n/** Air masses of 32 km */\r\nconst WEATHER_MODULATION_FREQ = 2;\r\nconst WEATHER_TYPE_FREQ = 2;\r\n/**\r\n * 16-quantiles of the raw connected coverage (Perlin footprints x modulation). Mapping a value\r\n * through this table (its empirical CDF) makes the stored coverage uniform on [0, 1].\r\n */\r\nconst WEATHER_CONNECTED_QUANTILES = [\r\n 0.0496, 0.1364, 0.1608, 0.1791, 0.1944, 0.2076, 0.2193, 0.2309, 0.2431, 0.255, 0.2684, 0.2829, 0.3, 0.3216,\r\n 0.3513, 0.3956, 0.6949\r\n];\r\n\r\n/** Piecewise linear empirical CDF: a sum of one ramp per quantile interval. */\r\nfunction empiricalCDF(scope: PBInsideFunctionScope, v: PBShaderExp, quantiles: number[]) {\r\n const pb = scope.$builder;\r\n const n = quantiles.length - 1;\r\n let sum: PBShaderExp | number = 0;\r\n for (let i = 0; i < n; i++) {\r\n const lo = quantiles[i];\r\n const hi = quantiles[i + 1];\r\n sum = pb.add(sum, pb.mul(pb.clamp(pb.div(pb.sub(v, lo), Math.max(hi - lo, 1e-6)), 0, 1), 1 / n));\r\n }\r\n return sum as PBShaderExp;\r\n}\r\n\r\ntype VolumeKind = 'base' | 'detail';\r\n\r\nlet baseProgram: Nullable<GPUProgram> = null;\r\nlet detailProgram: Nullable<GPUProgram> = null;\r\nlet weatherProgram: Nullable<GPUProgram> = null;\r\nlet atlasProgram: Nullable<GPUProgram> = null;\r\n\r\n/**\r\n * Integer seed offset of the hash lattice. Whole cells keep the generated volumes periodic; the\r\n * primes decorrelate the axes.\r\n */\r\nfunction seedOffset(seed: number) {\r\n return new Vector3(seed * 1031, seed * 2053, seed * 4099);\r\n}\r\n\r\nfunction getVolumeProgram(kind: VolumeKind) {\r\n const cached = kind === 'base' ? baseProgram : detailProgram;\r\n if (cached) {\r\n return cached;\r\n }\r\n const program = getDevice().buildComputeProgram({\r\n label: kind === 'base' ? 'CloudBaseNoise' : 'CloudDetailNoise',\r\n workgroupSize: [4, 4, 4],\r\n compute(pb) {\r\n this.dst = pb.texStorage3D.rgba8unorm().storage(0);\r\n // (size, freq, 0, 0)\r\n this.params = pb.vec4().uniform(0);\r\n this.seed = pb.vec3().uniform(0);\r\n pb.main(function () {\r\n this.$l.size = pb.uint(this.params.x);\r\n this.$if(pb.all(pb.lessThan(this.$builtins.globalInvocationId, pb.uvec3(this.size))), function () {\r\n this.$l.p = pb.div(pb.add(pb.vec3(this.$builtins.globalInvocationId), pb.vec3(0.5)), this.params.x);\r\n this.$l.freq = this.params.y;\r\n this.$l.w0 = cloudWorleyFbm(this, this.p, this.freq, this.seed);\r\n this.$l.w1 = cloudWorleyFbm(this, this.p, pb.mul(this.freq, 2), this.seed);\r\n this.$l.w2 = cloudWorleyFbm(this, this.p, pb.mul(this.freq, 4), this.seed);\r\n if (kind === 'base') {\r\n // R: Perlin-Worley (4 octaves, 4..32 cells), GBA: Worley fbm of increasing frequency\r\n this.$l.r = cloudPerlinWorley(this, this.p, this.freq, this.w0, this.seed, 4);\r\n this.$l.value = pb.vec4(this.r, this.w0, this.w1, this.w2);\r\n } else {\r\n // RGB: Worley fbm of increasing frequency\r\n this.$l.value = pb.vec4(this.w0, this.w1, this.w2, 1);\r\n }\r\n pb.textureStore(\r\n this.dst,\r\n this.$builtins.globalInvocationId,\r\n pb.clamp(this.value, pb.vec4(0), pb.vec4(1))\r\n );\r\n });\r\n });\r\n }\r\n })!;\r\n if (kind === 'base') {\r\n baseProgram = program;\r\n } else {\r\n detailProgram = program;\r\n }\r\n return program;\r\n}\r\n\r\nfunction getWeatherProgram() {\r\n if (!weatherProgram) {\r\n weatherProgram = getDevice().buildComputeProgram({\r\n label: 'CloudWeatherMap',\r\n workgroupSize: [8, 8, 1],\r\n compute(pb) {\r\n this.dst = pb.texStorage2D.rgba8unorm().storage(0);\r\n // (size, footprint freq, type freq, modulation freq)\r\n this.params = pb.vec4().uniform(0);\r\n this.seed = pb.vec3().uniform(0);\r\n pb.main(function () {\r\n this.$l.size = pb.uint(this.params.x);\r\n this.$if(\r\n pb.all(pb.lessThan(this.$builtins.globalInvocationId.xy, pb.uvec2(this.size))),\r\n function () {\r\n // A z = 0 slice of the periodic volume noise tiles in x and y\r\n this.$l.p = pb.vec3(\r\n pb.div(pb.add(pb.vec2(this.$builtins.globalInvocationId.xy), pb.vec2(0.5)), this.params.x),\r\n 0\r\n );\r\n this.$l.modulation = pb.clamp(\r\n pb.add(pb.mul(cloudPerlinFbm(this, this.p, this.params.w, 4, this.seed), 0.5), 0.5),\r\n 0,\r\n 1\r\n );\r\n this.$l.connectedRaw = pb.mul(\r\n pb.clamp(\r\n pb.add(pb.mul(cloudPerlinFbm(this, this.p, this.params.y, 4, this.seed), 0.5), 0.5),\r\n 0,\r\n 1\r\n ),\r\n this.modulation\r\n );\r\n // One dome per Worley cell: saturate(1 - d^2 / 0.7) x modulation\r\n this.$l.isolated = pb.mul(\r\n pb.clamp(\r\n pb.add(\r\n pb.mul(\r\n pb.sub(\r\n cloudWorleyNoise(\r\n this,\r\n pb.mul(this.p, WEATHER_ISOLATED_FREQ),\r\n pb.float(WEATHER_ISOLATED_FREQ),\r\n this.seed\r\n ),\r\n 1\r\n ),\r\n 1 / 0.7\r\n ),\r\n 1\r\n ),\r\n 0,\r\n 1\r\n ),\r\n pb.smoothStep(0.15, 0.65, this.modulation)\r\n );\r\n this.$l.connected = empiricalCDF(this, this.connectedRaw, WEATHER_CONNECTED_QUANTILES);\r\n // fbm + 0.5 spans 0 (stratus) to 1 (cumulus)\r\n this.$l.cloudType = pb.add(cloudPerlinFbm(this, this.p, this.params.z, 4, this.seed), 0.5);\r\n pb.textureStore(\r\n this.dst,\r\n this.$builtins.globalInvocationId.xy,\r\n pb.clamp(pb.vec4(this.connected, this.isolated, this.cloudType, 1), pb.vec4(0), pb.vec4(1))\r\n );\r\n }\r\n );\r\n });\r\n }\r\n })!;\r\n }\r\n return weatherProgram;\r\n}\r\n\r\nfunction getAtlasProgram() {\r\n if (!atlasProgram) {\r\n atlasProgram = getDevice().buildComputeProgram({\r\n label: 'CloudVolumeFromAtlas',\r\n workgroupSize: [4, 4, 4],\r\n compute(pb) {\r\n this.src = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.dst = pb.texStorage3D.rgba8unorm().storage(0);\r\n // (slice edge, slices per atlas row, 0, 0)\r\n this.params = pb.vec4().uniform(0);\r\n pb.main(function () {\r\n this.$l.edge = pb.uint(this.params.x);\r\n this.$l.cols = pb.uint(this.params.y);\r\n this.$l.id = this.$builtins.globalInvocationId;\r\n this.$if(pb.all(pb.lessThan(this.id, pb.uvec3(this.edge))), function () {\r\n // Slice z sits in atlas column z % cols, row z / cols, rows running down\r\n this.$l.texel = pb.add(\r\n pb.mul(pb.uvec2(pb.mod(this.id.z, this.cols), pb.div(this.id.z, this.cols)), this.edge),\r\n this.id.xy\r\n );\r\n pb.textureStore(this.dst, this.id, pb.textureLoad(this.src, pb.ivec2(this.texel), 0));\r\n });\r\n });\r\n }\r\n })!;\r\n }\r\n return atlasProgram;\r\n}\r\n\r\n/**\r\n * Slice layout of a 2D atlas holding a cubic volume: N slices of N x N texels in a grid of\r\n * `cols` x `rows` slices, so that N^3 = width * height. Null when the size is no such layout.\r\n * @internal\r\n */\r\nexport function getVolumeAtlasLayout(width: number, height: number) {\r\n const edge = Math.round(Math.cbrt(width * height));\r\n if (edge < 1 || width % edge !== 0 || height % edge !== 0) {\r\n return null;\r\n }\r\n const cols = width / edge;\r\n const rows = height / edge;\r\n return cols * rows === edge ? { edge, cols, rows } : null;\r\n}\r\n\r\n/**\r\n * Noise volumes and weather map of the volumetric clouds.\r\n *\r\n * Each is generated on the GPU when no texture was assigned, or converted from the assigned\r\n * texture: the noise volumes are imported as 2D atlases of their slices (see\r\n * {@link getVolumeAtlasLayout}), the weather map is used as is. Generation runs once per seed;\r\n * every volume gets a full mip chain.\r\n *\r\n * @internal\r\n */\r\nexport class VolumetricCloudResources extends Disposable {\r\n private readonly _baseNoise: DRef<Texture3D>;\r\n private readonly _detailNoise: DRef<Texture3D>;\r\n private readonly _weatherMap: DRef<Texture2D>;\r\n private readonly _baseNoiseSource: DRef<Texture2D>;\r\n private readonly _detailNoiseSource: DRef<Texture2D>;\r\n private readonly _weatherMapSource: DRef<Texture2D>;\r\n /** Seed and source the current textures were made from; -1 when not made yet. */\r\n private _baseSeed: number;\r\n private _detailSeed: number;\r\n private _weatherSeed: number;\r\n private _baseFrom: Nullable<Texture2D>;\r\n private _detailFrom: Nullable<Texture2D>;\r\n /** One bind group per program, so dispatches recorded in one frame never share one. */\r\n private readonly _bindGroups: Map<GPUProgram, BindGroup>;\r\n constructor() {\r\n super();\r\n this._baseNoise = new DRef();\r\n this._detailNoise = new DRef();\r\n this._weatherMap = new DRef();\r\n this._baseNoiseSource = new DRef();\r\n this._detailNoiseSource = new DRef();\r\n this._weatherMapSource = new DRef();\r\n this._baseSeed = -1;\r\n this._detailSeed = -1;\r\n this._weatherSeed = -1;\r\n this._baseFrom = null;\r\n this._detailFrom = null;\r\n this._bindGroups = new Map();\r\n }\r\n /** Imported base shape volume as a slice atlas, or null to generate it. */\r\n get baseNoiseSource() {\r\n return this._baseNoiseSource.get();\r\n }\r\n set baseNoiseSource(tex: Nullable<Texture2D>) {\r\n this._baseNoiseSource.set(tex);\r\n }\r\n /** Imported detail volume as a slice atlas, or null to generate it. */\r\n get detailNoiseSource() {\r\n return this._detailNoiseSource.get();\r\n }\r\n set detailNoiseSource(tex: Nullable<Texture2D>) {\r\n this._detailNoiseSource.set(tex);\r\n }\r\n /** Imported weather map, or null to generate it. */\r\n get weatherMapSource() {\r\n return this._weatherMapSource.get();\r\n }\r\n set weatherMapSource(tex: Nullable<Texture2D>) {\r\n this._weatherMapSource.set(tex);\r\n }\r\n /** Base shape volume, valid after {@link VolumetricCloudResources.update}. */\r\n get baseNoise() {\r\n return this._baseNoise.get();\r\n }\r\n /** Detail volume, valid after {@link VolumetricCloudResources.update}. */\r\n get detailNoise() {\r\n return this._detailNoise.get();\r\n }\r\n /** Weather map, valid after {@link VolumetricCloudResources.update}. */\r\n get weatherMap() {\r\n return this._weatherMapSource.get() ?? this._weatherMap.get();\r\n }\r\n /** Makes or remakes whatever is missing or out of date. */\r\n update(seed: number) {\r\n this._updateVolume('base', seed);\r\n this._updateVolume('detail', seed);\r\n if (!this._weatherMapSource.get() && (this._weatherSeed !== seed || !this._weatherMap.get())) {\r\n this._generateWeatherMap(seed);\r\n this._weatherSeed = seed;\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._baseNoise.dispose();\r\n this._detailNoise.dispose();\r\n this._weatherMap.dispose();\r\n this._baseNoiseSource.dispose();\r\n this._detailNoiseSource.dispose();\r\n this._weatherMapSource.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 _updateVolume(kind: VolumeKind, seed: number) {\r\n const target = kind === 'base' ? this._baseNoise : this._detailNoise;\r\n const source = (kind === 'base' ? this._baseNoiseSource : this._detailNoiseSource).get();\r\n const from = kind === 'base' ? this._baseFrom : this._detailFrom;\r\n const madeSeed = kind === 'base' ? this._baseSeed : this._detailSeed;\r\n let layout = source ? getVolumeAtlasLayout(source.width, source.height) : null;\r\n if (source && !layout) {\r\n console.error(\r\n `Volumetric cloud ${kind} noise: ${source.width}x${source.height} is not an atlas of N slices of NxN texels, using generated noise`\r\n );\r\n layout = null;\r\n }\r\n if (layout && source) {\r\n if (from !== source || !target.get()) {\r\n this._fromAtlas(\r\n target,\r\n source,\r\n layout.edge,\r\n layout.cols,\r\n kind === 'base' ? 'CloudBaseNoise(Imported)' : 'CloudDetailNoise(Imported)'\r\n );\r\n this._setMade(kind, -1, source);\r\n }\r\n } else if (from || madeSeed !== seed || !target.get()) {\r\n this._generateVolume(kind, target, seed);\r\n this._setMade(kind, seed, null);\r\n }\r\n }\r\n private _setMade(kind: VolumeKind, seed: number, from: Nullable<Texture2D>) {\r\n if (kind === 'base') {\r\n this._baseSeed = seed;\r\n this._baseFrom = from;\r\n } else {\r\n this._detailSeed = seed;\r\n this._detailFrom = from;\r\n }\r\n }\r\n private _ensureVolume(target: DRef<Texture3D>, edge: number, name: string) {\r\n let tex = target.get();\r\n if (!tex || tex.width !== edge) {\r\n tex = getDevice().createTexture3D('rgba8unorm', edge, edge, edge, {\r\n writable: true,\r\n samplerOptions: {\r\n addressU: 'repeat',\r\n addressV: 'repeat',\r\n addressW: 'repeat',\r\n magFilter: 'linear',\r\n minFilter: 'linear',\r\n mipFilter: 'linear'\r\n }\r\n })!;\r\n target.set(tex);\r\n }\r\n tex.name = name;\r\n return tex;\r\n }\r\n private _dispatch(\r\n program: GPUProgram,\r\n setup: (bindGroup: BindGroup) => void,\r\n x: number,\r\n y: number,\r\n z: number\r\n ) {\r\n const device = getDevice();\r\n let bindGroup = this._bindGroups.get(program);\r\n if (!bindGroup) {\r\n bindGroup = device.createBindGroup(program.bindGroupLayouts[0]);\r\n this._bindGroups.set(program, bindGroup);\r\n }\r\n setup(bindGroup);\r\n device.setProgram(program);\r\n device.setBindGroup(0, bindGroup);\r\n device.compute(x, y, z);\r\n }\r\n private _generateVolume(kind: VolumeKind, target: DRef<Texture3D>, seed: number) {\r\n const edge = kind === 'base' ? CLOUD_BASE_NOISE_SIZE : CLOUD_DETAIL_NOISE_SIZE;\r\n const tex = this._ensureVolume(target, edge, kind === 'base' ? 'CloudBaseNoise' : 'CloudDetailNoise');\r\n const groups = Math.ceil(edge / 4);\r\n this._dispatch(\r\n getVolumeProgram(kind),\r\n (bindGroup) => {\r\n bindGroup.setTextureView('dst', tex, 0, 0, 1);\r\n bindGroup.setValue('params', new Vector4(edge, kind === 'base' ? BASE_FREQ : DETAIL_FREQ, 0, 0));\r\n bindGroup.setValue('seed', seedOffset(seed));\r\n },\r\n groups,\r\n groups,\r\n groups\r\n );\r\n tex.generateMipmaps();\r\n }\r\n private _fromAtlas(target: DRef<Texture3D>, source: Texture2D, edge: number, cols: number, name: string) {\r\n const tex = this._ensureVolume(target, edge, name);\r\n const groups = Math.ceil(edge / 4);\r\n this._dispatch(\r\n getAtlasProgram(),\r\n (bindGroup) => {\r\n bindGroup.setTexture('src', source, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTextureView('dst', tex, 0, 0, 1);\r\n bindGroup.setValue('params', new Vector4(edge, cols, 0, 0));\r\n },\r\n groups,\r\n groups,\r\n groups\r\n );\r\n tex.generateMipmaps();\r\n }\r\n private _generateWeatherMap(seed: number) {\r\n let tex = this._weatherMap.get();\r\n if (!tex) {\r\n tex = getDevice().createTexture2D('rgba8unorm', CLOUD_WEATHER_MAP_SIZE, CLOUD_WEATHER_MAP_SIZE, {\r\n samplerOptions: { addressU: 'repeat', addressV: 'repeat' }\r\n })!;\r\n this._weatherMap.set(tex);\r\n }\r\n tex.name = 'CloudWeatherMap';\r\n const groups = Math.ceil(CLOUD_WEATHER_MAP_SIZE / 8);\r\n this._dispatch(\r\n getWeatherProgram(),\r\n (bindGroup) => {\r\n bindGroup.setTextureView('dst', tex, 0, 0, 1);\r\n bindGroup.setValue(\r\n 'params',\r\n new Vector4(\r\n CLOUD_WEATHER_MAP_SIZE,\r\n WEATHER_FOOTPRINT_FREQ,\r\n WEATHER_TYPE_FREQ,\r\n WEATHER_MODULATION_FREQ\r\n )\r\n );\r\n bindGroup.setValue('seed', seedOffset(seed));\r\n },\r\n groups,\r\n groups,\r\n 1\r\n );\r\n tex.generateMipmaps();\r\n }\r\n}\r\n"],"names":["CLOUD_BASE_NOISE_SIZE","CLOUD_DETAIL_NOISE_SIZE","CLOUD_WEATHER_MAP_SIZE","BASE_FREQ","DETAIL_FREQ","WEATHER_FOOTPRINT_FREQ","WEATHER_ISOLATED_FREQ","WEATHER_MODULATION_FREQ","WEATHER_TYPE_FREQ","WEATHER_CONNECTED_QUANTILES","empiricalCDF","scope","v","quantiles","pb","$builder","n","length","sum","i","lo","hi","add","mul","clamp","div","sub","Math","max","baseProgram","detailProgram","weatherProgram","atlasProgram","seedOffset","seed","Vector3","getVolumeProgram","kind","cached","program","getDevice","buildComputeProgram","label","workgroupSize","compute","dst","texStorage3D","rgba8unorm","storage","params","vec4","uniform","vec3","main","$l","size","uint","x","$if","all","lessThan","$builtins","globalInvocationId","uvec3","p","freq","y","w0","cloudWorleyFbm","w1","w2","r","cloudPerlinWorley","value","textureStore","getWeatherProgram","texStorage2D","xy","uvec2","vec2","modulation","cloudPerlinFbm","w","connectedRaw","isolated","cloudWorleyNoise","float","smoothStep","connected","cloudType","z","getAtlasProgram","src","tex2D","sampleType","edge","cols","id","texel","mod","textureLoad","ivec2","getVolumeAtlasLayout","width","height","round","cbrt","rows","VolumetricCloudResources","Disposable","_baseNoise","_detailNoise","_weatherMap","_baseNoiseSource","_detailNoiseSource","_weatherMapSource","_detailSeed","_weatherSeed","_baseFrom","_detailFrom","DRef","_baseSeed","_bindGroups","Map","baseNoiseSource","get","tex","set","detailNoiseSource","weatherMapSource","baseNoise","detailNoise","weatherMap","update","_updateVolume","_generateWeatherMap","onDispose","dispose","bindGroup","values","clear","target","source","from","madeSeed","layout","console","error","_fromAtlas","_setMade","_generateVolume","_ensureVolume","name","createTexture3D","writable","samplerOptions","addressU","addressV","addressW","magFilter","minFilter","mipFilter","_dispatch","setup","device","createBindGroup","bindGroupLayouts","setProgram","setBindGroup","groups","ceil","setTextureView","setValue","Vector4","generateMipmaps","setTexture","fetchSampler","createTexture2D"],"mappings":"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"}
|