@zephyr3d/scene 0.9.27 → 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 +54 -0
- 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 +279 -55
- 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 +171 -1
- 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 +104 -178
- 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 +25436 -15990
- package/dist/index.js +65 -11
- 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/lambert.js +4 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +66 -4
- 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 +191 -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 +333 -191
- 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 +1261 -1438
- 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 +106 -106
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/postsss.js +572 -0
- package/dist/posteffect/postsss.js.map +1 -0
- package/dist/posteffect/sao.js +2 -6
- 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 +4 -13
- 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 +3 -2
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +179 -64
- 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 +25 -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 +5 -5
- 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 +5 -10
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +247 -157
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +16 -38
- 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/instance_culling.js +499 -0
- package/dist/render/instance_culling.js.map +1 -0
- package/dist/render/lightpass.js +19 -8
- 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/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 +162 -11
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +10 -7
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +14 -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 +272 -55
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_graph_context.js +41 -0
- package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
- 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 +58 -158
- package/dist/render/underwater.js.map +1 -1
- 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 +134 -319
- package/dist/render/water_caustics.js.map +1 -1
- 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 +3 -3
- 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 +633 -268
- 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/ssgi.js +63 -0
- package/dist/shaders/ssgi.js.map +1 -0
- package/dist/shaders/ssgi_reprojection.js +118 -0
- package/dist/shaders/ssgi_reprojection.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 +32 -82
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +7 -21
- package/dist/shaders/water_medium.js.map +1 -1
- 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 +40 -2
- 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 +34 -6
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +46 -5
- 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 +87 -254
- 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 +1543 -264
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +10 -22
- 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
- package/dist/animation/joint_dynamics/convex_collider.js +0 -320
- package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
import { Disposable, Vector4, Vector2 } from '@zephyr3d/base';
|
|
2
|
+
import { VirtualTexture, virtualMipChain } from '../../render/virtualtexture/virtual_texture.js';
|
|
3
|
+
import { ShaderHelper } from '../../material/shader/helper.js';
|
|
4
|
+
import { terrainSplatMaskCount, blendTerrainAlbedo, blendTerrainDetailNormal, blendTerrainRoughness } from '../../material/shader/terrain_blend.js';
|
|
5
|
+
import { fetchSampler } from '../../utility/misc.js';
|
|
6
|
+
import { getApp, getDevice } from '../../app/api.js';
|
|
7
|
+
|
|
8
|
+
const TOLERANCE_DISTANCE_SCALE = 0.02;
|
|
9
|
+
const TOLERANCE_MIN_CELLS = 2;
|
|
10
|
+
const BORDER = 4;
|
|
11
|
+
/**
|
|
12
|
+
* The runtime virtual texture of a clipmap terrain: the detail layers blended once per page
|
|
13
|
+
* instead of per pixel.
|
|
14
|
+
*
|
|
15
|
+
* WebGPU only.
|
|
16
|
+
* @internal
|
|
17
|
+
*/ class TerrainVirtualTexture extends Disposable {
|
|
18
|
+
_terrain;
|
|
19
|
+
_options;
|
|
20
|
+
_vt;
|
|
21
|
+
_fillProgram;
|
|
22
|
+
_fillBindGroup;
|
|
23
|
+
/** (layer count, hex tiling mask) the fill program was built for */ _fillKey;
|
|
24
|
+
_markProgram;
|
|
25
|
+
_markBindGroup;
|
|
26
|
+
/** What the resident pages were filled from, see sync() */ _contentVersion;
|
|
27
|
+
_contentParams;
|
|
28
|
+
_fillParams;
|
|
29
|
+
_fillSizes;
|
|
30
|
+
constructor(terrain, options){
|
|
31
|
+
super();
|
|
32
|
+
this._terrain = terrain;
|
|
33
|
+
this._options = {
|
|
34
|
+
virtualSize: options?.virtualSize ?? 32768,
|
|
35
|
+
pageSize: options?.pageSize ?? 128,
|
|
36
|
+
atlasSize: options?.atlasSize ?? 4096,
|
|
37
|
+
allocBudget: options?.allocBudget ?? (getApp()?.editorMode === 'editor' ? 64 : 16)
|
|
38
|
+
};
|
|
39
|
+
this._fillProgram = null;
|
|
40
|
+
this._fillBindGroup = null;
|
|
41
|
+
this._fillKey = '';
|
|
42
|
+
this._markProgram = null;
|
|
43
|
+
this._markBindGroup = null;
|
|
44
|
+
this._contentVersion = -1;
|
|
45
|
+
this._contentParams = new Float32Array(8 * 4 + 8 * 4 + 6);
|
|
46
|
+
this._fillParams = new Vector4();
|
|
47
|
+
this._fillSizes = new Vector4();
|
|
48
|
+
this._vt = this.createVirtualTexture();
|
|
49
|
+
}
|
|
50
|
+
get virtualTexture() {
|
|
51
|
+
return this._vt;
|
|
52
|
+
}
|
|
53
|
+
get options() {
|
|
54
|
+
return this._options;
|
|
55
|
+
}
|
|
56
|
+
isActive(_ctx, _renderQueue) {
|
|
57
|
+
// A terrain taken out of the scene graph (but not disposed, e.g. an undoable delete) stays
|
|
58
|
+
// registered; it has nothing to mark or fill until it is attached again
|
|
59
|
+
return this._terrain.attached && !!this._terrain.material?.virtualTextureUsed;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Marks the resident pages covering a world XZ rectangle for refilling
|
|
63
|
+
*/ invalidateWorldRegion(x0, z0, x1, z1) {
|
|
64
|
+
const region = this._terrain.worldRegion;
|
|
65
|
+
const sx = region.z - region.x;
|
|
66
|
+
const sz = region.w - region.y;
|
|
67
|
+
if (sx > 0 && sz > 0) {
|
|
68
|
+
this._vt.invalidateRegion((Math.min(x0, x1) - region.x) / sx, (Math.min(z0, z1) - region.y) / sz, (Math.max(x0, x1) - region.x) / sx, (Math.max(z0, z1) - region.y) / sz);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
invalidate() {
|
|
72
|
+
this._vt.invalidate();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Marks the pages this camera sees on the terrain, one thread per depth pixel: the world
|
|
76
|
+
* position is rebuilt from the depth and projected to the terrain uv, the level comes from the
|
|
77
|
+
* uv step to the neighbouring pixels. A neighbour off the terrain is never taken as zero footprint,
|
|
78
|
+
* see plans/sparse-virtual-texture.md, phase 2.
|
|
79
|
+
*/ markFromDepth(ctx, linearDepth) {
|
|
80
|
+
this.sync();
|
|
81
|
+
const device = getDevice();
|
|
82
|
+
const camera = ctx.camera;
|
|
83
|
+
const material = this._terrain.material;
|
|
84
|
+
if (!this._markProgram) {
|
|
85
|
+
this._markProgram = this.createMarkProgram();
|
|
86
|
+
this._markBindGroup = device.createBindGroup(this._markProgram.bindGroupLayouts[0]);
|
|
87
|
+
}
|
|
88
|
+
const bindGroup = this._markBindGroup;
|
|
89
|
+
const region = this._terrain.worldRegion;
|
|
90
|
+
const heightMap = material.heightMap;
|
|
91
|
+
const cell = Math.max((region.z - region.x) / heightMap.width, (region.w - region.y) / heightMap.height);
|
|
92
|
+
const cameraPos = camera.getWorldPosition();
|
|
93
|
+
this._vt.applyBindings(bindGroup);
|
|
94
|
+
// Unfilterable float: the sampler must not filter
|
|
95
|
+
bindGroup.setTexture('depthTex', linearDepth, fetchSampler('clamp_nearest_nomip'));
|
|
96
|
+
bindGroup.setTexture('heightMap', heightMap, fetchSampler('clamp_linear_nomip'));
|
|
97
|
+
bindGroup.setValue('invVP', camera.invViewProjectionMatrix);
|
|
98
|
+
bindGroup.setValue('nearFar', new Vector2(camera.getNearPlane(), camera.getFarPlane()));
|
|
99
|
+
bindGroup.setValue('depthSize', new Vector2(linearDepth.width, linearDepth.height));
|
|
100
|
+
bindGroup.setValue('region', region);
|
|
101
|
+
bindGroup.setValue('markParams', new Vector4(this._terrain.worldMatrix.m13, material.terrainScale.y, cell * TOLERANCE_MIN_CELLS, 0));
|
|
102
|
+
bindGroup.setValue('cameraPos', cameraPos);
|
|
103
|
+
device.setProgram(this._markProgram);
|
|
104
|
+
device.setBindGroup(0, bindGroup);
|
|
105
|
+
device.compute(Math.ceil(linearDepth.width / 8), Math.ceil(linearDepth.height / 8), 1);
|
|
106
|
+
}
|
|
107
|
+
fill(_ctx) {
|
|
108
|
+
const material = this._terrain.material;
|
|
109
|
+
const numLayers = material.numDetailMaps;
|
|
110
|
+
const hexMask = material.hexTilingMask;
|
|
111
|
+
const key = `${numLayers}:${hexMask}`;
|
|
112
|
+
if (!this._fillProgram || this._fillKey !== key) {
|
|
113
|
+
this._fillBindGroup?.dispose();
|
|
114
|
+
this._fillProgram?.dispose();
|
|
115
|
+
this._fillProgram = this.createFillProgram(numLayers, hexMask);
|
|
116
|
+
this._fillBindGroup = getDevice().createBindGroup(this._fillProgram.bindGroupLayouts[0]);
|
|
117
|
+
this._fillKey = key;
|
|
118
|
+
}
|
|
119
|
+
const bindGroup = this._fillBindGroup;
|
|
120
|
+
const region = this._terrain.worldRegion;
|
|
121
|
+
const heightMap = material.heightMap;
|
|
122
|
+
const splatMap = material.getSplatMap();
|
|
123
|
+
this._fillParams.setXYZW(region.z - region.x, region.w - region.y, material.terrainScale.y, material.roughness);
|
|
124
|
+
this._fillSizes.setXYZW(heightMap.width, heightMap.height, splatMap.width, material.detailMapArray.width);
|
|
125
|
+
bindGroup.setTexture('splatMap', splatMap, fetchSampler('clamp_linear'));
|
|
126
|
+
bindGroup.setTexture('detailAlbedoMap', material.detailMapArray, fetchSampler('repeat_linear'));
|
|
127
|
+
bindGroup.setTexture('detailNormalMap', material.detailNormalMapArray, fetchSampler('repeat_linear'));
|
|
128
|
+
bindGroup.setValue('detailParams', material.detailMapParams.subarray(0, numLayers * 4));
|
|
129
|
+
if (hexMask) {
|
|
130
|
+
bindGroup.setValue('detailHexParams', material.detailHexParams.subarray(0, numLayers * 4));
|
|
131
|
+
}
|
|
132
|
+
bindGroup.setTexture('heightMap', heightMap, fetchSampler(heightMap.mipLevelCount > 1 ? 'clamp_linear' : 'clamp_linear_nomip'));
|
|
133
|
+
bindGroup.setValue('fillParams', this._fillParams);
|
|
134
|
+
bindGroup.setValue('fillSizes', this._fillSizes);
|
|
135
|
+
this._vt.fill(this._fillProgram, bindGroup);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Keeps the pages in step with what they are filled from: a new virtual size (region aspect)
|
|
139
|
+
* rebuilds the texture, any other change refills every page. Brush edits invalidate their own
|
|
140
|
+
* area through ClipmapTerrain.invalidateRuntimeVirtualTexture instead.
|
|
141
|
+
*/ sync() {
|
|
142
|
+
const material = this._terrain.material;
|
|
143
|
+
const [width, height] = this.virtualDimensions();
|
|
144
|
+
const l0 = this._vt.levels[0];
|
|
145
|
+
if (l0.pagesX * this._vt.pageSize !== width || l0.pagesY * this._vt.pageSize !== height) {
|
|
146
|
+
this.rebuild();
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const region = this._terrain.worldRegion;
|
|
150
|
+
const params = this._contentParams;
|
|
151
|
+
const current = new Float32Array(params.length);
|
|
152
|
+
current.set(material.detailMapParams.subarray(0, 32));
|
|
153
|
+
current.set(material.detailHexParams.subarray(0, 32), 32);
|
|
154
|
+
current.set([
|
|
155
|
+
material.hexTilingMask,
|
|
156
|
+
material.numDetailMaps,
|
|
157
|
+
material.roughness,
|
|
158
|
+
region.z - region.x,
|
|
159
|
+
region.w - region.y,
|
|
160
|
+
material.terrainScale.y
|
|
161
|
+
], 64);
|
|
162
|
+
let changed = this._contentVersion !== material.contentVersion;
|
|
163
|
+
for(let i = 0; i < params.length && !changed; i++){
|
|
164
|
+
changed = params[i] !== current[i];
|
|
165
|
+
}
|
|
166
|
+
if (changed) {
|
|
167
|
+
params.set(current);
|
|
168
|
+
this._contentVersion = material.contentVersion;
|
|
169
|
+
this._vt.invalidate();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/** Recreates the virtual texture, e.g. after the options or the terrain aspect changed */ rebuild() {
|
|
173
|
+
this._vt.dispose();
|
|
174
|
+
this.releasePrograms();
|
|
175
|
+
this._contentVersion = -1;
|
|
176
|
+
this._vt = this.createVirtualTexture();
|
|
177
|
+
const material = this._terrain.material;
|
|
178
|
+
if (material) {
|
|
179
|
+
material.virtualTexture = this._vt;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
setOptions(options) {
|
|
183
|
+
Object.assign(this._options, options);
|
|
184
|
+
this.rebuild();
|
|
185
|
+
}
|
|
186
|
+
virtualDimensions() {
|
|
187
|
+
const size = this._options.virtualSize;
|
|
188
|
+
const region = this._terrain.worldRegion;
|
|
189
|
+
const sx = Math.max(region.z - region.x, 1e-6);
|
|
190
|
+
const sz = Math.max(region.w - region.y, 1e-6);
|
|
191
|
+
// The shorter side by the power of two closest to the aspect, at least one page
|
|
192
|
+
const ratio = 2 ** Math.round(Math.log2(Math.max(sx, sz) / Math.min(sx, sz)));
|
|
193
|
+
const shorter = Math.max(this._options.pageSize, size / ratio);
|
|
194
|
+
return sx >= sz ? [
|
|
195
|
+
size,
|
|
196
|
+
shorter
|
|
197
|
+
] : [
|
|
198
|
+
shorter,
|
|
199
|
+
size
|
|
200
|
+
];
|
|
201
|
+
}
|
|
202
|
+
createVirtualTexture() {
|
|
203
|
+
const [width, height] = this.virtualDimensions();
|
|
204
|
+
return new VirtualTexture(getDevice(), {
|
|
205
|
+
levels: virtualMipChain(width, height, this._options.pageSize),
|
|
206
|
+
pageSize: this._options.pageSize,
|
|
207
|
+
border: BORDER,
|
|
208
|
+
atlasSize: this._options.atlasSize,
|
|
209
|
+
planes: [
|
|
210
|
+
{
|
|
211
|
+
name: 'baseColor',
|
|
212
|
+
format: 'rgba8unorm'
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
name: 'normalRoughness',
|
|
216
|
+
format: 'rgba8unorm'
|
|
217
|
+
}
|
|
218
|
+
],
|
|
219
|
+
allocBudget: this._options.allocBudget,
|
|
220
|
+
residencyMipBias: true
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
createMarkProgram() {
|
|
224
|
+
const vt = this._vt;
|
|
225
|
+
return getDevice().buildComputeProgram({
|
|
226
|
+
label: 'TerrainVirtualTextureMark',
|
|
227
|
+
workgroupSize: [
|
|
228
|
+
8,
|
|
229
|
+
8,
|
|
230
|
+
1
|
|
231
|
+
],
|
|
232
|
+
compute (pb) {
|
|
233
|
+
vt.declareBindings(this, 0);
|
|
234
|
+
this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);
|
|
235
|
+
this.heightMap = pb.tex2D().uniform(0);
|
|
236
|
+
this.invVP = pb.mat4().uniform(0);
|
|
237
|
+
this.nearFar = pb.vec2().uniform(0);
|
|
238
|
+
this.depthSize = pb.vec2().uniform(0);
|
|
239
|
+
this.region = pb.vec4().uniform(0);
|
|
240
|
+
// (terrain origin y, height scale, minimum height tolerance, 0)
|
|
241
|
+
this.markParams = pb.vec4().uniform(0);
|
|
242
|
+
this.cameraPos = pb.vec3().uniform(0);
|
|
243
|
+
// (terrain uv, 1) at a pixel whose depth lies on the terrain, z = 0 otherwise
|
|
244
|
+
pb.func('terrainUV', [
|
|
245
|
+
pb.ivec2('p')
|
|
246
|
+
], function() {
|
|
247
|
+
this.$l.d = pb.textureLoad(this.depthTex, this.p, 0).r;
|
|
248
|
+
this.$l.nonLinear = ShaderHelper.linearNormalizedToNonLinearDepth(this, this.d, this.nearFar);
|
|
249
|
+
this.$l.screenUV = pb.div(pb.add(pb.vec2(this.p), pb.vec2(0.5)), this.depthSize);
|
|
250
|
+
this.$l.clip = pb.vec4(pb.sub(pb.mul(this.screenUV, 2), pb.vec2(1)), ShaderHelper.deviceDepthToClipZ(this, pb.clamp(this.nonLinear, 0, 1)), 1);
|
|
251
|
+
this.$l.w = pb.mul(this.invVP, this.clip);
|
|
252
|
+
this.$l.pos = pb.div(this.w.xyz, this.w.w);
|
|
253
|
+
this.$l.uv = pb.div(pb.sub(this.pos.xz, this.region.xy), pb.sub(this.region.zw, this.region.xy));
|
|
254
|
+
this.$l.h = pb.add(this.markParams.x, pb.mul(pb.textureSampleLevel(this.heightMap, this.uv, 0).r, this.markParams.y));
|
|
255
|
+
this.$l.tolerance = pb.max(this.markParams.z, pb.mul(pb.distance(this.pos, this.cameraPos), TOLERANCE_DISTANCE_SCALE));
|
|
256
|
+
this.$l.onTerrain = pb.and(pb.and(pb.lessThan(this.d, 0.9999), pb.lessThanEqual(pb.abs(pb.sub(this.pos.y, this.h)), this.tolerance)), pb.and(pb.all(pb.greaterThanEqual(this.uv, pb.vec2(0))), pb.all(pb.lessThanEqual(this.uv, pb.vec2(1)))));
|
|
257
|
+
this.$return(pb.vec3(this.uv, pb.float(this.onTerrain)));
|
|
258
|
+
});
|
|
259
|
+
// Change of the terrain uv to the next pixel along `step`, forward if that pixel is on
|
|
260
|
+
// the terrain, else backward: (duv, 1), or (0, 0, 0) when neither neighbour is
|
|
261
|
+
pb.func('axisDelta', [
|
|
262
|
+
pb.ivec2('p'),
|
|
263
|
+
pb.ivec2('step'),
|
|
264
|
+
pb.vec2('uv')
|
|
265
|
+
], function() {
|
|
266
|
+
this.$l.size = pb.ivec2(this.depthSize);
|
|
267
|
+
this.$l.f = pb.add(this.p, this.step);
|
|
268
|
+
this.$if(pb.and(pb.lessThan(this.f.x, this.size.x), pb.lessThan(this.f.y, this.size.y)), function() {
|
|
269
|
+
this.$l.nf = this.terrainUV(this.f);
|
|
270
|
+
this.$if(pb.notEqual(this.nf.z, 0), function() {
|
|
271
|
+
this.$return(pb.vec3(pb.sub(this.nf.xy, this.uv), 1));
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
this.$l.b = pb.sub(this.p, this.step);
|
|
275
|
+
this.$if(pb.and(pb.greaterThanEqual(this.b.x, 0), pb.greaterThanEqual(this.b.y, 0)), function() {
|
|
276
|
+
this.$l.nb = this.terrainUV(this.b);
|
|
277
|
+
this.$if(pb.notEqual(this.nb.z, 0), function() {
|
|
278
|
+
this.$return(pb.vec3(pb.sub(this.uv, this.nb.xy), 1));
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
this.$return(pb.vec3(0));
|
|
282
|
+
});
|
|
283
|
+
pb.main(function() {
|
|
284
|
+
this.$l.p = pb.ivec2(this.$builtins.globalInvocationId.xy);
|
|
285
|
+
this.$l.size = pb.ivec2(this.depthSize);
|
|
286
|
+
this.$if(pb.or(pb.greaterThanEqual(this.p.x, this.size.x), pb.greaterThanEqual(this.p.y, this.size.y)), function() {
|
|
287
|
+
this.$return();
|
|
288
|
+
});
|
|
289
|
+
this.$l.c = this.terrainUV(this.p);
|
|
290
|
+
this.$if(pb.equal(this.c.z, 0), function() {
|
|
291
|
+
this.$return();
|
|
292
|
+
});
|
|
293
|
+
// An axis without a neighbour on the terrain uses the other axis alone, a pixel
|
|
294
|
+
// without any is not marked (it resolves to a resident ancestor)
|
|
295
|
+
this.$l.ax = this.axisDelta(this.p, pb.ivec2(1, 0), this.c.xy);
|
|
296
|
+
this.$l.ay = this.axisDelta(this.p, pb.ivec2(0, 1), this.c.xy);
|
|
297
|
+
this.$if(pb.equal(pb.add(this.ax.z, this.ay.z), 0), function() {
|
|
298
|
+
this.$return();
|
|
299
|
+
});
|
|
300
|
+
this.$l.dx = pb.select(this.ay.xy, this.ax.xy, pb.notEqual(this.ax.z, 0));
|
|
301
|
+
this.$l.dy = pb.select(this.ax.xy, this.ay.xy, pb.notEqual(this.ay.z, 0));
|
|
302
|
+
this.$l.level = pb.uint(pb.floor(vt.levelFromFootprint(this, this.dx, this.dy)));
|
|
303
|
+
vt.request(this, this.level, this.c.xy);
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* The page fill: the same blend as the material's live path (terrain_blend.ts), each texture
|
|
310
|
+
* sampled at the LOD of one texel of the page's level, and the height map tangent frame of
|
|
311
|
+
* ClipmapTerrainMaterial.calculateTerrainTBN on the same footprint.
|
|
312
|
+
*/ createFillProgram(numLayers, hexMask) {
|
|
313
|
+
const vt = this._vt;
|
|
314
|
+
return vt.createFillProgram(`TerrainVirtualTextureFill${numLayers}_${hexMask}`, (scope)=>{
|
|
315
|
+
const pb = scope.$builder;
|
|
316
|
+
scope.splatMap = pb.tex2DArray().uniform(0);
|
|
317
|
+
scope.detailAlbedoMap = pb.tex2DArray().uniform(0);
|
|
318
|
+
scope.detailNormalMap = pb.tex2DArray().uniform(0);
|
|
319
|
+
scope.detailParams = pb.vec4[numLayers]().uniform(0);
|
|
320
|
+
if (hexMask) {
|
|
321
|
+
scope.detailHexParams = pb.vec4[numLayers]().uniform(0);
|
|
322
|
+
}
|
|
323
|
+
scope.heightMap = pb.tex2D().uniform(0);
|
|
324
|
+
// (region width, region depth, height scale, material roughness)
|
|
325
|
+
scope.fillParams = pb.vec4().uniform(0);
|
|
326
|
+
// (height map width, height map height, splat map size, detail map size)
|
|
327
|
+
scope.fillSizes = pb.vec4().uniform(0);
|
|
328
|
+
}, (scope, level, texel)=>{
|
|
329
|
+
const pb = scope.$builder;
|
|
330
|
+
scope.$l.levelTexels = vt.levelTexels(scope, level);
|
|
331
|
+
scope.$l.uv = pb.div(texel, scope.levelTexels);
|
|
332
|
+
// Terrain uv covered by one texel of this level
|
|
333
|
+
scope.$l.footprint = pb.div(1, pb.min(scope.levelTexels.x, scope.levelTexels.y));
|
|
334
|
+
scope.$l.splatLod = pb.max(pb.log2(pb.mul(scope.footprint, scope.fillSizes.z)), 0);
|
|
335
|
+
const masks = [];
|
|
336
|
+
for(let i = 0; i < terrainSplatMaskCount(numLayers); i++){
|
|
337
|
+
scope.$l[`mask${i}`] = pb.textureArraySampleLevel(scope.splatMap, scope.uv, i, scope.splatLod);
|
|
338
|
+
masks.push(scope[`mask${i}`]);
|
|
339
|
+
}
|
|
340
|
+
// The uv step to the next texel of the level stands for the screen derivatives: the
|
|
341
|
+
// gradients pick the mip the orthographic top view would get (and turn with the hex tiles)
|
|
342
|
+
const grad = {
|
|
343
|
+
ddx: pb.vec2(pb.div(1, scope.levelTexels.x), 0),
|
|
344
|
+
ddy: pb.vec2(0, pb.div(1, scope.levelTexels.y))
|
|
345
|
+
};
|
|
346
|
+
const hex = hexMask ? {
|
|
347
|
+
mask: hexMask,
|
|
348
|
+
params: scope.detailHexParams
|
|
349
|
+
} : null;
|
|
350
|
+
scope.$l.albedo = blendTerrainAlbedo(scope, numLayers, masks, scope.uv, scope.detailParams, (s, i, uv, ddx, ddy)=>pb.textureArraySampleGrad(s.detailAlbedoMap, uv, i, ddx, ddy), grad, hex);
|
|
351
|
+
scope.$l.detailNormal = blendTerrainDetailNormal(scope, numLayers, masks, scope.uv, scope.detailParams, (s, i, uv, ddx, ddy)=>pb.textureArraySampleGrad(s.detailNormalMap, uv, i, ddx, ddy), grad, hex);
|
|
352
|
+
scope.$l.roughness = blendTerrainRoughness(scope, numLayers, masks, scope.detailParams, scope.fillParams.w);
|
|
353
|
+
// Height map tangent frame, ClipmapTerrainMaterial.calculateTerrainTBN
|
|
354
|
+
scope.$l.heightLod = pb.max(pb.log2(pb.max(pb.mul(scope.footprint, pb.max(scope.fillSizes.x, scope.fillSizes.y)), 0.0001)), 0);
|
|
355
|
+
scope.$l.offset = pb.mul(pb.div(pb.vec2(1), scope.fillSizes.xy), pb.mul(pb.exp2(scope.heightLod), 0.5));
|
|
356
|
+
const height = (uv)=>pb.textureSampleLevel(scope.heightMap, uv, scope.heightLod).r;
|
|
357
|
+
scope.$l.hL = height(pb.sub(scope.uv, pb.vec2(scope.offset.x, 0)));
|
|
358
|
+
scope.$l.hR = height(pb.add(scope.uv, pb.vec2(scope.offset.x, 0)));
|
|
359
|
+
scope.$l.hU = height(pb.sub(scope.uv, pb.vec2(0, scope.offset.y)));
|
|
360
|
+
scope.$l.hD = height(pb.add(scope.uv, pb.vec2(0, scope.offset.y)));
|
|
361
|
+
scope.$l.sampleDist = pb.mul(scope.fillParams.xy, pb.mul(scope.offset, 2));
|
|
362
|
+
scope.$l.dHdU = pb.div(pb.mul(pb.sub(scope.hR, scope.hL), scope.fillParams.z), scope.sampleDist.x);
|
|
363
|
+
scope.$l.dHdV = pb.div(pb.mul(pb.sub(scope.hD, scope.hU), scope.fillParams.z), scope.sampleDist.y);
|
|
364
|
+
scope.$l.t = pb.normalize(pb.vec3(1, scope.dHdU, 0));
|
|
365
|
+
scope.$l.b = pb.normalize(pb.vec3(0, scope.dHdV, 1));
|
|
366
|
+
scope.$l.n = pb.normalize(pb.cross(scope.b, scope.t));
|
|
367
|
+
scope.$l.normal = pb.normalize(pb.mul(pb.mat3(scope.t, scope.b, scope.n), scope.detailNormal));
|
|
368
|
+
// PackNormal and LinearToSrgb (VirtualTextureMaterial.usf)
|
|
369
|
+
scope.$l.packed = pb.add(pb.mul(scope.normal, 127 / 255), pb.vec3(127 / 255));
|
|
370
|
+
scope.$l.srgb = pb.mix(pb.sub(pb.mul(pb.pow(scope.albedo, pb.vec3(1 / 2.4)), 1.055), pb.vec3(0.055)), pb.mul(scope.albedo, 12.92), pb.vec3(pb.lessThanEqual(scope.albedo, pb.vec3(0.0031308))));
|
|
371
|
+
return [
|
|
372
|
+
pb.vec4(pb.clamp(scope.srgb, pb.vec3(0), pb.vec3(1)), 1),
|
|
373
|
+
pb.vec4(scope.packed.x, scope.roughness, scope.packed.z, 1)
|
|
374
|
+
];
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
/** The mark and fill programs bake in the layout of the virtual texture they were built for */ releasePrograms() {
|
|
378
|
+
this._markBindGroup?.dispose();
|
|
379
|
+
this._markBindGroup = null;
|
|
380
|
+
this._markProgram?.dispose();
|
|
381
|
+
this._markProgram = null;
|
|
382
|
+
this._fillBindGroup?.dispose();
|
|
383
|
+
this._fillBindGroup = null;
|
|
384
|
+
this._fillProgram?.dispose();
|
|
385
|
+
this._fillProgram = null;
|
|
386
|
+
}
|
|
387
|
+
onDispose() {
|
|
388
|
+
super.onDispose();
|
|
389
|
+
this._vt.dispose();
|
|
390
|
+
this.releasePrograms();
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
export { TerrainVirtualTexture };
|
|
395
|
+
//# sourceMappingURL=terrain_rvt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terrain_rvt.js","sources":["../../../src/scene/terrain-cm/terrain_rvt.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { Disposable, Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { BindGroup, GPUProgram, PBInsideFunctionScope, PBShaderExp, Texture2D } from '@zephyr3d/device';\r\nimport type { DrawContext, RenderQueue, VirtualTextureClient } from '../../render';\r\nimport { VirtualTexture, virtualMipChain } from '../../render/virtualtexture/virtual_texture';\r\nimport { ShaderHelper } from '../../material/shader/helper';\r\nimport {\r\n blendTerrainAlbedo,\r\n blendTerrainDetailNormal,\r\n blendTerrainRoughness,\r\n terrainSplatMaskCount\r\n} from '../../material/shader/terrain_blend';\r\nimport { fetchSampler } from '../../utility/misc';\r\nimport { getApp, getDevice } from '../../app/api';\r\nimport type { ClipmapTerrain } from './terrain-cm';\r\n\r\n/**\r\n * Options of a terrain runtime virtual texture\r\n * @public\r\n */\r\nexport interface TerrainVirtualTextureOptions {\r\n /**\r\n * Virtual size in texels along the longer side of the terrain, a power of two. The shorter\r\n * side gets the power of two closest to the terrain aspect. Default 32768.\r\n */\r\n virtualSize?: number;\r\n /** Page size in texels, default 128 */\r\n pageSize?: number;\r\n /** Physical atlas size in texels, default 4096 (961 pages, two rgba8 planes, 128 MB) */\r\n atlasSize?: number;\r\n /**\r\n * Pages filled per update. Default 16, 64 in the editor, where brushes invalidate whole areas\r\n * every frame and the pages have to keep up with the edits.\r\n */\r\n allocBudget?: number;\r\n}\r\n\r\nconst TOLERANCE_DISTANCE_SCALE = 0.02;\r\nconst TOLERANCE_MIN_CELLS = 2;\r\nconst BORDER = 4;\r\n\r\n/**\r\n * The runtime virtual texture of a clipmap terrain: the detail layers blended once per page\r\n * instead of per pixel.\r\n *\r\n * WebGPU only.\r\n * @internal\r\n */\r\nexport class TerrainVirtualTexture extends Disposable implements VirtualTextureClient {\r\n private readonly _terrain: ClipmapTerrain;\r\n private readonly _options: Required<TerrainVirtualTextureOptions>;\r\n private _vt: VirtualTexture;\r\n private _fillProgram: Nullable<GPUProgram>;\r\n private _fillBindGroup: Nullable<BindGroup>;\r\n /** (layer count, hex tiling mask) the fill program was built for */\r\n private _fillKey: string;\r\n private _markProgram: Nullable<GPUProgram>;\r\n private _markBindGroup: Nullable<BindGroup>;\r\n /** What the resident pages were filled from, see sync() */\r\n private _contentVersion: number;\r\n private readonly _contentParams: Float32Array<ArrayBuffer>;\r\n private readonly _fillParams: Vector4;\r\n private readonly _fillSizes: Vector4;\r\n constructor(terrain: ClipmapTerrain, options?: TerrainVirtualTextureOptions) {\r\n super();\r\n this._terrain = terrain;\r\n this._options = {\r\n virtualSize: options?.virtualSize ?? 32768,\r\n pageSize: options?.pageSize ?? 128,\r\n atlasSize: options?.atlasSize ?? 4096,\r\n allocBudget: options?.allocBudget ?? (getApp()?.editorMode === 'editor' ? 64 : 16)\r\n };\r\n this._fillProgram = null;\r\n this._fillBindGroup = null;\r\n this._fillKey = '';\r\n this._markProgram = null;\r\n this._markBindGroup = null;\r\n this._contentVersion = -1;\r\n this._contentParams = new Float32Array(8 * 4 + 8 * 4 + 6);\r\n this._fillParams = new Vector4();\r\n this._fillSizes = new Vector4();\r\n this._vt = this.createVirtualTexture();\r\n }\r\n get virtualTexture() {\r\n return this._vt;\r\n }\r\n get options(): Readonly<Required<TerrainVirtualTextureOptions>> {\r\n return this._options;\r\n }\r\n isActive(_ctx: DrawContext, _renderQueue: RenderQueue) {\r\n // A terrain taken out of the scene graph (but not disposed, e.g. an undoable delete) stays\r\n // registered; it has nothing to mark or fill until it is attached again\r\n return this._terrain.attached && !!this._terrain.material?.virtualTextureUsed;\r\n }\r\n /**\r\n * Marks the resident pages covering a world XZ rectangle for refilling\r\n */\r\n invalidateWorldRegion(x0: number, z0: number, x1: number, z1: number) {\r\n const region = this._terrain.worldRegion;\r\n const sx = region.z - region.x;\r\n const sz = region.w - region.y;\r\n if (sx > 0 && sz > 0) {\r\n this._vt.invalidateRegion(\r\n (Math.min(x0, x1) - region.x) / sx,\r\n (Math.min(z0, z1) - region.y) / sz,\r\n (Math.max(x0, x1) - region.x) / sx,\r\n (Math.max(z0, z1) - region.y) / sz\r\n );\r\n }\r\n }\r\n invalidate() {\r\n this._vt.invalidate();\r\n }\r\n /**\r\n * Marks the pages this camera sees on the terrain, one thread per depth pixel: the world\r\n * position is rebuilt from the depth and projected to the terrain uv, the level comes from the\r\n * uv step to the neighbouring pixels. A neighbour off the terrain is never taken as zero footprint,\r\n * see plans/sparse-virtual-texture.md, phase 2.\r\n */\r\n markFromDepth(ctx: DrawContext, linearDepth: Texture2D) {\r\n this.sync();\r\n const device = getDevice();\r\n const camera = ctx.camera;\r\n const material = this._terrain.material!;\r\n if (!this._markProgram) {\r\n this._markProgram = this.createMarkProgram();\r\n this._markBindGroup = device.createBindGroup(this._markProgram.bindGroupLayouts[0]);\r\n }\r\n const bindGroup = this._markBindGroup!;\r\n const region = this._terrain.worldRegion;\r\n const heightMap = material.heightMap;\r\n const cell = Math.max((region.z - region.x) / heightMap.width, (region.w - region.y) / heightMap.height);\r\n const cameraPos = camera.getWorldPosition();\r\n this._vt.applyBindings(bindGroup);\r\n // Unfilterable float: the sampler must not filter\r\n bindGroup.setTexture('depthTex', linearDepth, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('heightMap', heightMap, fetchSampler('clamp_linear_nomip'));\r\n bindGroup.setValue('invVP', camera.invViewProjectionMatrix);\r\n bindGroup.setValue('nearFar', new Vector2(camera.getNearPlane(), camera.getFarPlane()));\r\n bindGroup.setValue('depthSize', new Vector2(linearDepth.width, linearDepth.height));\r\n bindGroup.setValue('region', region);\r\n bindGroup.setValue(\r\n 'markParams',\r\n new Vector4(this._terrain.worldMatrix.m13, material.terrainScale.y, cell * TOLERANCE_MIN_CELLS, 0)\r\n );\r\n bindGroup.setValue('cameraPos', cameraPos);\r\n device.setProgram(this._markProgram);\r\n device.setBindGroup(0, bindGroup);\r\n device.compute(Math.ceil(linearDepth.width / 8), Math.ceil(linearDepth.height / 8), 1);\r\n }\r\n fill(_ctx: DrawContext) {\r\n const material = this._terrain.material!;\r\n const numLayers = material.numDetailMaps;\r\n const hexMask = material.hexTilingMask;\r\n const key = `${numLayers}:${hexMask}`;\r\n if (!this._fillProgram || this._fillKey !== key) {\r\n this._fillBindGroup?.dispose();\r\n this._fillProgram?.dispose();\r\n this._fillProgram = this.createFillProgram(numLayers, hexMask);\r\n this._fillBindGroup = getDevice().createBindGroup(this._fillProgram.bindGroupLayouts[0]);\r\n this._fillKey = key;\r\n }\r\n const bindGroup = this._fillBindGroup!;\r\n const region = this._terrain.worldRegion;\r\n const heightMap = material.heightMap;\r\n const splatMap = material.getSplatMap()!;\r\n this._fillParams.setXYZW(\r\n region.z - region.x,\r\n region.w - region.y,\r\n material.terrainScale.y,\r\n material.roughness\r\n );\r\n this._fillSizes.setXYZW(\r\n heightMap.width,\r\n heightMap.height,\r\n splatMap.width,\r\n material.detailMapArray!.width\r\n );\r\n bindGroup.setTexture('splatMap', splatMap, fetchSampler('clamp_linear'));\r\n bindGroup.setTexture('detailAlbedoMap', material.detailMapArray!, fetchSampler('repeat_linear'));\r\n bindGroup.setTexture('detailNormalMap', material.detailNormalMapArray!, fetchSampler('repeat_linear'));\r\n bindGroup.setValue('detailParams', material.detailMapParams.subarray(0, numLayers * 4));\r\n if (hexMask) {\r\n bindGroup.setValue('detailHexParams', material.detailHexParams.subarray(0, numLayers * 4));\r\n }\r\n bindGroup.setTexture(\r\n 'heightMap',\r\n heightMap,\r\n fetchSampler(heightMap.mipLevelCount > 1 ? 'clamp_linear' : 'clamp_linear_nomip')\r\n );\r\n bindGroup.setValue('fillParams', this._fillParams);\r\n bindGroup.setValue('fillSizes', this._fillSizes);\r\n this._vt.fill(this._fillProgram, bindGroup);\r\n }\r\n /**\r\n * Keeps the pages in step with what they are filled from: a new virtual size (region aspect)\r\n * rebuilds the texture, any other change refills every page. Brush edits invalidate their own\r\n * area through ClipmapTerrain.invalidateRuntimeVirtualTexture instead.\r\n */\r\n sync() {\r\n const material = this._terrain.material!;\r\n const [width, height] = this.virtualDimensions();\r\n const l0 = this._vt.levels[0];\r\n if (l0.pagesX * this._vt.pageSize !== width || l0.pagesY * this._vt.pageSize !== height) {\r\n this.rebuild();\r\n return;\r\n }\r\n const region = this._terrain.worldRegion;\r\n const params = this._contentParams;\r\n const current = new Float32Array(params.length);\r\n current.set(material.detailMapParams.subarray(0, 32));\r\n current.set(material.detailHexParams.subarray(0, 32), 32);\r\n current.set(\r\n [\r\n material.hexTilingMask,\r\n material.numDetailMaps,\r\n material.roughness,\r\n region.z - region.x,\r\n region.w - region.y,\r\n material.terrainScale.y\r\n ],\r\n 64\r\n );\r\n let changed = this._contentVersion !== material.contentVersion;\r\n for (let i = 0; i < params.length && !changed; i++) {\r\n changed = params[i] !== current[i];\r\n }\r\n if (changed) {\r\n params.set(current);\r\n this._contentVersion = material.contentVersion;\r\n this._vt.invalidate();\r\n }\r\n }\r\n /** Recreates the virtual texture, e.g. after the options or the terrain aspect changed */\r\n rebuild() {\r\n this._vt.dispose();\r\n this.releasePrograms();\r\n this._contentVersion = -1;\r\n this._vt = this.createVirtualTexture();\r\n const material = this._terrain.material;\r\n if (material) {\r\n material.virtualTexture = this._vt;\r\n }\r\n }\r\n setOptions(options: TerrainVirtualTextureOptions) {\r\n Object.assign(this._options, options);\r\n this.rebuild();\r\n }\r\n private virtualDimensions(): [number, number] {\r\n const size = this._options.virtualSize;\r\n const region = this._terrain.worldRegion;\r\n const sx = Math.max(region.z - region.x, 1e-6);\r\n const sz = Math.max(region.w - region.y, 1e-6);\r\n // The shorter side by the power of two closest to the aspect, at least one page\r\n const ratio = 2 ** Math.round(Math.log2(Math.max(sx, sz) / Math.min(sx, sz)));\r\n const shorter = Math.max(this._options.pageSize, size / ratio);\r\n return sx >= sz ? [size, shorter] : [shorter, size];\r\n }\r\n private createVirtualTexture() {\r\n const [width, height] = this.virtualDimensions();\r\n return new VirtualTexture(getDevice(), {\r\n levels: virtualMipChain(width, height, this._options.pageSize),\r\n pageSize: this._options.pageSize,\r\n border: BORDER,\r\n atlasSize: this._options.atlasSize,\r\n planes: [\r\n { name: 'baseColor', format: 'rgba8unorm' },\r\n { name: 'normalRoughness', format: 'rgba8unorm' }\r\n ],\r\n allocBudget: this._options.allocBudget,\r\n residencyMipBias: true\r\n });\r\n }\r\n private createMarkProgram() {\r\n const vt = this._vt;\r\n return getDevice().buildComputeProgram({\r\n label: 'TerrainVirtualTextureMark',\r\n workgroupSize: [8, 8, 1],\r\n compute(pb) {\r\n vt.declareBindings(this, 0);\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.heightMap = pb.tex2D().uniform(0);\r\n this.invVP = pb.mat4().uniform(0);\r\n this.nearFar = pb.vec2().uniform(0);\r\n this.depthSize = pb.vec2().uniform(0);\r\n this.region = pb.vec4().uniform(0);\r\n // (terrain origin y, height scale, minimum height tolerance, 0)\r\n this.markParams = pb.vec4().uniform(0);\r\n this.cameraPos = pb.vec3().uniform(0);\r\n // (terrain uv, 1) at a pixel whose depth lies on the terrain, z = 0 otherwise\r\n pb.func('terrainUV', [pb.ivec2('p')], function () {\r\n this.$l.d = pb.textureLoad(this.depthTex, this.p, 0).r;\r\n this.$l.nonLinear = ShaderHelper.linearNormalizedToNonLinearDepth(this, this.d, this.nearFar);\r\n this.$l.screenUV = pb.div(pb.add(pb.vec2(this.p), pb.vec2(0.5)), this.depthSize);\r\n this.$l.clip = pb.vec4(\r\n pb.sub(pb.mul(this.screenUV, 2), pb.vec2(1)),\r\n ShaderHelper.deviceDepthToClipZ(this, pb.clamp(this.nonLinear, 0, 1)),\r\n 1\r\n );\r\n this.$l.w = pb.mul(this.invVP, this.clip);\r\n this.$l.pos = pb.div(this.w.xyz, this.w.w);\r\n this.$l.uv = pb.div(pb.sub(this.pos.xz, this.region.xy), pb.sub(this.region.zw, this.region.xy));\r\n this.$l.h = pb.add(\r\n this.markParams.x,\r\n pb.mul(pb.textureSampleLevel(this.heightMap, this.uv, 0).r, this.markParams.y)\r\n );\r\n this.$l.tolerance = pb.max(\r\n this.markParams.z,\r\n pb.mul(pb.distance(this.pos, this.cameraPos), TOLERANCE_DISTANCE_SCALE)\r\n );\r\n this.$l.onTerrain = pb.and(\r\n pb.and(\r\n pb.lessThan(this.d, 0.9999),\r\n pb.lessThanEqual(pb.abs(pb.sub(this.pos.y, this.h)), this.tolerance)\r\n ),\r\n pb.and(\r\n pb.all(pb.greaterThanEqual(this.uv, pb.vec2(0))),\r\n pb.all(pb.lessThanEqual(this.uv, pb.vec2(1)))\r\n )\r\n );\r\n this.$return(pb.vec3(this.uv, pb.float(this.onTerrain)));\r\n });\r\n // Change of the terrain uv to the next pixel along `step`, forward if that pixel is on\r\n // the terrain, else backward: (duv, 1), or (0, 0, 0) when neither neighbour is\r\n pb.func('axisDelta', [pb.ivec2('p'), pb.ivec2('step'), pb.vec2('uv')], function () {\r\n this.$l.size = pb.ivec2(this.depthSize);\r\n this.$l.f = pb.add(this.p, this.step);\r\n this.$if(\r\n pb.and(pb.lessThan(this.f.x, this.size.x), pb.lessThan(this.f.y, this.size.y)),\r\n function () {\r\n this.$l.nf = this.terrainUV(this.f);\r\n this.$if(pb.notEqual(this.nf.z, 0), function () {\r\n this.$return(pb.vec3(pb.sub(this.nf.xy, this.uv), 1));\r\n });\r\n }\r\n );\r\n this.$l.b = pb.sub(this.p, this.step);\r\n this.$if(pb.and(pb.greaterThanEqual(this.b.x, 0), pb.greaterThanEqual(this.b.y, 0)), function () {\r\n this.$l.nb = this.terrainUV(this.b);\r\n this.$if(pb.notEqual(this.nb.z, 0), function () {\r\n this.$return(pb.vec3(pb.sub(this.uv, this.nb.xy), 1));\r\n });\r\n });\r\n this.$return(pb.vec3(0));\r\n });\r\n pb.main(function () {\r\n this.$l.p = pb.ivec2(this.$builtins.globalInvocationId.xy);\r\n this.$l.size = pb.ivec2(this.depthSize);\r\n this.$if(\r\n pb.or(pb.greaterThanEqual(this.p.x, this.size.x), pb.greaterThanEqual(this.p.y, this.size.y)),\r\n function () {\r\n this.$return();\r\n }\r\n );\r\n this.$l.c = this.terrainUV(this.p);\r\n this.$if(pb.equal(this.c.z, 0), function () {\r\n this.$return();\r\n });\r\n // An axis without a neighbour on the terrain uses the other axis alone, a pixel\r\n // without any is not marked (it resolves to a resident ancestor)\r\n this.$l.ax = this.axisDelta(this.p, pb.ivec2(1, 0), this.c.xy);\r\n this.$l.ay = this.axisDelta(this.p, pb.ivec2(0, 1), this.c.xy);\r\n this.$if(pb.equal(pb.add(this.ax.z, this.ay.z), 0), function () {\r\n this.$return();\r\n });\r\n this.$l.dx = pb.select(this.ay.xy, this.ax.xy, pb.notEqual(this.ax.z, 0));\r\n this.$l.dy = pb.select(this.ax.xy, this.ay.xy, pb.notEqual(this.ay.z, 0));\r\n this.$l.level = pb.uint(pb.floor(vt.levelFromFootprint(this, this.dx, this.dy)));\r\n vt.request(this as PBInsideFunctionScope, this.level as PBShaderExp, this.c.xy as PBShaderExp);\r\n });\r\n }\r\n })!;\r\n }\r\n /**\r\n * The page fill: the same blend as the material's live path (terrain_blend.ts), each texture\r\n * sampled at the LOD of one texel of the page's level, and the height map tangent frame of\r\n * ClipmapTerrainMaterial.calculateTerrainTBN on the same footprint.\r\n */\r\n private createFillProgram(numLayers: number, hexMask: number) {\r\n const vt = this._vt;\r\n return vt.createFillProgram(\r\n `TerrainVirtualTextureFill${numLayers}_${hexMask}`,\r\n (scope) => {\r\n const pb = scope.$builder;\r\n scope.splatMap = pb.tex2DArray().uniform(0);\r\n scope.detailAlbedoMap = pb.tex2DArray().uniform(0);\r\n scope.detailNormalMap = pb.tex2DArray().uniform(0);\r\n scope.detailParams = pb.vec4[numLayers]().uniform(0);\r\n if (hexMask) {\r\n scope.detailHexParams = pb.vec4[numLayers]().uniform(0);\r\n }\r\n scope.heightMap = pb.tex2D().uniform(0);\r\n // (region width, region depth, height scale, material roughness)\r\n scope.fillParams = pb.vec4().uniform(0);\r\n // (height map width, height map height, splat map size, detail map size)\r\n scope.fillSizes = pb.vec4().uniform(0);\r\n },\r\n (scope, level, texel) => {\r\n const pb = scope.$builder;\r\n scope.$l.levelTexels = vt.levelTexels(scope, level);\r\n scope.$l.uv = pb.div(texel, scope.levelTexels);\r\n // Terrain uv covered by one texel of this level\r\n scope.$l.footprint = pb.div(1, pb.min(scope.levelTexels.x, scope.levelTexels.y));\r\n scope.$l.splatLod = pb.max(pb.log2(pb.mul(scope.footprint, scope.fillSizes.z)), 0);\r\n const masks: PBShaderExp[] = [];\r\n for (let i = 0; i < terrainSplatMaskCount(numLayers); i++) {\r\n scope.$l[`mask${i}`] = pb.textureArraySampleLevel(scope.splatMap, scope.uv, i, scope.splatLod);\r\n masks.push(scope[`mask${i}`]);\r\n }\r\n // The uv step to the next texel of the level stands for the screen derivatives: the\r\n // gradients pick the mip the orthographic top view would get (and turn with the hex tiles)\r\n const grad = {\r\n ddx: pb.vec2(pb.div(1, scope.levelTexels.x), 0),\r\n ddy: pb.vec2(0, pb.div(1, scope.levelTexels.y))\r\n };\r\n const hex = hexMask ? { mask: hexMask, params: scope.detailHexParams as PBShaderExp } : null;\r\n scope.$l.albedo = blendTerrainAlbedo(\r\n scope,\r\n numLayers,\r\n masks,\r\n scope.uv,\r\n scope.detailParams,\r\n (s, i, uv, ddx, ddy) => pb.textureArraySampleGrad(s.detailAlbedoMap, uv, i, ddx!, ddy!),\r\n grad,\r\n hex\r\n );\r\n scope.$l.detailNormal = blendTerrainDetailNormal(\r\n scope,\r\n numLayers,\r\n masks,\r\n scope.uv,\r\n scope.detailParams,\r\n (s, i, uv, ddx, ddy) => pb.textureArraySampleGrad(s.detailNormalMap, uv, i, ddx!, ddy!),\r\n grad,\r\n hex\r\n );\r\n scope.$l.roughness = blendTerrainRoughness(\r\n scope,\r\n numLayers,\r\n masks,\r\n scope.detailParams,\r\n scope.fillParams.w\r\n );\r\n // Height map tangent frame, ClipmapTerrainMaterial.calculateTerrainTBN\r\n scope.$l.heightLod = pb.max(\r\n pb.log2(pb.max(pb.mul(scope.footprint, pb.max(scope.fillSizes.x, scope.fillSizes.y)), 0.0001)),\r\n 0\r\n );\r\n scope.$l.offset = pb.mul(\r\n pb.div(pb.vec2(1), scope.fillSizes.xy),\r\n pb.mul(pb.exp2(scope.heightLod), 0.5)\r\n );\r\n const height = (uv: PBShaderExp) => pb.textureSampleLevel(scope.heightMap, uv, scope.heightLod).r;\r\n scope.$l.hL = height(pb.sub(scope.uv, pb.vec2(scope.offset.x, 0)));\r\n scope.$l.hR = height(pb.add(scope.uv, pb.vec2(scope.offset.x, 0)));\r\n scope.$l.hU = height(pb.sub(scope.uv, pb.vec2(0, scope.offset.y)));\r\n scope.$l.hD = height(pb.add(scope.uv, pb.vec2(0, scope.offset.y)));\r\n scope.$l.sampleDist = pb.mul(scope.fillParams.xy, pb.mul(scope.offset, 2));\r\n scope.$l.dHdU = pb.div(pb.mul(pb.sub(scope.hR, scope.hL), scope.fillParams.z), scope.sampleDist.x);\r\n scope.$l.dHdV = pb.div(pb.mul(pb.sub(scope.hD, scope.hU), scope.fillParams.z), scope.sampleDist.y);\r\n scope.$l.t = pb.normalize(pb.vec3(1, scope.dHdU, 0));\r\n scope.$l.b = pb.normalize(pb.vec3(0, scope.dHdV, 1));\r\n scope.$l.n = pb.normalize(pb.cross(scope.b, scope.t));\r\n scope.$l.normal = pb.normalize(pb.mul(pb.mat3(scope.t, scope.b, scope.n), scope.detailNormal));\r\n // PackNormal and LinearToSrgb (VirtualTextureMaterial.usf)\r\n scope.$l.packed = pb.add(pb.mul(scope.normal, 127 / 255), pb.vec3(127 / 255));\r\n scope.$l.srgb = pb.mix(\r\n pb.sub(pb.mul(pb.pow(scope.albedo, pb.vec3(1 / 2.4)), 1.055), pb.vec3(0.055)),\r\n pb.mul(scope.albedo, 12.92),\r\n pb.vec3(pb.lessThanEqual(scope.albedo, pb.vec3(0.0031308)))\r\n );\r\n return [\r\n pb.vec4(pb.clamp(scope.srgb, pb.vec3(0), pb.vec3(1)), 1),\r\n pb.vec4(scope.packed.x, scope.roughness, scope.packed.z, 1)\r\n ];\r\n }\r\n );\r\n }\r\n /** The mark and fill programs bake in the layout of the virtual texture they were built for */\r\n private releasePrograms() {\r\n this._markBindGroup?.dispose();\r\n this._markBindGroup = null;\r\n this._markProgram?.dispose();\r\n this._markProgram = null;\r\n this._fillBindGroup?.dispose();\r\n this._fillBindGroup = null;\r\n this._fillProgram?.dispose();\r\n this._fillProgram = null;\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._vt.dispose();\r\n this.releasePrograms();\r\n }\r\n}\r\n"],"names":["TOLERANCE_DISTANCE_SCALE","TOLERANCE_MIN_CELLS","BORDER","TerrainVirtualTexture","Disposable","_terrain","_options","_vt","_fillProgram","_fillBindGroup","_markProgram","_markBindGroup","_contentParams","_fillParams","_fillSizes","terrain","options","virtualSize","pageSize","atlasSize","allocBudget","getApp","editorMode","_fillKey","_contentVersion","Float32Array","Vector4","createVirtualTexture","virtualTexture","isActive","_ctx","_renderQueue","attached","material","virtualTextureUsed","invalidateWorldRegion","x0","z0","x1","z1","region","worldRegion","sx","z","x","sz","w","y","invalidateRegion","Math","min","max","invalidate","markFromDepth","ctx","linearDepth","sync","device","getDevice","camera","createMarkProgram","createBindGroup","bindGroupLayouts","bindGroup","heightMap","cell","width","height","cameraPos","getWorldPosition","applyBindings","setTexture","fetchSampler","setValue","invViewProjectionMatrix","Vector2","getNearPlane","getFarPlane","worldMatrix","m13","terrainScale","setProgram","setBindGroup","compute","ceil","fill","numLayers","numDetailMaps","hexMask","hexTilingMask","key","dispose","createFillProgram","splatMap","getSplatMap","setXYZW","roughness","detailMapArray","detailNormalMapArray","detailMapParams","subarray","detailHexParams","mipLevelCount","virtualDimensions","l0","levels","pagesX","pagesY","rebuild","params","current","length","set","changed","contentVersion","i","releasePrograms","setOptions","Object","assign","size","ratio","round","log2","shorter","VirtualTexture","virtualMipChain","border","planes","name","format","residencyMipBias","vt","buildComputeProgram","label","workgroupSize","pb","declareBindings","depthTex","tex2D","sampleType","uniform","invVP","mat4","nearFar","vec2","depthSize","vec4","markParams","vec3","func","ivec2","$l","d","textureLoad","p","r","nonLinear","ShaderHelper","linearNormalizedToNonLinearDepth","screenUV","div","add","clip","sub","mul","deviceDepthToClipZ","clamp","pos","xyz","uv","xz","xy","zw","h","textureSampleLevel","tolerance","distance","onTerrain","and","lessThan","lessThanEqual","abs","all","greaterThanEqual","$return","float","f","step","$if","nf","terrainUV","notEqual","b","nb","main","$builtins","globalInvocationId","or","c","equal","ax","axisDelta","ay","dx","select","dy","level","uint","floor","levelFromFootprint","request","scope","$builder","tex2DArray","detailAlbedoMap","detailNormalMap","detailParams","fillParams","fillSizes","texel","levelTexels","footprint","splatLod","masks","terrainSplatMaskCount","textureArraySampleLevel","push","grad","ddx","ddy","hex","mask","albedo","blendTerrainAlbedo","s","textureArraySampleGrad","detailNormal","blendTerrainDetailNormal","blendTerrainRoughness","heightLod","offset","exp2","hL","hR","hU","hD","sampleDist","dHdU","dHdV","t","normalize","n","cross","normal","mat3","packed","srgb","mix","pow","onDispose"],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A queue of items each queued at most once until the queue is taken, without hashing.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* Each item keeps a stamp: the generation of the queue it is waiting in. Queuing an item whose
|
|
6
|
+
* stamp equals the generation of this queue does nothing. Taking the items starts a new
|
|
7
|
+
* generation, so items may queue themselves again while the taken ones are processed, for the
|
|
8
|
+
* next round.
|
|
9
|
+
*
|
|
10
|
+
* Generations come from one counter shared by all queues, so an item moving from the queue of
|
|
11
|
+
* one scene to that of another is never mistaken for already queued. Each kind of queue an item
|
|
12
|
+
* may be in at the same time must keep its stamp in its own field.
|
|
13
|
+
*
|
|
14
|
+
* @internal
|
|
15
|
+
*/ class UpdateQueue {
|
|
16
|
+
/** Starts at 1, since stamps of items never queued are 0 */ static _nextGeneration = 1;
|
|
17
|
+
_generation;
|
|
18
|
+
_items;
|
|
19
|
+
_getStamp;
|
|
20
|
+
_setStamp;
|
|
21
|
+
/**
|
|
22
|
+
* @param getStamp - Reads the stamp of an item, undefined for an item never queued
|
|
23
|
+
* @param setStamp - Writes the stamp of an item
|
|
24
|
+
*/ constructor(getStamp, setStamp){
|
|
25
|
+
this._generation = UpdateQueue._nextGeneration++;
|
|
26
|
+
this._items = [];
|
|
27
|
+
this._getStamp = getStamp;
|
|
28
|
+
this._setStamp = setStamp;
|
|
29
|
+
}
|
|
30
|
+
/** Number of items queued */ get size() {
|
|
31
|
+
return this._items.length;
|
|
32
|
+
}
|
|
33
|
+
/** Queue an item, unless it is queued already */ add(item) {
|
|
34
|
+
if (this._getStamp(item) !== this._generation) {
|
|
35
|
+
this._setStamp(item, this._generation);
|
|
36
|
+
this._items.push(item);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Take the queued items in the order they were queued, leaving the queue empty and ready to
|
|
41
|
+
* queue any item again
|
|
42
|
+
*/ take() {
|
|
43
|
+
const items = this._items;
|
|
44
|
+
this._items = [];
|
|
45
|
+
this._generation = UpdateQueue._nextGeneration++;
|
|
46
|
+
return items;
|
|
47
|
+
}
|
|
48
|
+
/** Drop all queued items */ clear() {
|
|
49
|
+
this.take();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export { UpdateQueue };
|
|
54
|
+
//# sourceMappingURL=update_queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update_queue.js","sources":["../../src/scene/update_queue.ts"],"sourcesContent":["/**\r\n * A queue of items each queued at most once until the queue is taken, without hashing.\r\n *\r\n * @remarks\r\n * Each item keeps a stamp: the generation of the queue it is waiting in. Queuing an item whose\r\n * stamp equals the generation of this queue does nothing. Taking the items starts a new\r\n * generation, so items may queue themselves again while the taken ones are processed, for the\r\n * next round.\r\n *\r\n * Generations come from one counter shared by all queues, so an item moving from the queue of\r\n * one scene to that of another is never mistaken for already queued. Each kind of queue an item\r\n * may be in at the same time must keep its stamp in its own field.\r\n *\r\n * @internal\r\n */\r\nexport class UpdateQueue<T> {\r\n /** Starts at 1, since stamps of items never queued are 0 */\r\n private static _nextGeneration = 1;\r\n private _generation: number;\r\n private _items: T[];\r\n private readonly _getStamp: (item: T) => number | undefined;\r\n private readonly _setStamp: (item: T, stamp: number) => void;\r\n /**\r\n * @param getStamp - Reads the stamp of an item, undefined for an item never queued\r\n * @param setStamp - Writes the stamp of an item\r\n */\r\n constructor(getStamp: (item: T) => number | undefined, setStamp: (item: T, stamp: number) => void) {\r\n this._generation = UpdateQueue._nextGeneration++;\r\n this._items = [];\r\n this._getStamp = getStamp;\r\n this._setStamp = setStamp;\r\n }\r\n /** Number of items queued */\r\n get size() {\r\n return this._items.length;\r\n }\r\n /** Queue an item, unless it is queued already */\r\n add(item: T) {\r\n if (this._getStamp(item) !== this._generation) {\r\n this._setStamp(item, this._generation);\r\n this._items.push(item);\r\n }\r\n }\r\n /**\r\n * Take the queued items in the order they were queued, leaving the queue empty and ready to\r\n * queue any item again\r\n */\r\n take() {\r\n const items = this._items;\r\n this._items = [];\r\n this._generation = UpdateQueue._nextGeneration++;\r\n return items;\r\n }\r\n /** Drop all queued items */\r\n clear() {\r\n this.take();\r\n }\r\n}\r\n"],"names":["UpdateQueue","_nextGeneration","_generation","_items","_getStamp","_setStamp","getStamp","setStamp","size","length","add","item","push","take","items","clear"],"mappings":"AAAA;;;;;;;;;;;;;;AAcC,IACM,MAAMA,WAAAA,CAAAA;iEAEX,OAAeC,eAAAA,GAAkB,CAAE;IAC3BC,WAAoB;IACpBC,MAAY;IACHC,SAA2C;IAC3CC,SAA4C;AAC7D;;;AAGC,MACD,WAAYC,CAAAA,QAAyC,EAAEC,QAA0C,CAAE;AACjG,QAAA,IAAI,CAACL,WAAW,GAAGF,WAAAA,CAAYC,eAAe,EAAA;QAC9C,IAAI,CAACE,MAAM,GAAG,EAAE;QAChB,IAAI,CAACC,SAAS,GAAGE,QAAAA;QACjB,IAAI,CAACD,SAAS,GAAGE,QAAAA;AACnB;kCAEA,IAAIC,IAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAACL,MAAM,CAACM,MAAM;AAC3B;sDAEAC,GAAIC,CAAAA,IAAO,EAAE;QACX,IAAI,IAAI,CAACP,SAAS,CAACO,UAAU,IAAI,CAACT,WAAW,EAAE;AAC7C,YAAA,IAAI,CAACG,SAAS,CAACM,IAAM,EAAA,IAAI,CAACT,WAAW,CAAA;AACrC,YAAA,IAAI,CAACC,MAAM,CAACS,IAAI,CAACD,IAAAA,CAAAA;AACnB;AACF;AACA;;;AAGC,MACDE,IAAO,GAAA;QACL,MAAMC,KAAAA,GAAQ,IAAI,CAACX,MAAM;QACzB,IAAI,CAACA,MAAM,GAAG,EAAE;AAChB,QAAA,IAAI,CAACD,WAAW,GAAGF,WAAAA,CAAYC,eAAe,EAAA;QAC9C,OAAOa,KAAAA;AACT;AACA,iCACAC,KAAQ,GAAA;AACN,QAAA,IAAI,CAACF,IAAI,EAAA;AACX;AACF;;;;"}
|