@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
package/dist/app/inputmgr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inputmgr.js","sources":["../../src/app/inputmgr.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport type { Application } from '../app';\r\n\r\ntype PointerEventData = {\r\n lastClick: boolean;\r\n lastClickX: number;\r\n lastClickY: number;\r\n lastClickTime: number;\r\n lastDown: boolean;\r\n lastDownX: number;\r\n lastDownY: number;\r\n lastDownTime: number;\r\n lastMoveX: number;\r\n lastMoveY: number;\r\n};\r\n\r\ntype PointerEventHandler = (this: HTMLElement, ev: PointerEvent) => any;\r\ntype KeyboardEventHandler = (this: HTMLElement, ev: KeyboardEvent) => any;\r\ntype DragEventHandler = (this: HTMLElement, ev: DragEvent) => any;\r\ntype WheelEventHandler = (this: HTMLElement, ev: WheelEvent) => any;\r\ntype CompositionEventHandler = (this: HTMLElement, ev: CompositionEvent) => any;\r\n\r\n/**\r\n * Input handler middleware type.\r\n *\r\n * Return true to indicate the event has been handled and should not be forwarded\r\n * to the Application's observable event system.\r\n *\r\n * @public\r\n */\r\nexport type InputEventHandler = (ev: Event, type?: string) => boolean;\r\n\r\n/**\r\n * Input manager\r\n *\r\n * Centralizes DOM input event handling for the engine:\r\n * - Subscribes to pointer/keyboard/drag/wheel/composition events on the target canvas element.\r\n * - Normalizes click and double-click detection using distance/time tolerances.\r\n * - Supports a middleware chain (`use`) to intercept and optionally consume events\r\n * before they are dispatched to the Application's observable event map.\r\n * - Manages pointer capture for mouse interactions to ensure consistent up/move delivery.\r\n *\r\n * Lifecycle:\r\n * - Call `start()` to attach all event listeners; `stop()` to remove them.\r\n *\r\n * @public\r\n */\r\nexport class InputManager {\r\n private readonly _app: Application;\r\n private readonly _target: HTMLElement;\r\n private _started: boolean;\r\n private readonly _clickDistTolerance: number;\r\n private readonly _clickTimeTolerance: number;\r\n private readonly _dblclickDistTolerance: number;\r\n private readonly _dblclickTimeTolerance: number;\r\n private readonly _pointerDownHandler: PointerEventHandler;\r\n private readonly _pointerUpHandler: PointerEventHandler;\r\n private readonly _pointerMoveHandler: PointerEventHandler;\r\n private readonly _pointerCancelHandler: PointerEventHandler;\r\n private readonly _contextMenuHandler: PointerEventHandler;\r\n private readonly _keyboardHandler: KeyboardEventHandler;\r\n private readonly _dragHandler: DragEventHandler;\r\n private readonly _wheelHandler: WheelEventHandler;\r\n private readonly _compositionHandler: CompositionEventHandler;\r\n private _enableContextMenu: boolean;\r\n private _captureId: number;\r\n private readonly _middlewares: { handler: InputEventHandler; ctx: unknown }[];\r\n private _lastEventDatas: PointerEventData[];\r\n /**\r\n * Creates an instance of InputManager bound to the given application/canvas.\r\n *\r\n * @param app - The owning Application instance.\r\n */\r\n constructor(app: Application) {\r\n this._app = app;\r\n this._target = app.options.canvas;\r\n this._started = false;\r\n this._clickDistTolerance = 4 * 4;\r\n this._clickTimeTolerance = 400;\r\n this._dblclickDistTolerance = 4 * 4;\r\n this._dblclickTimeTolerance = 400;\r\n this._lastEventDatas = [];\r\n this._enableContextMenu = false;\r\n this._pointerDownHandler = this._getPointerDownHandler();\r\n this._pointerUpHandler = this._getPointerUpHandler();\r\n this._pointerMoveHandler = this._getPointerMoveHander();\r\n this._pointerCancelHandler = this._getPointerCancelHandler();\r\n this._contextMenuHandler = this._getContextMenuHandler();\r\n this._keyboardHandler = this._getKeyboardHandler();\r\n this._dragHandler = this._getDragHandler();\r\n this._wheelHandler = this._getWheelHandler();\r\n this._compositionHandler = this._getCompositionHandler();\r\n this._captureId = -1;\r\n this._middlewares = [];\r\n }\r\n /**\r\n * Begin listening to DOM events on the target element.\r\n *\r\n * Idempotent: additional calls have no effect after the first successful start.\r\n *\r\n * @internal\r\n */\r\n start() {\r\n if (!this._started) {\r\n this._started = true;\r\n this._target.addEventListener('pointerdown', this._pointerDownHandler);\r\n this._target.addEventListener('pointerup', this._pointerUpHandler);\r\n this._target.addEventListener('pointermove', this._pointerMoveHandler);\r\n this._target.addEventListener('pointercancel', this._pointerCancelHandler);\r\n this._target.addEventListener('contextmenu', this._contextMenuHandler);\r\n this._target.addEventListener('keydown', this._keyboardHandler);\r\n this._target.addEventListener('keyup', this._keyboardHandler);\r\n this._target.addEventListener('keypress', this._keyboardHandler);\r\n this._target.addEventListener('drag', this._dragHandler);\r\n this._target.addEventListener('dragenter', this._dragHandler);\r\n this._target.addEventListener('dragleave', this._dragHandler);\r\n this._target.addEventListener('dragstart', this._dragHandler);\r\n this._target.addEventListener('dragend', this._dragHandler);\r\n this._target.addEventListener('dragover', this._dragHandler);\r\n this._target.addEventListener('drop', this._dragHandler);\r\n this._target.addEventListener('wheel', this._wheelHandler);\r\n this._target.addEventListener('compositionstart', this._compositionHandler);\r\n this._target.addEventListener('compositionupdate', this._compositionHandler);\r\n this._target.addEventListener('compositionend', this._compositionHandler);\r\n }\r\n }\r\n /**\r\n * Stop listening to DOM events and clear per-pointer cached state.\r\n *\r\n * Idempotent: does nothing if not started.\r\n *\r\n * @internal\r\n */\r\n stop() {\r\n if (this._started) {\r\n this._started = false;\r\n this._target.removeEventListener('pointerdown', this._pointerDownHandler);\r\n this._target.removeEventListener('pointerup', this._pointerUpHandler);\r\n this._target.removeEventListener('pointermove', this._pointerMoveHandler);\r\n this._target.removeEventListener('pointercancel', this._pointerCancelHandler);\r\n this._target.removeEventListener('contextmenu', this._contextMenuHandler);\r\n this._target.removeEventListener('keydown', this._keyboardHandler);\r\n this._target.removeEventListener('keyup', this._keyboardHandler);\r\n this._target.removeEventListener('keypress', this._keyboardHandler);\r\n this._target.removeEventListener('drag', this._dragHandler);\r\n this._target.removeEventListener('dragenter', this._dragHandler);\r\n this._target.removeEventListener('dragleave', this._dragHandler);\r\n this._target.removeEventListener('dragstart', this._dragHandler);\r\n this._target.removeEventListener('dragend', this._dragHandler);\r\n this._target.removeEventListener('dragover', this._dragHandler);\r\n this._target.removeEventListener('drop', this._dragHandler);\r\n this._target.removeEventListener('wheel', this._wheelHandler);\r\n this._target.removeEventListener('compositionstart', this._compositionHandler);\r\n this._target.removeEventListener('compositionupdate', this._compositionHandler);\r\n this._target.removeEventListener('compositionend', this._compositionHandler);\r\n this._lastEventDatas = [];\r\n }\r\n }\r\n /**\r\n * Register a middleware (interceptor) for input events.\r\n *\r\n * Order matters: middlewares are invoked in the order they were added until one returns true.\r\n * If a middleware returns true, the event is considered handled and will not be dispatched\r\n * to the Application's observers.\r\n *\r\n * @param handler - Middleware function to add.\r\n * @param ctx - `this` object for handler\r\n * @returns The InputManager instance for chaining.\r\n */\r\n use(handler: Nullable<InputEventHandler>, ctx?: unknown) {\r\n if (handler) {\r\n this._middlewares.push({ handler, ctx });\r\n }\r\n return this;\r\n }\r\n /**\r\n * Register a middleware (interceptor) for input events at the first order.\r\n *\r\n * @param handler - Middleware function to add.\r\n * @param ctx - `this` object for handler\r\n * @returns The InputManager instance for chaining.\r\n */\r\n useFirst(handler: Nullable<InputEventHandler>, ctx?: unknown) {\r\n if (handler) {\r\n this._middlewares.unshift({ handler, ctx });\r\n }\r\n return this;\r\n }\r\n /**\r\n * Unregister a previously registered middleware (interceptor) for input events.\r\n *\r\n * Removes the first middleware that matches both the given `handler` and `ctx`.\r\n * If no matching middleware is found, this method is a no-op.\r\n *\r\n * Note: This only removes the specific pair of `(handler, ctx)` previously added\r\n * via `use`. If the same `handler` was registered multiple times with different\r\n * contexts, only the first exact match will be removed.\r\n *\r\n * @param handler - Middleware function to remove.\r\n * @param ctx - `this` object that was associated with the `handler` when it was added.\r\n * @returns The InputManager instance for chaining.\r\n */\r\n unuse(handler: InputEventHandler, ctx?: unknown) {\r\n const index = this._middlewares.findIndex((h) => h.handler === handler && h.ctx === ctx);\r\n if (index >= 0) {\r\n this._middlewares.splice(index, 1);\r\n }\r\n return this;\r\n }\r\n enableSystemContextMenu(enable: boolean) {\r\n this._enableContextMenu = !!enable;\r\n }\r\n /**\r\n * Utility middleware that logs the event type to the console.\r\n *\r\n * Can be used with `use(InputManager.log)` for quick diagnostics.\r\n *\r\n * @param ev - The DOM event being logged.\r\n * @param type - Optional explicit event type; falls back to `ev.type`.\r\n * @returns Always false (does not consume the event).\r\n */\r\n static log(ev: Event, type?: string) {\r\n console.log('Event log:', type ?? ev.type);\r\n return false;\r\n }\r\n private _callMiddlewares(\r\n ev: PointerEvent | WheelEvent | KeyboardEvent | DragEvent | CompositionEvent,\r\n type?: string\r\n ) {\r\n for (const mw of this._middlewares) {\r\n if (mw.handler.call(mw.ctx, ev, type ?? ev.type)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n private _getPointerCancelHandler() {\r\n const that = this;\r\n return function (ev: PointerEvent) {\r\n const eventData = that._getPointerEventData(ev.pointerId);\r\n eventData.lastDown = false;\r\n eventData.lastClick = false;\r\n if (!that._callMiddlewares(ev)) {\r\n that._app.dispatchEvent(ev.type as any, ev);\r\n }\r\n };\r\n }\r\n private _getContextMenuHandler() {\r\n const that = this;\r\n return function (ev: PointerEvent) {\r\n if (!that._enableContextMenu) {\r\n ev.preventDefault();\r\n }\r\n if (!that._callMiddlewares(ev)) {\r\n that._app.dispatchEvent(ev.type as any, ev);\r\n }\r\n };\r\n }\r\n private _getPointerMoveHander() {\r\n const that = this;\r\n return function (ev: PointerEvent) {\r\n const eventData = that._getPointerEventData(ev.pointerId);\r\n eventData.lastMoveX = ev.offsetX;\r\n eventData.lastMoveY = ev.offsetY;\r\n if (!that._callMiddlewares(ev)) {\r\n that._app.dispatchEvent(ev.type as any, ev);\r\n }\r\n };\r\n }\r\n private _getPointerDownHandler() {\r\n const that = this;\r\n return function (ev: PointerEvent) {\r\n if (ev.pointerType === 'mouse') {\r\n that._captureId = ev.pointerId;\r\n that._app.options.canvas.setPointerCapture(ev.pointerId);\r\n }\r\n const eventData = that._getPointerEventData(ev.pointerId);\r\n eventData.lastDown = true;\r\n eventData.lastDownX = ev.offsetX;\r\n eventData.lastDownY = ev.offsetY;\r\n eventData.lastDownTime = Date.now();\r\n that._app.focus();\r\n if (!that._callMiddlewares(ev)) {\r\n that._app.dispatchEvent(ev.type as any, ev);\r\n }\r\n };\r\n }\r\n private _getPointerUpHandler() {\r\n const that = this;\r\n return function (ev: PointerEvent) {\r\n const eventData = that._getPointerEventData(ev.pointerId);\r\n let emitClickEvent = false;\r\n let emitDoubleClickEvent = false;\r\n const now = Date.now();\r\n if (eventData.lastDown) {\r\n if (now <= eventData.lastDownTime + that._clickTimeTolerance) {\r\n let deltaX = ev.offsetX - eventData.lastDownX;\r\n let deltaY = ev.offsetY - eventData.lastDownY;\r\n if (deltaX * deltaX + deltaY * deltaY <= that._clickDistTolerance) {\r\n emitClickEvent = true;\r\n if (eventData.lastClick && now <= eventData.lastClickTime + that._dblclickTimeTolerance) {\r\n deltaX = ev.offsetX - eventData.lastClickX;\r\n deltaY = ev.offsetY - eventData.lastClickY;\r\n if (deltaX * deltaX + deltaY * deltaY <= that._dblclickDistTolerance) {\r\n emitDoubleClickEvent = true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n eventData.lastDown = false;\r\n eventData.lastMoveX = ev.offsetX;\r\n eventData.lastMoveY = ev.offsetY;\r\n if (!that._callMiddlewares(ev)) {\r\n that._app.dispatchEvent(ev.type as any, ev);\r\n }\r\n if (emitClickEvent) {\r\n if (!that._callMiddlewares(ev, 'click')) {\r\n that._app.dispatchEvent('click', ev);\r\n }\r\n if (emitDoubleClickEvent) {\r\n if (!that._callMiddlewares(ev, 'dblclick')) {\r\n that._app.dispatchEvent('dblclick', ev);\r\n }\r\n eventData.lastClick = false;\r\n } else {\r\n eventData.lastClick = true;\r\n eventData.lastClickX = ev.offsetX;\r\n eventData.lastClickY = ev.offsetY;\r\n eventData.lastClickTime = now;\r\n }\r\n }\r\n if (ev.pointerType === 'mouse' && that._captureId === ev.pointerId) {\r\n that._app.options.canvas.releasePointerCapture(ev.pointerId);\r\n that._captureId = -1;\r\n }\r\n };\r\n }\r\n private _getKeyboardHandler() {\r\n const that = this;\r\n return function (ev: KeyboardEvent) {\r\n if (!that._callMiddlewares(ev)) {\r\n that._app.dispatchEvent(ev.type as any, ev);\r\n }\r\n };\r\n }\r\n private _getDragHandler() {\r\n const that = this;\r\n return function (ev: DragEvent) {\r\n if (!that._callMiddlewares(ev)) {\r\n that._app.dispatchEvent(ev.type as any, ev);\r\n }\r\n };\r\n }\r\n private _getWheelHandler() {\r\n const that = this;\r\n return function (ev: WheelEvent) {\r\n if (!that._callMiddlewares(ev)) {\r\n that._app.dispatchEvent(ev.type as any);\r\n }\r\n };\r\n }\r\n private _getCompositionHandler() {\r\n const that = this;\r\n return function (ev: CompositionEvent) {\r\n if (!that._callMiddlewares(ev)) {\r\n that._app.dispatchEvent(ev.type as any);\r\n }\r\n };\r\n }\r\n private _getPointerEventData(pointerId: number) {\r\n return (\r\n this._lastEventDatas[pointerId] ??\r\n (this._lastEventDatas[pointerId] = {\r\n lastClick: false,\r\n lastClickX: 0,\r\n lastClickY: 0,\r\n lastClickTime: 0,\r\n lastDown: false,\r\n lastDownX: 0,\r\n lastDownY: 0,\r\n lastDownTime: 0,\r\n lastMoveX: 0,\r\n lastMoveY: 0\r\n })\r\n );\r\n }\r\n}\r\n"],"names":["InputManager","_app","_target","_started","_clickDistTolerance","_clickTimeTolerance","_dblclickDistTolerance","_dblclickTimeTolerance","_pointerDownHandler","_pointerUpHandler","_pointerMoveHandler","_pointerCancelHandler","_contextMenuHandler","_keyboardHandler","_dragHandler","_wheelHandler","_compositionHandler","_enableContextMenu","_captureId","_middlewares","_lastEventDatas","app","options","canvas","_getPointerDownHandler","_getPointerUpHandler","_getPointerMoveHander","_getPointerCancelHandler","_getContextMenuHandler","_getKeyboardHandler","_getDragHandler","_getWheelHandler","_getCompositionHandler","start","addEventListener","stop","removeEventListener","use","handler","ctx","push","useFirst","unshift","unuse","index","findIndex","h","splice","enableSystemContextMenu","enable","log","ev","type","console","_callMiddlewares","mw","call","that","eventData","_getPointerEventData","pointerId","lastDown","lastClick","dispatchEvent","preventDefault","lastMoveX","offsetX","lastMoveY","offsetY","pointerType","setPointerCapture","lastDownX","lastDownY","lastDownTime","Date","now","focus","emitClickEvent","emitDoubleClickEvent","deltaX","deltaY","lastClickTime","lastClickX","lastClickY","releasePointerCapture"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"inputmgr.js","sources":["../../src/app/inputmgr.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport type { Application } from '../app';\r\nimport { GamepadState } from './gamepad';\r\nimport type { InputActionMap, InputDeviceKind, InputStateSource } from './inputactions';\r\n\r\ntype PointerEventData = {\r\n lastClick: boolean;\r\n lastClickX: number;\r\n lastClickY: number;\r\n lastClickTime: number;\r\n lastDown: boolean;\r\n lastDownX: number;\r\n lastDownY: number;\r\n lastDownTime: number;\r\n lastMoveX: number;\r\n lastMoveY: number;\r\n};\r\n\r\ntype PointerEventHandler = (this: HTMLElement, ev: PointerEvent) => any;\r\ntype KeyboardEventHandler = (this: HTMLElement, ev: KeyboardEvent) => any;\r\ntype DragEventHandler = (this: HTMLElement, ev: DragEvent) => any;\r\ntype WheelEventHandler = (this: HTMLElement, ev: WheelEvent) => any;\r\ntype CompositionEventHandler = (this: HTMLElement, ev: CompositionEvent) => any;\r\n\r\n/**\r\n * Maps every event type delivered to input middlewares to its DOM event class.\r\n *\r\n * `click` and `dblclick` are synthesized by InputManager from pointer events,\r\n * so they carry the originating `PointerEvent`.\r\n *\r\n * @public\r\n */\r\nexport interface InputEventMap {\r\n pointerdown: PointerEvent;\r\n pointerup: PointerEvent;\r\n pointermove: PointerEvent;\r\n pointercancel: PointerEvent;\r\n contextmenu: PointerEvent;\r\n click: PointerEvent;\r\n dblclick: PointerEvent;\r\n keydown: KeyboardEvent;\r\n keyup: KeyboardEvent;\r\n keypress: KeyboardEvent;\r\n drag: DragEvent;\r\n dragenter: DragEvent;\r\n dragleave: DragEvent;\r\n dragstart: DragEvent;\r\n dragend: DragEvent;\r\n dragover: DragEvent;\r\n drop: DragEvent;\r\n wheel: WheelEvent;\r\n compositionstart: CompositionEvent;\r\n compositionupdate: CompositionEvent;\r\n compositionend: CompositionEvent;\r\n}\r\n\r\n/**\r\n * Argument list of an input middleware: a union of `[event, type]` pairs, one per\r\n * entry of {@link InputEventMap}. Checking `type` narrows `ev` to the matching event class.\r\n *\r\n * @public\r\n */\r\nexport type InputEventArgs = {\r\n [K in keyof InputEventMap]: [ev: InputEventMap[K], type: K];\r\n}[keyof InputEventMap];\r\n\r\n/**\r\n * Input handler middleware type.\r\n *\r\n * Return true to indicate the event has been handled and should not be forwarded\r\n * to the Application's observable event system.\r\n *\r\n * @example\r\n * ```ts\r\n * getInput().use((ev, type) => {\r\n * if (type === 'pointerdown') {\r\n * console.log(ev.button, ev.offsetX); // ev is PointerEvent here\r\n * }\r\n * return false;\r\n * });\r\n * ```\r\n *\r\n * @public\r\n */\r\nexport type InputEventHandler = (...args: InputEventArgs) => boolean;\r\n\r\n/**\r\n * Single-argument form of {@link InputEventHandler}, for middlewares that only inspect the event.\r\n *\r\n * A separate type is needed because a one-parameter function is not assignable to a\r\n * rest parameter typed as a union of two-element tuples.\r\n *\r\n * @public\r\n */\r\nexport type InputEventHandlerSimple = (ev: InputEventMap[keyof InputEventMap]) => boolean;\r\n\r\n/**\r\n * Input manager\r\n *\r\n * Centralizes DOM input event handling for the engine:\r\n * - Subscribes to pointer/keyboard/drag/wheel/composition events on the target canvas element.\r\n * - Normalizes click and double-click detection using distance/time tolerances.\r\n * - Supports a middleware chain (`use`) to intercept and optionally consume events\r\n * before they are dispatched to the Application's observable event map.\r\n * - Manages pointer capture for mouse interactions to ensure consistent up/move delivery.\r\n * - Tracks which keys and mouse buttons are held, polls gamepads, and evaluates\r\n * {@link InputActionMap}s, once per frame at the start of `Application.frame()`.\r\n *\r\n * Held state and middlewares: a key or button only counts as held if no\r\n * middleware consumed its down event, so a UI that consumes keyboard input while\r\n * focused keeps it from gameplay. Releases are always recorded. When the canvas\r\n * or the window loses focus, every held key is released and a synthesized `keyup`\r\n * is sent through the middlewares, so nothing stays stuck.\r\n *\r\n * Lifecycle:\r\n * - Call `start()` to attach all event listeners; `stop()` to remove them.\r\n *\r\n * @public\r\n */\r\nexport class InputManager implements InputStateSource {\r\n private readonly _app: Application;\r\n private readonly _target: HTMLElement;\r\n private _started: boolean;\r\n private readonly _clickDistTolerance: number;\r\n private readonly _clickTimeTolerance: number;\r\n private readonly _dblclickDistTolerance: number;\r\n private readonly _dblclickTimeTolerance: number;\r\n private readonly _pointerDownHandler: PointerEventHandler;\r\n private readonly _pointerUpHandler: PointerEventHandler;\r\n private readonly _pointerMoveHandler: PointerEventHandler;\r\n private readonly _pointerCancelHandler: PointerEventHandler;\r\n private readonly _contextMenuHandler: PointerEventHandler;\r\n private readonly _keyboardHandler: KeyboardEventHandler;\r\n private readonly _dragHandler: DragEventHandler;\r\n private readonly _wheelHandler: WheelEventHandler;\r\n private readonly _compositionHandler: CompositionEventHandler;\r\n private _enableContextMenu: boolean;\r\n private _captureId: number;\r\n private readonly _middlewares: { handler: InputEventHandler; ctx: unknown }[];\r\n private _lastEventDatas: PointerEventData[];\r\n private readonly _blurHandler: () => void;\r\n private readonly _visibilityHandler: () => void;\r\n private readonly _keysDown: Map<string, KeyboardEvent>;\r\n private _keysPressedPending: Set<string>;\r\n private _keysReleasedPending: Set<string>;\r\n private _keysPressed: Set<string>;\r\n private _keysReleased: Set<string>;\r\n /** Held buttons per pointer id, as a mask of `1 << MouseEvent.button` */\r\n private readonly _pointerButtons: Map<number, number>;\r\n private _buttons: number;\r\n private _buttonsPressedPending: number;\r\n private _buttonsReleasedPending: number;\r\n private _buttonsPressed: number;\r\n private _buttonsReleased: number;\r\n private readonly _pointerDeltaPending: { x: number; y: number };\r\n private readonly _pointerDelta: { x: number; y: number };\r\n private readonly _wheelDeltaPending: { x: number; y: number };\r\n private readonly _wheelDelta: { x: number; y: number };\r\n private readonly _gamepads: GamepadState[];\r\n private _activeGamepad: Nullable<GamepadState>;\r\n private _lastDevice: Nullable<InputDeviceKind>;\r\n private readonly _actionMaps: InputActionMap<any>[];\r\n /**\r\n * Creates an instance of InputManager bound to the given application/canvas.\r\n *\r\n * @param app - The owning Application instance.\r\n */\r\n constructor(app: Application) {\r\n this._app = app;\r\n this._target = app.options.canvas;\r\n this._started = false;\r\n this._clickDistTolerance = 4 * 4;\r\n this._clickTimeTolerance = 400;\r\n this._dblclickDistTolerance = 4 * 4;\r\n this._dblclickTimeTolerance = 400;\r\n this._lastEventDatas = [];\r\n this._enableContextMenu = false;\r\n this._pointerDownHandler = this._getPointerDownHandler();\r\n this._pointerUpHandler = this._getPointerUpHandler();\r\n this._pointerMoveHandler = this._getPointerMoveHander();\r\n this._pointerCancelHandler = this._getPointerCancelHandler();\r\n this._contextMenuHandler = this._getContextMenuHandler();\r\n this._keyboardHandler = this._getKeyboardHandler();\r\n this._dragHandler = this._getDragHandler();\r\n this._wheelHandler = this._getWheelHandler();\r\n this._compositionHandler = this._getCompositionHandler();\r\n this._captureId = -1;\r\n this._middlewares = [];\r\n this._blurHandler = () => this._releaseAll();\r\n this._visibilityHandler = () => {\r\n if (document.visibilityState === 'hidden') {\r\n this._releaseAll();\r\n }\r\n };\r\n this._keysDown = new Map();\r\n this._keysPressedPending = new Set();\r\n this._keysReleasedPending = new Set();\r\n this._keysPressed = new Set();\r\n this._keysReleased = new Set();\r\n this._pointerButtons = new Map();\r\n this._buttons = 0;\r\n this._buttonsPressedPending = 0;\r\n this._buttonsReleasedPending = 0;\r\n this._buttonsPressed = 0;\r\n this._buttonsReleased = 0;\r\n this._pointerDeltaPending = { x: 0, y: 0 };\r\n this._pointerDelta = { x: 0, y: 0 };\r\n this._wheelDeltaPending = { x: 0, y: 0 };\r\n this._wheelDelta = { x: 0, y: 0 };\r\n this._gamepads = [];\r\n this._activeGamepad = null;\r\n this._lastDevice = null;\r\n this._actionMaps = [];\r\n }\r\n /**\r\n * Begin listening to DOM events on the target element.\r\n *\r\n * Idempotent: additional calls have no effect after the first successful start.\r\n *\r\n * @internal\r\n */\r\n start() {\r\n if (!this._started) {\r\n this._started = true;\r\n this._target.addEventListener('pointerdown', this._pointerDownHandler);\r\n this._target.addEventListener('pointerup', this._pointerUpHandler);\r\n this._target.addEventListener('pointermove', this._pointerMoveHandler);\r\n this._target.addEventListener('pointercancel', this._pointerCancelHandler);\r\n this._target.addEventListener('contextmenu', this._contextMenuHandler);\r\n this._target.addEventListener('keydown', this._keyboardHandler);\r\n this._target.addEventListener('keyup', this._keyboardHandler);\r\n this._target.addEventListener('keypress', this._keyboardHandler);\r\n this._target.addEventListener('drag', this._dragHandler);\r\n this._target.addEventListener('dragenter', this._dragHandler);\r\n this._target.addEventListener('dragleave', this._dragHandler);\r\n this._target.addEventListener('dragstart', this._dragHandler);\r\n this._target.addEventListener('dragend', this._dragHandler);\r\n this._target.addEventListener('dragover', this._dragHandler);\r\n this._target.addEventListener('drop', this._dragHandler);\r\n this._target.addEventListener('wheel', this._wheelHandler);\r\n this._target.addEventListener('compositionstart', this._compositionHandler);\r\n this._target.addEventListener('compositionupdate', this._compositionHandler);\r\n this._target.addEventListener('compositionend', this._compositionHandler);\r\n this._target.addEventListener('blur', this._blurHandler);\r\n window.addEventListener('blur', this._blurHandler);\r\n document.addEventListener('visibilitychange', this._visibilityHandler);\r\n }\r\n }\r\n /**\r\n * Stop listening to DOM events and clear per-pointer cached state.\r\n *\r\n * Idempotent: does nothing if not started.\r\n *\r\n * @internal\r\n */\r\n stop() {\r\n if (this._started) {\r\n this._started = false;\r\n this._target.removeEventListener('pointerdown', this._pointerDownHandler);\r\n this._target.removeEventListener('pointerup', this._pointerUpHandler);\r\n this._target.removeEventListener('pointermove', this._pointerMoveHandler);\r\n this._target.removeEventListener('pointercancel', this._pointerCancelHandler);\r\n this._target.removeEventListener('contextmenu', this._contextMenuHandler);\r\n this._target.removeEventListener('keydown', this._keyboardHandler);\r\n this._target.removeEventListener('keyup', this._keyboardHandler);\r\n this._target.removeEventListener('keypress', this._keyboardHandler);\r\n this._target.removeEventListener('drag', this._dragHandler);\r\n this._target.removeEventListener('dragenter', this._dragHandler);\r\n this._target.removeEventListener('dragleave', this._dragHandler);\r\n this._target.removeEventListener('dragstart', this._dragHandler);\r\n this._target.removeEventListener('dragend', this._dragHandler);\r\n this._target.removeEventListener('dragover', this._dragHandler);\r\n this._target.removeEventListener('drop', this._dragHandler);\r\n this._target.removeEventListener('wheel', this._wheelHandler);\r\n this._target.removeEventListener('compositionstart', this._compositionHandler);\r\n this._target.removeEventListener('compositionupdate', this._compositionHandler);\r\n this._target.removeEventListener('compositionend', this._compositionHandler);\r\n this._target.removeEventListener('blur', this._blurHandler);\r\n window.removeEventListener('blur', this._blurHandler);\r\n document.removeEventListener('visibilitychange', this._visibilityHandler);\r\n this._releaseAll();\r\n this._lastEventDatas = [];\r\n }\r\n }\r\n /**\r\n * Whether a key is held, by `KeyboardEvent.code` (e.g. `'KeyW'`, `'Space'`).\r\n *\r\n * @param code - Key code.\r\n */\r\n isKeyDown(code: string) {\r\n return this._keysDown.has(code);\r\n }\r\n /**\r\n * Whether a key went down during the last frame. True for a tap that went\r\n * down and up between two frames, even though `isKeyDown` is false.\r\n *\r\n * @param code - Key code.\r\n */\r\n keyPressed(code: string) {\r\n return this._keysPressed.has(code);\r\n }\r\n /**\r\n * Whether a key went up during the last frame.\r\n *\r\n * @param code - Key code.\r\n */\r\n keyReleased(code: string) {\r\n return this._keysReleased.has(code);\r\n }\r\n /**\r\n * Whether a mouse button is held, by `MouseEvent.button` (0 left, 1 middle,\r\n * 2 right). A touch or pen contact counts as button 0.\r\n *\r\n * @param button - Button index.\r\n */\r\n isMouseDown(button: number) {\r\n return !!(this._buttons & (1 << button));\r\n }\r\n /**\r\n * Whether a mouse button went down during the last frame.\r\n *\r\n * @param button - Button index.\r\n */\r\n mousePressed(button: number) {\r\n return !!(this._buttonsPressed & (1 << button));\r\n }\r\n /**\r\n * Whether a mouse button went up during the last frame.\r\n *\r\n * @param button - Button index.\r\n */\r\n mouseReleased(button: number) {\r\n return !!(this._buttonsReleased & (1 << button));\r\n }\r\n /**\r\n * Pointer movement during the last frame in CSS pixels, +y down. Keeps\r\n * reporting movement while the pointer is locked.\r\n */\r\n get pointerDelta(): Readonly<{ x: number; y: number }> {\r\n return this._pointerDelta;\r\n }\r\n /** Wheel movement during the last frame in pixels. */\r\n get wheelDelta(): Readonly<{ x: number; y: number }> {\r\n return this._wheelDelta;\r\n }\r\n /**\r\n * The active gamepad: the one operated most recently, or the first connected\r\n * one. Null if no gamepad with the standard layout has been used yet - browsers\r\n * only expose a gamepad after one of its buttons has been pressed.\r\n */\r\n get gamepad(): Nullable<GamepadState> {\r\n return this._activeGamepad;\r\n }\r\n /** All connected gamepads with the standard layout. */\r\n get gamepads(): GamepadState[] {\r\n return this._gamepads.filter((pad) => pad?.connected);\r\n }\r\n /**\r\n * Device that was operated most recently, e.g. to show matching button\r\n * prompts; null before any input.\r\n */\r\n get lastDevice() {\r\n return this._lastDevice;\r\n }\r\n /**\r\n * Adds an action map on top of the existing ones. Its values are evaluated\r\n * from the next frame on.\r\n *\r\n * @param map - Map to add.\r\n * @returns The InputManager instance for chaining.\r\n */\r\n addActionMap(map: InputActionMap<any>) {\r\n if (!this._actionMaps.includes(map)) {\r\n this._actionMaps.push(map);\r\n }\r\n return this;\r\n }\r\n /**\r\n * Removes an action map; it then reads as idle.\r\n *\r\n * @param map - Map to remove.\r\n * @returns The InputManager instance for chaining.\r\n */\r\n removeActionMap(map: InputActionMap<any>) {\r\n const index = this._actionMaps.indexOf(map);\r\n if (index >= 0) {\r\n this._actionMaps.splice(index, 1);\r\n map._evaluate(null, 0);\r\n }\r\n return this;\r\n }\r\n /** Action maps, from bottom to top. */\r\n get actionMaps(): readonly InputActionMap<any>[] {\r\n return this._actionMaps;\r\n }\r\n /** Whether the pointer is locked to the canvas. */\r\n get pointerLocked() {\r\n return document.pointerLockElement === this._target;\r\n }\r\n /**\r\n * Locks the pointer to the canvas and hides it, for mouse look. Must be called\r\n * from a user gesture such as a click. Asks for raw, unaccelerated movement\r\n * where supported.\r\n */\r\n async requestPointerLock() {\r\n const target = this._target as HTMLElement & {\r\n requestPointerLock(options?: { unadjustedMovement?: boolean }): Promise<void> | void;\r\n };\r\n try {\r\n await target.requestPointerLock({ unadjustedMovement: true });\r\n } catch {\r\n await target.requestPointerLock();\r\n }\r\n }\r\n /** Releases a pointer lock taken with {@link InputManager.requestPointerLock}. */\r\n exitPointerLock() {\r\n if (this.pointerLocked) {\r\n document.exitPointerLock();\r\n }\r\n }\r\n /**\r\n * Starts a new input frame: publishes the edges, movement and wheel collected\r\n * since the last call, polls gamepads and evaluates the action maps. Called by\r\n * `Application.frame()` before `tick`.\r\n *\r\n * @param deltaTime - Frame time in seconds, used by `perSecond` bindings.\r\n * @internal\r\n */\r\n _beginFrame(deltaTime: number) {\r\n [this._keysPressed, this._keysPressedPending] = [this._keysPressedPending, this._keysPressed];\r\n [this._keysReleased, this._keysReleasedPending] = [this._keysReleasedPending, this._keysReleased];\r\n this._keysPressedPending.clear();\r\n this._keysReleasedPending.clear();\r\n this._buttonsPressed = this._buttonsPressedPending;\r\n this._buttonsReleased = this._buttonsReleasedPending;\r\n this._buttonsPressedPending = 0;\r\n this._buttonsReleasedPending = 0;\r\n this._pointerDelta.x = this._pointerDeltaPending.x;\r\n this._pointerDelta.y = this._pointerDeltaPending.y;\r\n this._pointerDeltaPending.x = this._pointerDeltaPending.y = 0;\r\n this._wheelDelta.x = this._wheelDeltaPending.x;\r\n this._wheelDelta.y = this._wheelDeltaPending.y;\r\n this._wheelDeltaPending.x = this._wheelDeltaPending.y = 0;\r\n if (this._keysPressed.size > 0 || this._buttonsPressed || this._wheelDelta.x || this._wheelDelta.y) {\r\n this._lastDevice = 'keyboardMouse';\r\n }\r\n this._pollGamepads();\r\n let blocked = false;\r\n for (let i = this._actionMaps.length - 1; i >= 0; i--) {\r\n const map = this._actionMaps[i];\r\n map._evaluate(blocked ? null : this, deltaTime);\r\n blocked ||= map.enabled && map.blocking;\r\n }\r\n }\r\n private _pollGamepads() {\r\n const pads = typeof navigator !== 'undefined' && navigator.getGamepads ? navigator.getGamepads() : [];\r\n for (let i = 0; i < Math.max(pads.length, this._gamepads.length); i++) {\r\n const raw = pads[i];\r\n const pad = raw && raw.mapping === 'standard' ? raw : null;\r\n if (!pad && !this._gamepads[i]) {\r\n continue;\r\n }\r\n const state = (this._gamepads[i] ??= new GamepadState(i));\r\n state._update(pad);\r\n if (state.connected && state.active) {\r\n this._activeGamepad = state;\r\n this._lastDevice = 'gamepad';\r\n }\r\n }\r\n if (!this._activeGamepad?.connected) {\r\n this._activeGamepad = this._gamepads.find((pad) => pad?.connected) ?? null;\r\n }\r\n }\r\n private _releaseAll() {\r\n for (const ev of [...this._keysDown.values()]) {\r\n const up = new KeyboardEvent('keyup', { code: ev.code, key: ev.key, location: ev.location });\r\n this._keyboardHandler.call(this._target, up);\r\n }\r\n for (const pointerId of [...this._pointerButtons.keys()]) {\r\n this._setPointerButtons(pointerId, 0, false);\r\n }\r\n for (const pad of this._gamepads) {\r\n pad?._reset();\r\n }\r\n }\r\n private _setPointerButtons(pointerId: number, mask: number, consumed: boolean) {\r\n const old = this._pointerButtons.get(pointerId) ?? 0;\r\n // A press consumed by a middleware is not recorded; a release always is\r\n const next = (old & mask) | (consumed ? 0 : mask & ~old);\r\n if (next) {\r\n this._pointerButtons.set(pointerId, next);\r\n } else {\r\n this._pointerButtons.delete(pointerId);\r\n }\r\n let buttons = 0;\r\n for (const m of this._pointerButtons.values()) {\r\n buttons |= m;\r\n }\r\n this._buttonsPressedPending |= buttons & ~this._buttons;\r\n this._buttonsReleasedPending |= this._buttons & ~buttons;\r\n this._buttons = buttons;\r\n }\r\n private _updatePointerState(ev: PointerEvent, consumed: boolean) {\r\n // PointerEvent.buttons has right and middle swapped relative to\r\n // MouseEvent.button; convert to a mask of 1 << button\r\n const b = ev.type === 'pointerup' || ev.type === 'pointercancel' ? 0 : ev.buttons;\r\n const mask = (b & 1) | ((b & 4) >> 1) | ((b & 2) << 1) | (b & 24);\r\n this._setPointerButtons(ev.pointerId, mask, consumed);\r\n }\r\n /**\r\n * Register a middleware (interceptor) for input events.\r\n *\r\n * Order matters: middlewares are invoked in the order they were added until one returns true.\r\n * If a middleware returns true, the event is considered handled and will not be dispatched\r\n * to the Application's observers.\r\n *\r\n * @param handler - Middleware function to add.\r\n * @param ctx - `this` object for handler\r\n * @returns The InputManager instance for chaining.\r\n */\r\n use(handler: Nullable<InputEventHandler>, ctx?: unknown): this;\r\n use(handler: Nullable<InputEventHandlerSimple>, ctx?: unknown): this;\r\n use(handler: Nullable<InputEventHandler | InputEventHandlerSimple>, ctx?: unknown) {\r\n if (handler) {\r\n this._middlewares.push({ handler: handler as InputEventHandler, ctx });\r\n }\r\n return this;\r\n }\r\n /**\r\n * Register a middleware (interceptor) for input events at the first order.\r\n *\r\n * @param handler - Middleware function to add.\r\n * @param ctx - `this` object for handler\r\n * @returns The InputManager instance for chaining.\r\n */\r\n useFirst(handler: Nullable<InputEventHandler>, ctx?: unknown): this;\r\n useFirst(handler: Nullable<InputEventHandlerSimple>, ctx?: unknown): this;\r\n useFirst(handler: Nullable<InputEventHandler | InputEventHandlerSimple>, ctx?: unknown) {\r\n if (handler) {\r\n this._middlewares.unshift({ handler: handler as InputEventHandler, ctx });\r\n }\r\n return this;\r\n }\r\n /**\r\n * Unregister a previously registered middleware (interceptor) for input events.\r\n *\r\n * Removes the first middleware that matches both the given `handler` and `ctx`.\r\n * If no matching middleware is found, this method is a no-op.\r\n *\r\n * Note: This only removes the specific pair of `(handler, ctx)` previously added\r\n * via `use`. If the same `handler` was registered multiple times with different\r\n * contexts, only the first exact match will be removed.\r\n *\r\n * @param handler - Middleware function to remove.\r\n * @param ctx - `this` object that was associated with the `handler` when it was added.\r\n * @returns The InputManager instance for chaining.\r\n */\r\n unuse(handler: InputEventHandler | InputEventHandlerSimple, ctx?: unknown) {\r\n const index = this._middlewares.findIndex((h) => h.handler === handler && h.ctx === ctx);\r\n if (index >= 0) {\r\n this._middlewares.splice(index, 1);\r\n }\r\n return this;\r\n }\r\n enableSystemContextMenu(enable: boolean) {\r\n this._enableContextMenu = !!enable;\r\n }\r\n /**\r\n * Utility middleware that logs the event type to the console.\r\n *\r\n * Can be used with `use(InputManager.log)` for quick diagnostics.\r\n *\r\n * @param ev - The DOM event being logged.\r\n * @param type - Optional explicit event type; falls back to `ev.type`.\r\n * @returns Always false (does not consume the event).\r\n */\r\n static log(ev: Event, type?: string) {\r\n console.log('Event log:', type ?? ev.type);\r\n return false;\r\n }\r\n private _callMiddlewares(\r\n ev: PointerEvent | WheelEvent | KeyboardEvent | DragEvent | CompositionEvent,\r\n type?: string\r\n ) {\r\n const args = [ev, type ?? ev.type] as InputEventArgs;\r\n for (const mw of this._middlewares) {\r\n if (mw.handler.call(mw.ctx, ...args)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n private _getPointerCancelHandler() {\r\n const that = this;\r\n return function (ev: PointerEvent) {\r\n const eventData = that._getPointerEventData(ev.pointerId);\r\n eventData.lastDown = false;\r\n eventData.lastClick = false;\r\n if (!that._callMiddlewares(ev)) {\r\n that._app.dispatchEvent(ev.type as any, ev);\r\n }\r\n that._updatePointerState(ev, false);\r\n };\r\n }\r\n private _getContextMenuHandler() {\r\n const that = this;\r\n return function (ev: PointerEvent) {\r\n if (!that._enableContextMenu) {\r\n ev.preventDefault();\r\n }\r\n if (!that._callMiddlewares(ev)) {\r\n that._app.dispatchEvent(ev.type as any, ev);\r\n }\r\n };\r\n }\r\n private _getPointerMoveHander() {\r\n const that = this;\r\n return function (ev: PointerEvent) {\r\n const eventData = that._getPointerEventData(ev.pointerId);\r\n eventData.lastMoveX = ev.offsetX;\r\n eventData.lastMoveY = ev.offsetY;\r\n const consumed = that._callMiddlewares(ev);\r\n if (!consumed) {\r\n that._app.dispatchEvent(ev.type as any, ev);\r\n that._pointerDeltaPending.x += ev.movementX ?? 0;\r\n that._pointerDeltaPending.y += ev.movementY ?? 0;\r\n }\r\n // A button pressed or released while another is held arrives as pointermove\r\n that._updatePointerState(ev, consumed);\r\n };\r\n }\r\n private _getPointerDownHandler() {\r\n const that = this;\r\n return function (ev: PointerEvent) {\r\n if (ev.pointerType === 'mouse') {\r\n that._captureId = ev.pointerId;\r\n that._app.options.canvas.setPointerCapture(ev.pointerId);\r\n }\r\n const eventData = that._getPointerEventData(ev.pointerId);\r\n eventData.lastDown = true;\r\n eventData.lastDownX = ev.offsetX;\r\n eventData.lastDownY = ev.offsetY;\r\n eventData.lastDownTime = Date.now();\r\n that._app.focus();\r\n const consumed = that._callMiddlewares(ev);\r\n if (!consumed) {\r\n that._app.dispatchEvent(ev.type as any, ev);\r\n }\r\n that._updatePointerState(ev, consumed);\r\n };\r\n }\r\n private _getPointerUpHandler() {\r\n const that = this;\r\n return function (ev: PointerEvent) {\r\n const eventData = that._getPointerEventData(ev.pointerId);\r\n let emitClickEvent = false;\r\n let emitDoubleClickEvent = false;\r\n const now = Date.now();\r\n if (eventData.lastDown) {\r\n if (now <= eventData.lastDownTime + that._clickTimeTolerance) {\r\n let deltaX = ev.offsetX - eventData.lastDownX;\r\n let deltaY = ev.offsetY - eventData.lastDownY;\r\n if (deltaX * deltaX + deltaY * deltaY <= that._clickDistTolerance) {\r\n emitClickEvent = true;\r\n if (eventData.lastClick && now <= eventData.lastClickTime + that._dblclickTimeTolerance) {\r\n deltaX = ev.offsetX - eventData.lastClickX;\r\n deltaY = ev.offsetY - eventData.lastClickY;\r\n if (deltaX * deltaX + deltaY * deltaY <= that._dblclickDistTolerance) {\r\n emitDoubleClickEvent = true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n eventData.lastDown = false;\r\n eventData.lastMoveX = ev.offsetX;\r\n eventData.lastMoveY = ev.offsetY;\r\n if (!that._callMiddlewares(ev)) {\r\n that._app.dispatchEvent(ev.type as any, ev);\r\n }\r\n that._updatePointerState(ev, false);\r\n if (emitClickEvent) {\r\n if (!that._callMiddlewares(ev, 'click')) {\r\n that._app.dispatchEvent('click', ev);\r\n }\r\n if (emitDoubleClickEvent) {\r\n if (!that._callMiddlewares(ev, 'dblclick')) {\r\n that._app.dispatchEvent('dblclick', ev);\r\n }\r\n eventData.lastClick = false;\r\n } else {\r\n eventData.lastClick = true;\r\n eventData.lastClickX = ev.offsetX;\r\n eventData.lastClickY = ev.offsetY;\r\n eventData.lastClickTime = now;\r\n }\r\n }\r\n if (ev.pointerType === 'mouse' && that._captureId === ev.pointerId) {\r\n that._app.options.canvas.releasePointerCapture(ev.pointerId);\r\n that._captureId = -1;\r\n }\r\n };\r\n }\r\n private _getKeyboardHandler() {\r\n const that = this;\r\n return function (ev: KeyboardEvent) {\r\n const consumed = that._callMiddlewares(ev);\r\n if (!consumed) {\r\n that._app.dispatchEvent(ev.type as any, ev);\r\n }\r\n if (ev.code) {\r\n if (ev.type === 'keydown') {\r\n // A press consumed by a middleware is not recorded; a release always is\r\n if (!consumed && !that._keysDown.has(ev.code)) {\r\n that._keysDown.set(ev.code, ev);\r\n that._keysPressedPending.add(ev.code);\r\n }\r\n } else if (ev.type === 'keyup' && that._keysDown.delete(ev.code)) {\r\n that._keysReleasedPending.add(ev.code);\r\n }\r\n }\r\n };\r\n }\r\n private _getDragHandler() {\r\n const that = this;\r\n return function (ev: DragEvent) {\r\n if (!that._callMiddlewares(ev)) {\r\n that._app.dispatchEvent(ev.type as any, ev);\r\n }\r\n };\r\n }\r\n private _getWheelHandler() {\r\n const that = this;\r\n return function (ev: WheelEvent) {\r\n if (!that._callMiddlewares(ev)) {\r\n that._app.dispatchEvent(ev.type as any, ev);\r\n // Normalize line and page modes to pixels\r\n const scale =\r\n ev.deltaMode === WheelEvent.DOM_DELTA_LINE\r\n ? 16\r\n : ev.deltaMode === WheelEvent.DOM_DELTA_PAGE\r\n ? that._target.clientHeight\r\n : 1;\r\n that._wheelDeltaPending.x += ev.deltaX * scale;\r\n that._wheelDeltaPending.y += ev.deltaY * scale;\r\n }\r\n };\r\n }\r\n private _getCompositionHandler() {\r\n const that = this;\r\n return function (ev: CompositionEvent) {\r\n if (!that._callMiddlewares(ev)) {\r\n that._app.dispatchEvent(ev.type as any, ev);\r\n }\r\n };\r\n }\r\n private _getPointerEventData(pointerId: number) {\r\n return (\r\n this._lastEventDatas[pointerId] ??\r\n (this._lastEventDatas[pointerId] = {\r\n lastClick: false,\r\n lastClickX: 0,\r\n lastClickY: 0,\r\n lastClickTime: 0,\r\n lastDown: false,\r\n lastDownX: 0,\r\n lastDownY: 0,\r\n lastDownTime: 0,\r\n lastMoveX: 0,\r\n lastMoveY: 0\r\n })\r\n );\r\n }\r\n}\r\n"],"names":["InputManager","_app","_target","_started","_clickDistTolerance","_clickTimeTolerance","_dblclickDistTolerance","_dblclickTimeTolerance","_pointerDownHandler","_pointerUpHandler","_pointerMoveHandler","_pointerCancelHandler","_contextMenuHandler","_keyboardHandler","_dragHandler","_wheelHandler","_compositionHandler","_enableContextMenu","_captureId","_middlewares","_lastEventDatas","_blurHandler","_visibilityHandler","_keysDown","_keysPressedPending","_keysReleasedPending","_keysPressed","_keysReleased","_buttons","_buttonsPressedPending","_buttonsReleasedPending","_buttonsPressed","_buttonsReleased","_pointerDeltaPending","_pointerDelta","_wheelDeltaPending","_wheelDelta","_gamepads","_activeGamepad","_lastDevice","_actionMaps","app","options","canvas","_getPointerDownHandler","_getPointerUpHandler","_getPointerMoveHander","_getPointerCancelHandler","_getContextMenuHandler","_getKeyboardHandler","_getDragHandler","_getWheelHandler","_getCompositionHandler","_releaseAll","document","visibilityState","Map","Set","_pointerButtons","x","y","start","addEventListener","window","stop","removeEventListener","isKeyDown","code","has","keyPressed","keyReleased","isMouseDown","button","mousePressed","mouseReleased","pointerDelta","wheelDelta","gamepad","gamepads","filter","pad","connected","lastDevice","addActionMap","map","includes","push","removeActionMap","index","indexOf","splice","_evaluate","actionMaps","pointerLocked","pointerLockElement","requestPointerLock","target","unadjustedMovement","exitPointerLock","_beginFrame","deltaTime","clear","size","_pollGamepads","blocked","i","length","enabled","blocking","pads","navigator","getGamepads","Math","max","raw","mapping","state","GamepadState","_update","active","find","ev","values","up","KeyboardEvent","key","location","call","pointerId","keys","_setPointerButtons","_reset","mask","consumed","old","get","next","set","delete","buttons","m","_updatePointerState","b","type","use","handler","ctx","useFirst","unshift","unuse","findIndex","h","enableSystemContextMenu","enable","log","console","_callMiddlewares","args","mw","that","eventData","_getPointerEventData","lastDown","lastClick","dispatchEvent","preventDefault","lastMoveX","offsetX","lastMoveY","offsetY","movementX","movementY","pointerType","setPointerCapture","lastDownX","lastDownY","lastDownTime","Date","now","focus","emitClickEvent","emitDoubleClickEvent","deltaX","deltaY","lastClickTime","lastClickX","lastClickY","releasePointerCapture","add","scale","deltaMode","WheelEvent","DOM_DELTA_LINE","DOM_DELTA_PAGE","clientHeight"],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drives a {@link LoadingScreen} with the progress of the loading.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* Loading is split into stages with weights, such as compiling pipelines, preloading
|
|
6
|
+
* assets and loading the scene; the progress is their weighted sum, never going back,
|
|
7
|
+
* and the message is the name of the first stage not done. Without a stage with a share
|
|
8
|
+
* of the progress, the screen is never given one and shows only the message. The engine
|
|
9
|
+
* never creates one by itself: the code starting the application adds the stages and
|
|
10
|
+
* finishes it.
|
|
11
|
+
* @public
|
|
12
|
+
*/ class LoadingProgress {
|
|
13
|
+
_screen;
|
|
14
|
+
_stages;
|
|
15
|
+
_progress;
|
|
16
|
+
_reported;
|
|
17
|
+
_message;
|
|
18
|
+
_frame;
|
|
19
|
+
_finished;
|
|
20
|
+
/**
|
|
21
|
+
* @param screen - The loading screen to drive
|
|
22
|
+
*/ constructor(screen){
|
|
23
|
+
this._screen = screen;
|
|
24
|
+
this._stages = [];
|
|
25
|
+
this._progress = 0;
|
|
26
|
+
this._reported = false;
|
|
27
|
+
this._message = '';
|
|
28
|
+
this._frame = 0;
|
|
29
|
+
this._finished = false;
|
|
30
|
+
}
|
|
31
|
+
/** The loading screen driven */ get screen() {
|
|
32
|
+
return this._screen;
|
|
33
|
+
}
|
|
34
|
+
/** Overall progress in [0, 1] last shown */ get progress() {
|
|
35
|
+
return this._progress;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Adds a stage of the loading.
|
|
39
|
+
* @param name - Name of the stage, shown while it loads
|
|
40
|
+
* @param weight - Share of the stage in the progress, relative to the other stages
|
|
41
|
+
*/ addStage(name, weight = 1) {
|
|
42
|
+
const stage = this.pushStage(name, weight, null);
|
|
43
|
+
return {
|
|
44
|
+
update: (fraction)=>{
|
|
45
|
+
stage.fraction = Math.max(stage.fraction, fraction);
|
|
46
|
+
},
|
|
47
|
+
done: ()=>{
|
|
48
|
+
stage.fraction = 1;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** Tracks compiling pipelines as a stage */ trackPipelines(task, weight = 1, name = 'Compiling shaders') {
|
|
53
|
+
this.pushStage(name, weight, ()=>{
|
|
54
|
+
if (task.state === 'done' || task.state === 'cancelled') {
|
|
55
|
+
return 1;
|
|
56
|
+
}
|
|
57
|
+
const p = task.progress;
|
|
58
|
+
return p.total > 0 ? (p.completed + p.failed + p.skipped) / p.total : 0;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/** Tracks preloading assets as a stage */ trackPreload(task, weight = 1, name = 'Loading assets') {
|
|
62
|
+
this.pushStage(name, weight, ()=>task.state === 'done' || task.state === 'cancelled' ? 1 : task.progress.fraction);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Shows that starting failed on the loading screen, which stays up.
|
|
66
|
+
* @param reason - The error
|
|
67
|
+
*/ fail(reason) {
|
|
68
|
+
this.stop();
|
|
69
|
+
const message = reason instanceof Error ? reason.message : String(reason);
|
|
70
|
+
this._screen.showError?.(message);
|
|
71
|
+
}
|
|
72
|
+
/** Shows the loading done and hides the loading screen */ finish() {
|
|
73
|
+
if (this._finished) {
|
|
74
|
+
return Promise.resolve();
|
|
75
|
+
}
|
|
76
|
+
this.stop();
|
|
77
|
+
this._progress = 1;
|
|
78
|
+
if (this._stages.some((stage)=>stage.weight > 0)) {
|
|
79
|
+
this._screen.setProgress(1);
|
|
80
|
+
}
|
|
81
|
+
return Promise.resolve(this._screen.hide());
|
|
82
|
+
}
|
|
83
|
+
stop() {
|
|
84
|
+
this._finished = true;
|
|
85
|
+
cancelAnimationFrame(this._frame);
|
|
86
|
+
this._frame = 0;
|
|
87
|
+
}
|
|
88
|
+
pushStage(name, weight, poll) {
|
|
89
|
+
const stage = {
|
|
90
|
+
name,
|
|
91
|
+
weight: Math.max(weight, 0),
|
|
92
|
+
fraction: 0,
|
|
93
|
+
poll
|
|
94
|
+
};
|
|
95
|
+
this._stages.push(stage);
|
|
96
|
+
if (!this._frame && !this._finished) {
|
|
97
|
+
const step = ()=>{
|
|
98
|
+
this.update();
|
|
99
|
+
this._frame = this._finished ? 0 : requestAnimationFrame(step);
|
|
100
|
+
};
|
|
101
|
+
this._frame = requestAnimationFrame(step);
|
|
102
|
+
}
|
|
103
|
+
return stage;
|
|
104
|
+
}
|
|
105
|
+
update() {
|
|
106
|
+
let weight = 0;
|
|
107
|
+
let done = 0;
|
|
108
|
+
let message = '';
|
|
109
|
+
for (const stage of this._stages){
|
|
110
|
+
if (stage.poll) {
|
|
111
|
+
const fraction = stage.poll();
|
|
112
|
+
if (fraction !== null) {
|
|
113
|
+
stage.fraction = Math.max(stage.fraction, fraction);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const fraction = Math.min(Math.max(stage.fraction, 0), 1);
|
|
117
|
+
weight += stage.weight;
|
|
118
|
+
done += stage.weight * fraction;
|
|
119
|
+
if (!message && fraction < 1) {
|
|
120
|
+
message = stage.name;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const progress = Math.max(this._progress, weight > 0 ? done / weight : 0);
|
|
124
|
+
// Without a stage with a share, there is no bar to fill
|
|
125
|
+
if (weight > 0 && (progress !== this._progress || !this._reported)) {
|
|
126
|
+
this._progress = progress;
|
|
127
|
+
this._reported = true;
|
|
128
|
+
this._screen.setProgress(progress);
|
|
129
|
+
}
|
|
130
|
+
if (message && message !== this._message) {
|
|
131
|
+
this._message = message;
|
|
132
|
+
this._screen.setMessage?.(message);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export { LoadingProgress };
|
|
138
|
+
//# sourceMappingURL=loading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loading.js","sources":["../../src/app/loading.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport type { AssetPreloadTask } from '../asset/asset_preload';\r\nimport type { PipelineCompileTask } from './pipelinecache';\r\n\r\n/**\r\n * What a page showing the loading of an application implements, for\r\n * {@link LoadingProgress} to drive.\r\n *\r\n * @remarks\r\n * The engine has no loading screen of its own: a page wanting one puts it in its\r\n * markup, so it shows before any script loads, and implements this to show the\r\n * progress once the engine is up.\r\n * @public\r\n */\r\nexport interface LoadingScreen {\r\n /**\r\n * Shows the overall progress in [0, 1], which never goes back.\r\n *\r\n * @remarks\r\n * Only called once a stage with a share of the progress is added: until then there is\r\n * no progress to show, so a screen shows its progress bar from the first call on.\r\n */\r\n setProgress(fraction: number): void;\r\n /** Shows the name of the stage being loaded */\r\n setMessage?(text: string): void;\r\n /** Shows that starting failed */\r\n showError?(message: string): void;\r\n /** Removes the loading screen once the application is on screen; may resolve after a fade */\r\n hide(): void | Promise<void>;\r\n}\r\n\r\n/**\r\n * A part of the loading tracked by a {@link LoadingProgress}\r\n * @public\r\n */\r\nexport interface LoadingStage {\r\n /** Sets how much of the stage is done, in [0, 1] */\r\n update(fraction: number): void;\r\n /** Marks the stage done */\r\n done(): void;\r\n}\r\n\r\ntype Stage = {\r\n name: string;\r\n weight: number;\r\n fraction: number;\r\n poll: Nullable<() => Nullable<number>>;\r\n};\r\n\r\n/**\r\n * Drives a {@link LoadingScreen} with the progress of the loading.\r\n *\r\n * @remarks\r\n * Loading is split into stages with weights, such as compiling pipelines, preloading\r\n * assets and loading the scene; the progress is their weighted sum, never going back,\r\n * and the message is the name of the first stage not done. Without a stage with a share\r\n * of the progress, the screen is never given one and shows only the message. The engine\r\n * never creates one by itself: the code starting the application adds the stages and\r\n * finishes it.\r\n * @public\r\n */\r\nexport class LoadingProgress {\r\n private readonly _screen: LoadingScreen;\r\n private readonly _stages: Stage[];\r\n private _progress: number;\r\n private _reported: boolean;\r\n private _message: string;\r\n private _frame: number;\r\n private _finished: boolean;\r\n /**\r\n * @param screen - The loading screen to drive\r\n */\r\n constructor(screen: LoadingScreen) {\r\n this._screen = screen;\r\n this._stages = [];\r\n this._progress = 0;\r\n this._reported = false;\r\n this._message = '';\r\n this._frame = 0;\r\n this._finished = false;\r\n }\r\n /** The loading screen driven */\r\n get screen() {\r\n return this._screen;\r\n }\r\n /** Overall progress in [0, 1] last shown */\r\n get progress() {\r\n return this._progress;\r\n }\r\n /**\r\n * Adds a stage of the loading.\r\n * @param name - Name of the stage, shown while it loads\r\n * @param weight - Share of the stage in the progress, relative to the other stages\r\n */\r\n addStage(name: string, weight = 1): LoadingStage {\r\n const stage = this.pushStage(name, weight, null);\r\n return {\r\n update: (fraction: number) => {\r\n stage.fraction = Math.max(stage.fraction, fraction);\r\n },\r\n done: () => {\r\n stage.fraction = 1;\r\n }\r\n };\r\n }\r\n /** Tracks compiling pipelines as a stage */\r\n trackPipelines(task: PipelineCompileTask, weight = 1, name = 'Compiling shaders') {\r\n this.pushStage(name, weight, () => {\r\n if (task.state === 'done' || task.state === 'cancelled') {\r\n return 1;\r\n }\r\n const p = task.progress;\r\n return p.total > 0 ? (p.completed + p.failed + p.skipped) / p.total : 0;\r\n });\r\n }\r\n /** Tracks preloading assets as a stage */\r\n trackPreload(task: AssetPreloadTask, weight = 1, name = 'Loading assets') {\r\n this.pushStage(name, weight, () =>\r\n task.state === 'done' || task.state === 'cancelled' ? 1 : task.progress.fraction\r\n );\r\n }\r\n /**\r\n * Shows that starting failed on the loading screen, which stays up.\r\n * @param reason - The error\r\n */\r\n fail(reason: unknown) {\r\n this.stop();\r\n const message = reason instanceof Error ? reason.message : String(reason);\r\n this._screen.showError?.(message);\r\n }\r\n /** Shows the loading done and hides the loading screen */\r\n finish(): Promise<void> {\r\n if (this._finished) {\r\n return Promise.resolve();\r\n }\r\n this.stop();\r\n this._progress = 1;\r\n if (this._stages.some((stage) => stage.weight > 0)) {\r\n this._screen.setProgress(1);\r\n }\r\n return Promise.resolve(this._screen.hide());\r\n }\r\n private stop() {\r\n this._finished = true;\r\n cancelAnimationFrame(this._frame);\r\n this._frame = 0;\r\n }\r\n private pushStage(name: string, weight: number, poll: Stage['poll']) {\r\n const stage: Stage = { name, weight: Math.max(weight, 0), fraction: 0, poll };\r\n this._stages.push(stage);\r\n if (!this._frame && !this._finished) {\r\n const step = () => {\r\n this.update();\r\n this._frame = this._finished ? 0 : requestAnimationFrame(step);\r\n };\r\n this._frame = requestAnimationFrame(step);\r\n }\r\n return stage;\r\n }\r\n private update() {\r\n let weight = 0;\r\n let done = 0;\r\n let message = '';\r\n for (const stage of this._stages) {\r\n if (stage.poll) {\r\n const fraction = stage.poll();\r\n if (fraction !== null) {\r\n stage.fraction = Math.max(stage.fraction, fraction);\r\n }\r\n }\r\n const fraction = Math.min(Math.max(stage.fraction, 0), 1);\r\n weight += stage.weight;\r\n done += stage.weight * fraction;\r\n if (!message && fraction < 1) {\r\n message = stage.name;\r\n }\r\n }\r\n const progress = Math.max(this._progress, weight > 0 ? done / weight : 0);\r\n // Without a stage with a share, there is no bar to fill\r\n if (weight > 0 && (progress !== this._progress || !this._reported)) {\r\n this._progress = progress;\r\n this._reported = true;\r\n this._screen.setProgress(progress);\r\n }\r\n if (message && message !== this._message) {\r\n this._message = message;\r\n this._screen.setMessage?.(message);\r\n }\r\n }\r\n}\r\n"],"names":["LoadingProgress","_screen","_stages","_progress","_reported","_message","_frame","_finished","screen","progress","addStage","name","weight","stage","pushStage","update","fraction","Math","max","done","trackPipelines","task","state","p","total","completed","failed","skipped","trackPreload","fail","reason","stop","message","Error","String","showError","finish","Promise","resolve","some","setProgress","hide","cancelAnimationFrame","poll","push","step","requestAnimationFrame","min","setMessage"],"mappings":"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"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { getDevice } from './api.js';
|
|
2
|
+
|
|
3
|
+
/** VFS path of the pipeline cache file {@link PipelineCacheManager.createTask} reads by default */ const PIPELINE_CACHE_FILE = '/pipeline-cache.json';
|
|
4
|
+
/**
|
|
5
|
+
* Recorded pipelines to compile ahead of time.
|
|
6
|
+
*
|
|
7
|
+
* @remarks
|
|
8
|
+
* Made by {@link PipelineCacheManager.createTask}; nothing happens until {@link PipelineCompileTask.run}.
|
|
9
|
+
* Files that cannot be read are listed in {@link PipelineCompileTask.missing}; their pipelines
|
|
10
|
+
* are compiled on demand when draws need them.
|
|
11
|
+
* @public
|
|
12
|
+
*/ class PipelineCompileTask {
|
|
13
|
+
_name;
|
|
14
|
+
_sources;
|
|
15
|
+
_vfs;
|
|
16
|
+
_state;
|
|
17
|
+
_priority;
|
|
18
|
+
_job;
|
|
19
|
+
_running;
|
|
20
|
+
_cancelRequested;
|
|
21
|
+
_missing;
|
|
22
|
+
_progress;
|
|
23
|
+
/** @internal */ constructor(vfs, sources, name){
|
|
24
|
+
this._vfs = vfs;
|
|
25
|
+
this._sources = [
|
|
26
|
+
...sources
|
|
27
|
+
];
|
|
28
|
+
this._name = name;
|
|
29
|
+
this._state = 'idle';
|
|
30
|
+
this._priority = 'foreground';
|
|
31
|
+
this._job = null;
|
|
32
|
+
this._running = null;
|
|
33
|
+
this._cancelRequested = false;
|
|
34
|
+
this._missing = [];
|
|
35
|
+
this._progress = {
|
|
36
|
+
total: 0,
|
|
37
|
+
completed: 0,
|
|
38
|
+
failed: 0,
|
|
39
|
+
skipped: 0
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** Name of the task, for messages */ get name() {
|
|
43
|
+
return this._name;
|
|
44
|
+
}
|
|
45
|
+
/** What the task is doing */ get state() {
|
|
46
|
+
return this._state;
|
|
47
|
+
}
|
|
48
|
+
/** Progress so far; `total` is 0 until the recording files are read */ get progress() {
|
|
49
|
+
return this._job ? this._job.progress : this._progress;
|
|
50
|
+
}
|
|
51
|
+
/** Recording files that could not be read */ get missing() {
|
|
52
|
+
return this._missing;
|
|
53
|
+
}
|
|
54
|
+
/** How eagerly the task compiles; can be changed while it runs */ get priority() {
|
|
55
|
+
return this._priority;
|
|
56
|
+
}
|
|
57
|
+
set priority(priority) {
|
|
58
|
+
this._priority = priority;
|
|
59
|
+
if (this._job) {
|
|
60
|
+
this._job.priority = priority;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Reads the recording files and compiles their pipelines.
|
|
65
|
+
*
|
|
66
|
+
* @remarks
|
|
67
|
+
* Calling it again returns the same promise; the options of later calls are ignored.
|
|
68
|
+
*
|
|
69
|
+
* @param options - Priority and progress callback
|
|
70
|
+
* @returns Resolves when every pipeline is accounted for or the task is cancelled
|
|
71
|
+
*/ run(options) {
|
|
72
|
+
if (!this._running) {
|
|
73
|
+
if (options?.priority) {
|
|
74
|
+
this._priority = options.priority;
|
|
75
|
+
}
|
|
76
|
+
this._running = this.execute(options?.onProgress);
|
|
77
|
+
}
|
|
78
|
+
return this._running;
|
|
79
|
+
}
|
|
80
|
+
/** Compiles nothing more; pipelines already compiling are still kept */ cancel() {
|
|
81
|
+
this._cancelRequested = true;
|
|
82
|
+
this._job?.cancel();
|
|
83
|
+
if (this._state === 'idle') {
|
|
84
|
+
this._state = 'cancelled';
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async execute(onProgress) {
|
|
88
|
+
const start = performance.now();
|
|
89
|
+
if (this._state === 'cancelled') {
|
|
90
|
+
return this.finish({
|
|
91
|
+
...this._progress,
|
|
92
|
+
cancelled: true,
|
|
93
|
+
elapsedMs: 0
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
this._state = 'loading';
|
|
97
|
+
const backend = getDevice().type;
|
|
98
|
+
const dataList = (await Promise.all(this._sources.map((source)=>this.load(source)))).flat().filter((data)=>data.backend === backend);
|
|
99
|
+
if (this._cancelRequested) {
|
|
100
|
+
this._state = 'cancelled';
|
|
101
|
+
return this.finish({
|
|
102
|
+
...this._progress,
|
|
103
|
+
cancelled: true,
|
|
104
|
+
elapsedMs: performance.now() - start
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
this._state = 'compiling';
|
|
108
|
+
this._job = getDevice().precompilePipelines(dataList, {
|
|
109
|
+
priority: this._priority,
|
|
110
|
+
onProgress
|
|
111
|
+
});
|
|
112
|
+
const result = await this._job.result;
|
|
113
|
+
this._state = result.cancelled ? 'cancelled' : 'done';
|
|
114
|
+
return this.finish({
|
|
115
|
+
...result,
|
|
116
|
+
elapsedMs: performance.now() - start
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
finish(result) {
|
|
120
|
+
if (!this._job) {
|
|
121
|
+
this._progress = {
|
|
122
|
+
total: result.total,
|
|
123
|
+
completed: result.completed,
|
|
124
|
+
failed: result.failed,
|
|
125
|
+
skipped: result.skipped
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
...result,
|
|
130
|
+
missing: [
|
|
131
|
+
...this._missing
|
|
132
|
+
]
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
async load(source) {
|
|
136
|
+
if (typeof source !== 'string') {
|
|
137
|
+
return [
|
|
138
|
+
source
|
|
139
|
+
];
|
|
140
|
+
}
|
|
141
|
+
const path = source;
|
|
142
|
+
try {
|
|
143
|
+
if (await this._vfs.exists(path)) {
|
|
144
|
+
const text = await this._vfs.readFile(path, {
|
|
145
|
+
encoding: 'utf8'
|
|
146
|
+
});
|
|
147
|
+
// Hosts that answer missing files with an HTML page are not pipeline caches
|
|
148
|
+
const trimmed = text.trimStart();
|
|
149
|
+
if (trimmed.startsWith('{') || trimmed.startsWith('[')) {
|
|
150
|
+
const parsed = JSON.parse(text);
|
|
151
|
+
const dataList = (Array.isArray(parsed) ? parsed : [
|
|
152
|
+
parsed
|
|
153
|
+
]).filter((data)=>data?.format === 'zephyr3d-pso');
|
|
154
|
+
if (dataList.length > 0) {
|
|
155
|
+
return dataList;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
} catch (err) {
|
|
160
|
+
console.warn(`Pipeline cache ${path} unreadable: ${err}`);
|
|
161
|
+
}
|
|
162
|
+
this._missing.push(path);
|
|
163
|
+
return [];
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Reads pipeline cache files and compiles the pipelines they record ahead of time.
|
|
168
|
+
*
|
|
169
|
+
* @remarks
|
|
170
|
+
* Pipelines recorded by the editor (or through the device's {@link @zephyr3d/device#PipelineRecorder})
|
|
171
|
+
* are compiled before the draws that need them, so those draws do not stall. The engine never
|
|
172
|
+
* calls this by itself. WebGPU and WebGL 2 compile the pipelines (on WebGL, the programs) recorded
|
|
173
|
+
* on the same device type; recordings of other device types are skipped.
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
* ```ts
|
|
177
|
+
* const cache = getEngine().pipelineCache;
|
|
178
|
+
* if (await getEngine().VFS.exists(PIPELINE_CACHE_FILE)) {
|
|
179
|
+
* const task = cache.createTask();
|
|
180
|
+
* await task.run({ onProgress: (p) => showProgress(p.completed + p.failed + p.skipped, p.total) });
|
|
181
|
+
* }
|
|
182
|
+
* ```
|
|
183
|
+
* @public
|
|
184
|
+
*/ class PipelineCacheManager {
|
|
185
|
+
_getVFS;
|
|
186
|
+
_taskCounter;
|
|
187
|
+
/** @internal */ constructor(getVFS){
|
|
188
|
+
this._getVFS = getVFS;
|
|
189
|
+
this._taskCounter = 0;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Makes a task compiling the pipelines of pipeline cache files. It does nothing until it is run.
|
|
193
|
+
*
|
|
194
|
+
* @param sources - VFS paths of pipeline cache files, or recordings already read; defaults
|
|
195
|
+
* to {@link PIPELINE_CACHE_FILE}
|
|
196
|
+
* @param options - Name of the task, for messages
|
|
197
|
+
* @returns The task
|
|
198
|
+
*/ createTask(sources = [
|
|
199
|
+
PIPELINE_CACHE_FILE
|
|
200
|
+
], options) {
|
|
201
|
+
return new PipelineCompileTask(this._getVFS(), sources, options?.name ?? `pipeline-cache-${++this._taskCounter}`);
|
|
202
|
+
}
|
|
203
|
+
/** Gets how the pipelines of the device were made: precompiled, used, compiled on demand */ getStats() {
|
|
204
|
+
return getDevice().getPipelineCacheStats();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export { PIPELINE_CACHE_FILE, PipelineCacheManager, PipelineCompileTask };
|
|
209
|
+
//# sourceMappingURL=pipelinecache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipelinecache.js","sources":["../../src/app/pipelinecache.ts"],"sourcesContent":["import type { Nullable, VFS } from '@zephyr3d/base';\r\nimport type {\r\n PipelineCacheData,\r\n PipelineCacheStats,\r\n PipelinePrecompileJob,\r\n PipelinePrecompilePriority,\r\n PipelinePrecompileProgress,\r\n PipelinePrecompileResult\r\n} from '@zephyr3d/device';\r\nimport { getDevice } from './api';\r\n\r\n/** VFS path of the pipeline cache file {@link PipelineCacheManager.createTask} reads by default */\r\nexport const PIPELINE_CACHE_FILE = '/pipeline-cache.json';\r\n\r\n/**\r\n * State of a {@link PipelineCompileTask}\r\n * @public\r\n */\r\nexport type PipelineCompileTaskState = 'idle' | 'loading' | 'compiling' | 'done' | 'cancelled';\r\n\r\n/**\r\n * Outcome of a {@link PipelineCompileTask}\r\n * @public\r\n */\r\nexport interface PipelineCompileResult extends PipelinePrecompileResult {\r\n /** Recording files that could not be read, or were not pipeline cache files */\r\n missing: string[];\r\n}\r\n\r\n/**\r\n * Options of running a {@link PipelineCompileTask}\r\n * @public\r\n */\r\nexport interface PipelineCompileRunOptions {\r\n /** How eagerly to compile, defaults to the priority of the task (`foreground` unless set) */\r\n priority?: PipelinePrecompilePriority;\r\n /** Called whenever a pipeline of the task is accounted for */\r\n onProgress?: (progress: Readonly<PipelinePrecompileProgress>) => void;\r\n}\r\n\r\n/**\r\n * Source of the pipelines of a {@link PipelineCompileTask}: the VFS path of a pipeline\r\n * cache file, or a recording already read.\r\n *\r\n * @remarks\r\n * A pipeline cache file holds one {@link @zephyr3d/device#PipelineCacheData}, or an array of\r\n * them, one per backend that recorded the pipelines; only those of the device are compiled.\r\n * @public\r\n */\r\nexport type PipelineCompileSource = string | PipelineCacheData;\r\n\r\n/**\r\n * Recorded pipelines to compile ahead of time.\r\n *\r\n * @remarks\r\n * Made by {@link PipelineCacheManager.createTask}; nothing happens until {@link PipelineCompileTask.run}.\r\n * Files that cannot be read are listed in {@link PipelineCompileTask.missing}; their pipelines\r\n * are compiled on demand when draws need them.\r\n * @public\r\n */\r\nexport class PipelineCompileTask {\r\n private readonly _name: string;\r\n private readonly _sources: PipelineCompileSource[];\r\n private readonly _vfs: VFS;\r\n private _state: PipelineCompileTaskState;\r\n private _priority: PipelinePrecompilePriority;\r\n private _job: Nullable<PipelinePrecompileJob>;\r\n private _running: Nullable<Promise<PipelineCompileResult>>;\r\n private _cancelRequested: boolean;\r\n private readonly _missing: string[];\r\n private _progress: PipelinePrecompileProgress;\r\n /** @internal */\r\n constructor(vfs: VFS, sources: PipelineCompileSource[], name: string) {\r\n this._vfs = vfs;\r\n this._sources = [...sources];\r\n this._name = name;\r\n this._state = 'idle';\r\n this._priority = 'foreground';\r\n this._job = null;\r\n this._running = null;\r\n this._cancelRequested = false;\r\n this._missing = [];\r\n this._progress = { total: 0, completed: 0, failed: 0, skipped: 0 };\r\n }\r\n /** Name of the task, for messages */\r\n get name() {\r\n return this._name;\r\n }\r\n /** What the task is doing */\r\n get state() {\r\n return this._state;\r\n }\r\n /** Progress so far; `total` is 0 until the recording files are read */\r\n get progress(): Readonly<PipelinePrecompileProgress> {\r\n return this._job ? this._job.progress : this._progress;\r\n }\r\n /** Recording files that could not be read */\r\n get missing(): readonly string[] {\r\n return this._missing;\r\n }\r\n /** How eagerly the task compiles; can be changed while it runs */\r\n get priority() {\r\n return this._priority;\r\n }\r\n set priority(priority: PipelinePrecompilePriority) {\r\n this._priority = priority;\r\n if (this._job) {\r\n this._job.priority = priority;\r\n }\r\n }\r\n /**\r\n * Reads the recording files and compiles their pipelines.\r\n *\r\n * @remarks\r\n * Calling it again returns the same promise; the options of later calls are ignored.\r\n *\r\n * @param options - Priority and progress callback\r\n * @returns Resolves when every pipeline is accounted for or the task is cancelled\r\n */\r\n run(options?: PipelineCompileRunOptions): Promise<PipelineCompileResult> {\r\n if (!this._running) {\r\n if (options?.priority) {\r\n this._priority = options.priority;\r\n }\r\n this._running = this.execute(options?.onProgress);\r\n }\r\n return this._running;\r\n }\r\n /** Compiles nothing more; pipelines already compiling are still kept */\r\n cancel() {\r\n this._cancelRequested = true;\r\n this._job?.cancel();\r\n if (this._state === 'idle') {\r\n this._state = 'cancelled';\r\n }\r\n }\r\n private async execute(onProgress: PipelineCompileRunOptions['onProgress']): Promise<PipelineCompileResult> {\r\n const start = performance.now();\r\n if (this._state === 'cancelled') {\r\n return this.finish({ ...this._progress, cancelled: true, elapsedMs: 0 });\r\n }\r\n this._state = 'loading';\r\n const backend = getDevice().type;\r\n const dataList = (await Promise.all(this._sources.map((source) => this.load(source))))\r\n .flat()\r\n .filter((data) => data.backend === backend);\r\n if (this._cancelRequested) {\r\n this._state = 'cancelled';\r\n return this.finish({ ...this._progress, cancelled: true, elapsedMs: performance.now() - start });\r\n }\r\n this._state = 'compiling';\r\n this._job = getDevice().precompilePipelines(dataList, { priority: this._priority, onProgress });\r\n const result = await this._job.result;\r\n this._state = result.cancelled ? 'cancelled' : 'done';\r\n return this.finish({ ...result, elapsedMs: performance.now() - start });\r\n }\r\n private finish(result: PipelinePrecompileResult): PipelineCompileResult {\r\n if (!this._job) {\r\n this._progress = {\r\n total: result.total,\r\n completed: result.completed,\r\n failed: result.failed,\r\n skipped: result.skipped\r\n };\r\n }\r\n return { ...result, missing: [...this._missing] };\r\n }\r\n private async load(source: PipelineCompileSource): Promise<PipelineCacheData[]> {\r\n if (typeof source !== 'string') {\r\n return [source];\r\n }\r\n const path = source;\r\n try {\r\n if (await this._vfs.exists(path)) {\r\n const text = (await this._vfs.readFile(path, { encoding: 'utf8' })) as string;\r\n // Hosts that answer missing files with an HTML page are not pipeline caches\r\n const trimmed = text.trimStart();\r\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\r\n const parsed = JSON.parse(text) as PipelineCacheData | PipelineCacheData[];\r\n const dataList = (Array.isArray(parsed) ? parsed : [parsed]).filter(\r\n (data) => data?.format === 'zephyr3d-pso'\r\n );\r\n if (dataList.length > 0) {\r\n return dataList;\r\n }\r\n }\r\n }\r\n } catch (err) {\r\n console.warn(`Pipeline cache ${path} unreadable: ${err}`);\r\n }\r\n this._missing.push(path);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Reads pipeline cache files and compiles the pipelines they record ahead of time.\r\n *\r\n * @remarks\r\n * Pipelines recorded by the editor (or through the device's {@link @zephyr3d/device#PipelineRecorder})\r\n * are compiled before the draws that need them, so those draws do not stall. The engine never\r\n * calls this by itself. WebGPU and WebGL 2 compile the pipelines (on WebGL, the programs) recorded\r\n * on the same device type; recordings of other device types are skipped.\r\n *\r\n * @example\r\n * ```ts\r\n * const cache = getEngine().pipelineCache;\r\n * if (await getEngine().VFS.exists(PIPELINE_CACHE_FILE)) {\r\n * const task = cache.createTask();\r\n * await task.run({ onProgress: (p) => showProgress(p.completed + p.failed + p.skipped, p.total) });\r\n * }\r\n * ```\r\n * @public\r\n */\r\nexport class PipelineCacheManager {\r\n private readonly _getVFS: () => VFS;\r\n private _taskCounter: number;\r\n /** @internal */\r\n constructor(getVFS: () => VFS) {\r\n this._getVFS = getVFS;\r\n this._taskCounter = 0;\r\n }\r\n /**\r\n * Makes a task compiling the pipelines of pipeline cache files. It does nothing until it is run.\r\n *\r\n * @param sources - VFS paths of pipeline cache files, or recordings already read; defaults\r\n * to {@link PIPELINE_CACHE_FILE}\r\n * @param options - Name of the task, for messages\r\n * @returns The task\r\n */\r\n createTask(sources: PipelineCompileSource[] = [PIPELINE_CACHE_FILE], options?: { name?: string }) {\r\n return new PipelineCompileTask(\r\n this._getVFS(),\r\n sources,\r\n options?.name ?? `pipeline-cache-${++this._taskCounter}`\r\n );\r\n }\r\n /** Gets how the pipelines of the device were made: precompiled, used, compiled on demand */\r\n getStats(): PipelineCacheStats {\r\n return getDevice().getPipelineCacheStats();\r\n }\r\n}\r\n"],"names":["PIPELINE_CACHE_FILE","PipelineCompileTask","_name","_sources","_vfs","_state","_priority","_job","_running","_cancelRequested","_missing","_progress","vfs","sources","name","total","completed","failed","skipped","state","progress","missing","priority","run","options","execute","onProgress","cancel","start","performance","now","finish","cancelled","elapsedMs","backend","getDevice","type","dataList","Promise","all","map","source","load","flat","filter","data","precompilePipelines","result","path","exists","text","readFile","encoding","trimmed","trimStart","startsWith","parsed","JSON","parse","Array","isArray","format","length","err","console","warn","push","PipelineCacheManager","_getVFS","_taskCounter","getVFS","createTask","getStats","getPipelineCacheStats"],"mappings":"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"}
|