@zephyr3d/scene 0.7.0 → 0.8.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/dist/animation/animation.js +4 -33
- package/dist/animation/animation.js.map +1 -1
- package/dist/animation/animationset.js +24 -11
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/animationtrack.js +1 -0
- package/dist/animation/animationtrack.js.map +1 -1
- package/dist/animation/eulerrotationtrack.js +0 -1
- package/dist/animation/eulerrotationtrack.js.map +1 -1
- package/dist/animation/ik/ccd_solver.js +372 -0
- package/dist/animation/ik/ccd_solver.js.map +1 -0
- package/dist/animation/ik/fabrik_solver.js +399 -0
- package/dist/animation/ik/fabrik_solver.js.map +1 -0
- package/dist/animation/ik/ik_angle_constraint.js +181 -0
- package/dist/animation/ik/ik_angle_constraint.js.map +1 -0
- package/dist/animation/ik/ik_chain.js +163 -0
- package/dist/animation/ik/ik_chain.js.map +1 -0
- package/dist/animation/ik/ik_chain_builder.js +68 -0
- package/dist/animation/ik/ik_chain_builder.js.map +1 -0
- package/dist/animation/ik/ik_constraint.js +25 -0
- package/dist/animation/ik/ik_constraint.js.map +1 -0
- package/dist/animation/ik/ik_pole_constraint.js +123 -0
- package/dist/animation/ik/ik_pole_constraint.js.map +1 -0
- package/dist/animation/ik/ik_solver.js +48 -0
- package/dist/animation/ik/ik_solver.js.map +1 -0
- package/dist/animation/ik/ik_track.js +96 -0
- package/dist/animation/ik/ik_track.js.map +1 -0
- package/dist/animation/ik/ik_utils.js +270 -0
- package/dist/animation/ik/ik_utils.js.map +1 -0
- package/dist/animation/ik/two_bone_ik_solver.js +332 -0
- package/dist/animation/ik/two_bone_ik_solver.js.map +1 -0
- package/dist/animation/ik_modifier.js +61 -0
- package/dist/animation/ik_modifier.js.map +1 -0
- package/dist/animation/ik_postprocessor.js +71 -0
- package/dist/animation/ik_postprocessor.js.map +1 -0
- package/dist/animation/manual_transform_processor.js +156 -0
- package/dist/animation/manual_transform_processor.js.map +1 -0
- package/dist/animation/morphtarget.js +7 -1
- package/dist/animation/morphtarget.js.map +1 -1
- package/dist/animation/morphtrack.js +3 -3
- package/dist/animation/morphtrack.js.map +1 -1
- package/dist/animation/proptrack.js +37 -41
- package/dist/animation/proptrack.js.map +1 -1
- package/dist/animation/rotationtrack.js +0 -1
- package/dist/animation/rotationtrack.js.map +1 -1
- package/dist/animation/scaletrack.js +0 -1
- package/dist/animation/scaletrack.js.map +1 -1
- package/dist/animation/skeleton.js +57 -60
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skeleton_modifier.js +38 -0
- package/dist/animation/skeleton_modifier.js.map +1 -0
- package/dist/animation/skeleton_postprocessor.js +50 -0
- package/dist/animation/skeleton_postprocessor.js.map +1 -0
- package/dist/animation/spring/multi_chain_spring_system.js +503 -0
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -0
- package/dist/animation/spring/spring_chain.js +103 -0
- package/dist/animation/spring/spring_chain.js.map +1 -0
- package/dist/animation/spring/spring_collider.js +247 -0
- package/dist/animation/spring/spring_collider.js.map +1 -0
- package/dist/animation/spring/spring_constraint.js +21 -0
- package/dist/animation/spring/spring_constraint.js.map +1 -0
- package/dist/animation/spring/spring_particle.js +20 -0
- package/dist/animation/spring/spring_particle.js.map +1 -0
- package/dist/animation/spring/spring_system.js +526 -0
- package/dist/animation/spring/spring_system.js.map +1 -0
- package/dist/animation/spring_modifier.js +45 -0
- package/dist/animation/spring_modifier.js.map +1 -0
- package/dist/animation/spring_postprocessor.js +54 -0
- package/dist/animation/spring_postprocessor.js.map +1 -0
- package/dist/animation/translationtrack.js +0 -1
- package/dist/animation/translationtrack.js.map +1 -1
- package/dist/app/api.js +13 -4
- package/dist/app/api.js.map +1 -1
- package/dist/app/app.js +13 -1
- package/dist/app/app.js.map +1 -1
- package/dist/app/engine.js +33 -45
- package/dist/app/engine.js.map +1 -1
- package/dist/app/inputmgr.js.map +1 -1
- package/dist/app/runtimescript.js.map +1 -1
- package/dist/app/screen.js +318 -0
- package/dist/app/screen.js.map +1 -0
- package/dist/app/scriptingsystem.js +10 -6
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +11 -22
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +79 -58
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/builtin.js +5 -5
- package/dist/asset/builtin.js.map +1 -1
- package/dist/asset/loaders/dds/dds.js +6 -2
- package/dist/asset/loaders/dds/dds.js.map +1 -1
- package/dist/asset/loaders/dds/dds_loader.js +1 -1
- package/dist/asset/loaders/dds/dds_loader.js.map +1 -1
- package/dist/asset/loaders/gltf/gltf_loader.js +14 -6
- package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
- package/dist/asset/loaders/gltf/helpers.js +6 -2
- package/dist/asset/loaders/gltf/helpers.js.map +1 -1
- package/dist/asset/loaders/hdr/hdr.js +22 -15
- package/dist/asset/loaders/hdr/hdr.js.map +1 -1
- package/dist/asset/loaders/image/tga_Loader.js +2 -1
- package/dist/asset/loaders/image/tga_Loader.js.map +1 -1
- package/dist/asset/loaders/image/webimage_loader.js.map +1 -1
- package/dist/asset/loaders/loader.js +2 -2
- package/dist/asset/loaders/loader.js.map +1 -1
- package/dist/asset/model.js +9 -5
- package/dist/asset/model.js.map +1 -1
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/blitter.js +9 -11
- package/dist/blitter/blitter.js.map +1 -1
- package/dist/blitter/box.js +0 -1
- package/dist/blitter/box.js.map +1 -1
- package/dist/blitter/copy.js.map +1 -1
- package/dist/blitter/gaussianblur.js.map +1 -1
- package/dist/camera/base.js +1 -3
- package/dist/camera/base.js.map +1 -1
- package/dist/camera/camera.js +121 -37
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/fps.js +19 -17
- package/dist/camera/fps.js.map +1 -1
- package/dist/camera/orbit.js +45 -43
- package/dist/camera/orbit.js.map +1 -1
- package/dist/camera/orthocamera.js +27 -21
- package/dist/camera/orthocamera.js.map +1 -1
- package/dist/camera/perspectivecamera.js +28 -19
- package/dist/camera/perspectivecamera.js.map +1 -1
- package/dist/index.d.ts +15802 -15577
- package/dist/index.js +33 -11
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/grassmaterial.js.map +1 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +11 -5
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +10 -9
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/albedocolor.js.map +1 -1
- package/dist/material/mixins/foliage.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +66 -4
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +7 -0
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +3 -3
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/brdf.js.map +1 -1
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mixins/texture.js +3 -0
- package/dist/material/mixins/texture.js.map +1 -1
- package/dist/material/mixins/vertexcolor.js.map +1 -1
- package/dist/material/particle.js.map +1 -1
- package/dist/material/pbrblueprint.js +180 -22
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/shader/helper.js +41 -56
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/sprite.js +301 -0
- package/dist/material/sprite.js.map +1 -0
- package/dist/material/sprite3d.js +301 -0
- package/dist/material/sprite3d.js.map +1 -0
- package/dist/material/sprite3d_std.js +116 -0
- package/dist/material/sprite3d_std.js.map +1 -0
- package/dist/material/sprite3dblueprint.js +235 -0
- package/dist/material/sprite3dblueprint.js.map +1 -0
- package/dist/material/sprite_std.js +116 -0
- package/dist/material/sprite_std.js.map +1 -0
- package/dist/material/spriteblueprint.js +235 -0
- package/dist/material/spriteblueprint.js.map +1 -0
- package/dist/material/terrain-cm.js +0 -1
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/unlit.js.map +1 -1
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/fxaa.js.map +1 -1
- package/dist/posteffect/grayscale.js.map +1 -1
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/ssr.js +7 -5
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/render/abuffer_oit.js +8 -6
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +0 -10
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cluster_light.js +4 -4
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +15 -17
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/depthpass.js +3 -4
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable.js +15 -0
- package/dist/render/drawable.js.map +1 -0
- package/dist/render/drawable_mixin.js +8 -4
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +3 -1
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +67 -64
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/fullscreenquad.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +3 -1
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/globalbindgroup_allocator.js +3 -1
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/hzb.js +1 -2
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +13 -13
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/objectcolorpass.js +4 -7
- package/dist/render/objectcolorpass.js.map +1 -1
- package/dist/render/primitive.js +4 -5
- package/dist/render/primitive.js.map +1 -1
- package/dist/render/render_queue.js +10 -5
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +16 -22
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/renderpass.js +27 -52
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/rendertarget.js +5 -0
- package/dist/render/rendertarget.js.map +1 -0
- package/dist/render/screenrendertarget.js +56 -0
- package/dist/render/screenrendertarget.js.map +1 -0
- package/dist/render/shadowmap_pass.js +4 -5
- package/dist/render/shadowmap_pass.js.map +1 -1
- package/dist/render/sky.js +16 -14
- package/dist/render/sky.js.map +1 -1
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +296 -0
- package/dist/scene/basesprite.js.map +1 -0
- package/dist/scene/batchgroup.js +4 -2
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +9 -10
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/graph_node.js.map +1 -1
- package/dist/scene/light.js +22 -4
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +96 -26
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/octree.js.map +1 -1
- package/dist/scene/particlesys.js +25 -22
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/raycast_visitor.js +0 -16
- package/dist/scene/raycast_visitor.js.map +1 -1
- package/dist/scene/scene.js +7 -4
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +20 -35
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/sprite.js +18 -0
- package/dist/scene/sprite.js.map +1 -0
- package/dist/scene/sprite3d.js +18 -0
- package/dist/scene/sprite3d.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +5 -4
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grassmaterial.js +3 -1
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +65 -48
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/water.js +35 -30
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/atmosphere.js +17 -29
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/misc.js.map +1 -1
- package/dist/shaders/noise.js.map +1 -1
- package/dist/shaders/pbr.js.map +1 -1
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shaders/temporal.js.map +1 -1
- package/dist/shaders/water.js.map +1 -1
- package/dist/shadow/esm.js +1 -1
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/shader.js +3 -1
- package/dist/shadow/shader.js.map +1 -1
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadowmapper.js +6 -18
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/shapes/box.js +9 -3
- package/dist/shapes/box.js.map +1 -1
- package/dist/shapes/cylinder.js +2 -2
- package/dist/shapes/cylinder.js.map +1 -1
- package/dist/shapes/plane.js +2 -2
- package/dist/shapes/plane.js.map +1 -1
- package/dist/shapes/shape.js +2 -1
- package/dist/shapes/shape.js.map +1 -1
- package/dist/shapes/sphere.js +2 -2
- package/dist/shapes/sphere.js.map +1 -1
- package/dist/shapes/tetrahedron.js +5 -6
- package/dist/shapes/tetrahedron.js.map +1 -1
- package/dist/shapes/torus.js +2 -2
- package/dist/shapes/torus.js.map +1 -1
- package/dist/utility/aabbtree.js +1 -1
- package/dist/utility/aabbtree.js.map +1 -1
- package/dist/utility/blueprint/common/constants.js +578 -104
- package/dist/utility/blueprint/common/constants.js.map +1 -1
- package/dist/utility/blueprint/common/math.js +471 -9
- package/dist/utility/blueprint/common/math.js.map +1 -1
- package/dist/utility/blueprint/common.js +1 -1
- package/dist/utility/blueprint/common.js.map +1 -1
- package/dist/utility/blueprint/material/func.js +9 -5
- package/dist/utility/blueprint/material/func.js.map +1 -1
- package/dist/utility/blueprint/material/inputs.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +288 -80
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/blueprint/material/pbr.js +92 -4
- package/dist/utility/blueprint/material/pbr.js.map +1 -1
- package/dist/utility/blueprint/material/texture.js +62 -45
- package/dist/utility/blueprint/material/texture.js.map +1 -1
- package/dist/utility/blueprint/node.js +28 -1
- package/dist/utility/blueprint/node.js.map +1 -1
- package/dist/utility/bounding_volume.js.map +1 -1
- package/dist/utility/debug.js.map +1 -1
- package/dist/utility/draco/decoder.js.map +1 -1
- package/dist/utility/misc.js +1 -1
- package/dist/utility/misc.js.map +1 -1
- package/dist/utility/panorama.js.map +1 -1
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/rendermipmap.js.map +1 -1
- package/dist/utility/serialization/json.js +19 -15
- package/dist/utility/serialization/json.js.map +1 -1
- package/dist/utility/serialization/manager.js +89 -22
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +44 -41
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +4 -3
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +97 -9
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/common.js +102 -28
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +14 -12
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +216 -26
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +71 -100
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/misc.js +3 -2
- package/dist/utility/serialization/scene/misc.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +42 -9
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +7 -5
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +18 -15
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +3 -2
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +164 -0
- package/dist/utility/serialization/scene/sprite.js.map +1 -0
- package/dist/utility/serialization/scene/terrain.js +8 -6
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +11 -9
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js +6 -0
- package/dist/utility/serialization/types.js.map +1 -0
- package/dist/utility/shprojector.js.map +1 -1
- package/dist/utility/textures/ggxlut.js.map +1 -1
- package/dist/utility/textures/gradientnoise.js.map +1 -1
- package/dist/utility/textures/randomnoise.js.map +1 -1
- package/dist/values.js +14 -14
- package/dist/values.js.map +1 -1
- package/package.json +80 -80
package/dist/app/inputmgr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inputmgr.js","sources":["../../src/app/inputmgr.ts"],"sourcesContent":["import 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: InputEventHandler, ctx?: unknown): this {\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: InputEventHandler, ctx?: unknown): this {\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): this {\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 ): boolean {\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): PointerEventData {\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\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtimescript.js","sources":["../../src/app/runtimescript.ts"],"sourcesContent":["import type { IDisposable } from '@zephyr3d/base';\r\n\r\n/**\r\n * Base class for runtime scripts that can be attached to a host object.\r\n *\r\n * Lifecycle overview:\r\n * - onCreated(): Called once per script instance right after construction,\r\n * before any host is attached.\r\n * - onAttached(host): Called each time this instance is attached to a host.\r\n * - onUpdate(deltaTime, elapsedTime): Called every frame/tick while attached.\r\n * - onDetached(host): Called when detached from a host.\r\n * - onDestroy(): Called when the instance is no longer attached to any host\r\n * and is about to be discarded.\r\n *\r\n * Notes:\r\n * - Hooks may return a Promise to perform asynchronous work (e.g., asset loading).\r\n * - The generic host type `T` can be `IDisposable` or `null`. If `null`, the script\r\n * may operate without a concrete host.\r\n *\r\n * @typeParam T - The host type that this script attaches to. Typically implements `IDisposable`.\r\n * @public\r\n */\r\nexport class RuntimeScript<T extends IDisposable | null> {\r\n /**\r\n * Called once after construction, before the first attachment to a host.\r\n *\r\n * Use this to initialize internal state, allocate resources, or kick off\r\n * asynchronous loading needed by the script.\r\n *\r\n * @returns Optionally a Promise to await initialization.\r\n */\r\n onCreated(): void | Promise<void> {}\r\n /**\r\n * Called when the script is attached to a host.\r\n *\r\n * This may be called multiple times if the same instance attaches to different\r\n * hosts over its lifetime.\r\n *\r\n * @param _host - The host the script is being attached to.\r\n * @returns Optionally a Promise to await asynchronous setup.\r\n */\r\n onAttached(_host: T): void | Promise<void> {}\r\n /**\r\n * Called every update/tick while the script is active.\r\n *\r\n * Typical usage includes per-frame logic, animation, and input handling.\r\n *\r\n * @param _deltaTime - Time since last update in seconds.\r\n * @param _elapsedTime - Total elapsed time since start in seconds.\r\n */\r\n onUpdate(_deltaTime: number, _elapsedTime: number) {}\r\n /**\r\n * Called when the script is detached from a host.\r\n *\r\n * Use this to stop host-specific behaviors and release host-bound resources.\r\n *\r\n * @param _host - The host the script is being detached from.\r\n */\r\n onDetached(_host: T) {}\r\n /**\r\n * Called when the script has no remaining hosts and is about to be discarded.\r\n *\r\n * Use this to release global resources and finalize the script's lifecycle.\r\n * This is the terminal lifecycle hook for an instance.\r\n */\r\n onDestroy() {}\r\n}\r\n"],"names":["RuntimeScript","onCreated","onAttached","_host","onUpdate","_deltaTime","_elapsedTime","onDetached","onDestroy"],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;AAmBC,IACM,MAAMA,aAAAA,CAAAA;AACX;;;;;;;AAOC,MACDC,YAAkC;AAClC;;;;;;;;MASAC,UAAAA,CAAWC,
|
|
1
|
+
{"version":3,"file":"runtimescript.js","sources":["../../src/app/runtimescript.ts"],"sourcesContent":["import type { IDisposable, Nullable } from '@zephyr3d/base';\r\n\r\n/**\r\n * Base class for runtime scripts that can be attached to a host object.\r\n *\r\n * Lifecycle overview:\r\n * - onCreated(): Called once per script instance right after construction,\r\n * before any host is attached.\r\n * - onAttached(host): Called each time this instance is attached to a host.\r\n * - onUpdate(deltaTime, elapsedTime): Called every frame/tick while attached.\r\n * - onDetached(host): Called when detached from a host.\r\n * - onDestroy(): Called when the instance is no longer attached to any host\r\n * and is about to be discarded.\r\n *\r\n * Notes:\r\n * - Hooks may return a Promise to perform asynchronous work (e.g., asset loading).\r\n * - The generic host type `T` can be `IDisposable` or `null`. If `null`, the script\r\n * may operate without a concrete host.\r\n *\r\n * @typeParam T - The host type that this script attaches to. Typically implements `IDisposable`.\r\n * @public\r\n */\r\nexport class RuntimeScript<T extends IDisposable | null> {\r\n /**\r\n * Called once after construction, before the first attachment to a host.\r\n *\r\n * Use this to initialize internal state, allocate resources, or kick off\r\n * asynchronous loading needed by the script.\r\n *\r\n * @returns Optionally a Promise to await initialization.\r\n */\r\n onCreated(): void | Promise<void> {}\r\n /**\r\n * Called when the script is attached to a host.\r\n *\r\n * This may be called multiple times if the same instance attaches to different\r\n * hosts over its lifetime.\r\n *\r\n * @param _host - The host the script is being attached to.\r\n * @returns Optionally a Promise to await asynchronous setup.\r\n */\r\n onAttached(_host: Nullable<T>): void | Promise<void> {}\r\n /**\r\n * Called every update/tick while the script is active.\r\n *\r\n * Typical usage includes per-frame logic, animation, and input handling.\r\n *\r\n * @param _deltaTime - Time since last update in seconds.\r\n * @param _elapsedTime - Total elapsed time since start in seconds.\r\n */\r\n onUpdate(_deltaTime: number, _elapsedTime: number) {}\r\n /**\r\n * Called when the script is detached from a host.\r\n *\r\n * Use this to stop host-specific behaviors and release host-bound resources.\r\n *\r\n * @param _host - The host the script is being detached from.\r\n */\r\n onDetached(_host: T) {}\r\n /**\r\n * Called when the script has no remaining hosts and is about to be discarded.\r\n *\r\n * Use this to release global resources and finalize the script's lifecycle.\r\n * This is the terminal lifecycle hook for an instance.\r\n */\r\n onDestroy() {}\r\n}\r\n"],"names":["RuntimeScript","onCreated","onAttached","_host","onUpdate","_deltaTime","_elapsedTime","onDetached","onDestroy"],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;AAmBC,IACM,MAAMA,aAAAA,CAAAA;AACX;;;;;;;AAOC,MACDC,YAAkC;AAClC;;;;;;;;MASAC,UAAAA,CAAWC,KAAkB,EAAwB;AACrD;;;;;;;AAOC,MACDC,QAASC,CAAAA,UAAkB,EAAEC,YAAoB,EAAE;AACnD;;;;;;MAOAC,UAAAA,CAAWJ,KAAQ,EAAE;AACrB;;;;;AAKC,MACDK,YAAY;AACd;;;;"}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { Vector2 } from '@zephyr3d/base';
|
|
2
|
+
import { getDevice } from './api.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Adapts a given physical viewport to a logical design resolution,
|
|
6
|
+
* and provides coordinate transforms between canvas and logical spaces.
|
|
7
|
+
*
|
|
8
|
+
* @public
|
|
9
|
+
*/ class ScreenAdapter {
|
|
10
|
+
_config;
|
|
11
|
+
_transform;
|
|
12
|
+
_viewport;
|
|
13
|
+
_resolvedViewport;
|
|
14
|
+
_version;
|
|
15
|
+
/**
|
|
16
|
+
* Creates a new {@link ScreenAdapter}.
|
|
17
|
+
*
|
|
18
|
+
* @param config - Optional initial screen configuration. If omitted,
|
|
19
|
+
* a default of 1280×720 with 'cover' mode is used.
|
|
20
|
+
*/ constructor(config){
|
|
21
|
+
this._viewport = null;
|
|
22
|
+
this._transform = null;
|
|
23
|
+
this._resolvedViewport = null;
|
|
24
|
+
this._version = 1;
|
|
25
|
+
this._config = {
|
|
26
|
+
...this.getDefaultConfig(),
|
|
27
|
+
...config
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Returns the current design resolution configuration.
|
|
32
|
+
*/ get config() {
|
|
33
|
+
return this._config;
|
|
34
|
+
}
|
|
35
|
+
set config(config) {
|
|
36
|
+
this._config = {
|
|
37
|
+
...this.getDefaultConfig(),
|
|
38
|
+
...config
|
|
39
|
+
};
|
|
40
|
+
this._transform = null;
|
|
41
|
+
this._version++;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Returns the viewport of the screen
|
|
45
|
+
*/ get viewport() {
|
|
46
|
+
return this._viewport;
|
|
47
|
+
}
|
|
48
|
+
set viewport(vp) {
|
|
49
|
+
if (this._viewport !== vp) {
|
|
50
|
+
this._viewport = vp?.slice() ?? null;
|
|
51
|
+
this.resolveViewport();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Returns the version of the screen adapter
|
|
56
|
+
*/ get version() {
|
|
57
|
+
this.resolveViewport();
|
|
58
|
+
return this._version;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Returns the calculated resolution transform
|
|
62
|
+
*/ get transform() {
|
|
63
|
+
this.resolveViewport();
|
|
64
|
+
if (!this._transform) {
|
|
65
|
+
this._transform = this.calculateResolutionTransform(this._resolvedViewport[0], this._resolvedViewport[1], this._resolvedViewport[2], this._resolvedViewport[3]);
|
|
66
|
+
}
|
|
67
|
+
return this._transform;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Computes the resolution transform for a given viewport in canvas coordinates.
|
|
71
|
+
*
|
|
72
|
+
* @param viewportX - X position of the provided viewport (CSS pixels).
|
|
73
|
+
* @param viewportY - Y position of the provided viewport (CSS pixels).
|
|
74
|
+
* @param viewportWidth - Width of the provided viewport (CSS pixels).
|
|
75
|
+
* @param viewportHeight - Height of the provided viewport (CSS pixels).
|
|
76
|
+
* @returns A {@link ResolutionTransform} describing the adjusted viewport
|
|
77
|
+
* and coordinate transforms. If any dimension is non-positive, a
|
|
78
|
+
* transform with zero-sized viewport and identity-like transforms is returned.
|
|
79
|
+
*/ calculateResolutionTransform(viewportX, viewportY, viewportWidth, viewportHeight) {
|
|
80
|
+
const { designWidth, designHeight, scaleMode } = this._config;
|
|
81
|
+
// Guard against invalid dimensions.
|
|
82
|
+
if (viewportWidth <= 0 || viewportHeight <= 0 || designWidth <= 0 || designHeight <= 0) {
|
|
83
|
+
return {
|
|
84
|
+
viewportX,
|
|
85
|
+
viewportY,
|
|
86
|
+
viewportWidth: 0,
|
|
87
|
+
viewportHeight: 0,
|
|
88
|
+
croppedViewport: {
|
|
89
|
+
x: viewportX,
|
|
90
|
+
y: viewportY,
|
|
91
|
+
width: 0,
|
|
92
|
+
height: 0
|
|
93
|
+
},
|
|
94
|
+
canvasToViewport: {
|
|
95
|
+
scaleX: 1,
|
|
96
|
+
scaleY: 1,
|
|
97
|
+
offsetX: 0,
|
|
98
|
+
offsetY: 0
|
|
99
|
+
},
|
|
100
|
+
canvasToLogic: {
|
|
101
|
+
scaleX: 1,
|
|
102
|
+
scaleY: 1,
|
|
103
|
+
offsetX: 0,
|
|
104
|
+
offsetY: 0
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const sx = viewportWidth / designWidth;
|
|
109
|
+
const sy = viewportHeight / designHeight;
|
|
110
|
+
let scaleX = 1;
|
|
111
|
+
let scaleY = 1;
|
|
112
|
+
let finalViewportWidth = viewportWidth;
|
|
113
|
+
let finalViewportHeight = viewportHeight;
|
|
114
|
+
let finalViewportX = viewportX;
|
|
115
|
+
let finalViewportY = viewportY;
|
|
116
|
+
switch(scaleMode){
|
|
117
|
+
case 'fit':
|
|
118
|
+
{
|
|
119
|
+
// Uniform scale, entire design area visible, may add letterboxing.
|
|
120
|
+
const s = Math.min(sx, sy);
|
|
121
|
+
scaleX = scaleY = s;
|
|
122
|
+
finalViewportWidth = designWidth * s;
|
|
123
|
+
finalViewportHeight = designHeight * s;
|
|
124
|
+
finalViewportX = viewportX + (viewportWidth - finalViewportWidth) * 0.5;
|
|
125
|
+
finalViewportY = viewportY + (viewportHeight - finalViewportHeight) * 0.5;
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
case 'cover':
|
|
129
|
+
{
|
|
130
|
+
// Uniform scale, viewport fully covered, design area may be cropped.
|
|
131
|
+
const s = Math.max(sx, sy);
|
|
132
|
+
scaleX = scaleY = s;
|
|
133
|
+
finalViewportWidth = designWidth * s;
|
|
134
|
+
finalViewportHeight = designHeight * s;
|
|
135
|
+
finalViewportX = viewportX + (viewportWidth - finalViewportWidth) * 0.5;
|
|
136
|
+
finalViewportY = viewportY + (viewportHeight - finalViewportHeight) * 0.5;
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
case 'stretch':
|
|
140
|
+
{
|
|
141
|
+
// Non-uniform scale, stretch to fill the viewport.
|
|
142
|
+
scaleX = sx;
|
|
143
|
+
scaleY = sy;
|
|
144
|
+
finalViewportWidth = viewportWidth;
|
|
145
|
+
finalViewportHeight = viewportHeight;
|
|
146
|
+
finalViewportX = viewportX;
|
|
147
|
+
finalViewportY = viewportY;
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
case 'fit-width':
|
|
151
|
+
{
|
|
152
|
+
// Match width exactly; height follows aspect ratio.
|
|
153
|
+
const s = sx; // width-driven
|
|
154
|
+
scaleX = scaleY = s;
|
|
155
|
+
finalViewportWidth = designWidth * s; // == viewportWidth
|
|
156
|
+
finalViewportHeight = designHeight * s; // may be > or < viewportHeight
|
|
157
|
+
finalViewportX = viewportX;
|
|
158
|
+
finalViewportY = viewportY + (viewportHeight - finalViewportHeight) * 0.5;
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
case 'fit-height':
|
|
162
|
+
{
|
|
163
|
+
// Match height exactly; width follows aspect ratio.
|
|
164
|
+
const s = sy; // height-driven
|
|
165
|
+
scaleX = scaleY = s;
|
|
166
|
+
finalViewportHeight = designHeight * s; // == viewportHeight
|
|
167
|
+
finalViewportWidth = designWidth * s; // may be > or < viewportWidth
|
|
168
|
+
finalViewportY = viewportY;
|
|
169
|
+
finalViewportX = viewportX + (viewportWidth - finalViewportWidth) * 0.5;
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// calculate cropped viewport
|
|
174
|
+
const adjLeft = finalViewportX;
|
|
175
|
+
const adjTop = finalViewportY;
|
|
176
|
+
const adjRight = finalViewportX + finalViewportWidth;
|
|
177
|
+
const adjBottom = finalViewportY + finalViewportHeight;
|
|
178
|
+
const rawLeft = viewportX;
|
|
179
|
+
const rawTop = viewportY;
|
|
180
|
+
const rawRight = viewportX + viewportWidth;
|
|
181
|
+
const rawBottom = viewportY + viewportHeight;
|
|
182
|
+
const cropLeft = Math.max(adjLeft, rawLeft);
|
|
183
|
+
const cropTop = Math.max(adjTop, rawTop);
|
|
184
|
+
const cropRight = Math.min(adjRight, rawRight);
|
|
185
|
+
const cropBottom = Math.min(adjBottom, rawBottom);
|
|
186
|
+
let croppedViewport;
|
|
187
|
+
if (cropRight <= cropLeft || cropBottom <= cropTop) {
|
|
188
|
+
// No intersection
|
|
189
|
+
croppedViewport = {
|
|
190
|
+
x: viewportX,
|
|
191
|
+
y: viewportY,
|
|
192
|
+
width: 0,
|
|
193
|
+
height: 0
|
|
194
|
+
};
|
|
195
|
+
} else {
|
|
196
|
+
croppedViewport = {
|
|
197
|
+
x: cropLeft,
|
|
198
|
+
y: cropTop,
|
|
199
|
+
width: cropRight - cropLeft,
|
|
200
|
+
height: cropBottom - cropTop
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
// Transform: canvas -> viewport-local
|
|
204
|
+
// viewportLocalX = canvasX - finalViewportX
|
|
205
|
+
// viewportLocalY = canvasY - finalViewportY
|
|
206
|
+
const canvasToViewport = {
|
|
207
|
+
scaleX: 1,
|
|
208
|
+
scaleY: 1,
|
|
209
|
+
offsetX: -finalViewportX,
|
|
210
|
+
offsetY: -finalViewportY
|
|
211
|
+
};
|
|
212
|
+
// Transform: canvas -> logic (design space)
|
|
213
|
+
//
|
|
214
|
+
// canvas -> viewport-local:
|
|
215
|
+
// vx = canvasX - finalViewportX
|
|
216
|
+
// vy = canvasY - finalViewportY
|
|
217
|
+
//
|
|
218
|
+
// viewport-local -> logic:
|
|
219
|
+
// logicX = vx / scaleX
|
|
220
|
+
// logicY = vy / scaleY
|
|
221
|
+
//
|
|
222
|
+
// Combined:
|
|
223
|
+
// logicX = (canvasX - finalViewportX) / scaleX
|
|
224
|
+
// = (1 / scaleX) * canvasX + (-finalViewportX / scaleX)
|
|
225
|
+
// logicY = (canvasY - finalViewportY) / scaleY
|
|
226
|
+
// = (1 / scaleY) * canvasY + (-finalViewportY / scaleY)
|
|
227
|
+
const canvasToLogic = {
|
|
228
|
+
scaleX: 1 / scaleX,
|
|
229
|
+
scaleY: 1 / scaleY,
|
|
230
|
+
offsetX: -finalViewportX / scaleX,
|
|
231
|
+
offsetY: -finalViewportY / scaleY
|
|
232
|
+
};
|
|
233
|
+
return {
|
|
234
|
+
viewportX: finalViewportX,
|
|
235
|
+
viewportY: finalViewportY,
|
|
236
|
+
viewportWidth: finalViewportWidth,
|
|
237
|
+
viewportHeight: finalViewportHeight,
|
|
238
|
+
croppedViewport,
|
|
239
|
+
canvasToViewport,
|
|
240
|
+
canvasToLogic
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Converts canvas coordinates into adjusted viewport-local coordinates.
|
|
245
|
+
*
|
|
246
|
+
* @remarks
|
|
247
|
+
* This is mainly intended for picking / hit testing within the active
|
|
248
|
+
* rendering region, where (0, 0) corresponds to the top-left of the
|
|
249
|
+
* adapted viewport.
|
|
250
|
+
*
|
|
251
|
+
* @param canvasPos - Point in canvas coordinates (CSS pixels).
|
|
252
|
+
* @param viewportPosOut - Optional output vector. If provided, it will be
|
|
253
|
+
* written into and returned; otherwise a new {@link Vector2} is allocated.
|
|
254
|
+
* @returns The point in viewport-local coordinates.
|
|
255
|
+
*/ canvasPosToViewport(canvasPos, viewportPosOut) {
|
|
256
|
+
return this.transformPoint(this.transform.canvasToViewport, canvasPos, viewportPosOut);
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Converts canvas coordinates into logical coordinates in the design
|
|
260
|
+
* resolution space.
|
|
261
|
+
*
|
|
262
|
+
* @remarks
|
|
263
|
+
* This is mainly intended for UI editing and interaction, so that logic
|
|
264
|
+
* works consistently in the designWidth × designHeight coordinate system.
|
|
265
|
+
*
|
|
266
|
+
* @param canvasPos - Point in canvas coordinates (CSS pixels).
|
|
267
|
+
* @param logicPosOut - Optional output vector. If provided, it will be
|
|
268
|
+
* written into and returned; otherwise a new {@link Vector2} is allocated.
|
|
269
|
+
* @returns The point in logical (design resolution) coordinates.
|
|
270
|
+
*/ canvasPosToLogic(canvasPos, logicPosOut) {
|
|
271
|
+
return this.transformPoint(this.transform.canvasToLogic, canvasPos, logicPosOut);
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Applies a 2D affine transform to a point.
|
|
275
|
+
*
|
|
276
|
+
* The transform is applied as:
|
|
277
|
+
*
|
|
278
|
+
* out.x = in.x * scaleX + offsetX
|
|
279
|
+
* out.y = in.y * scaleY + offsetY
|
|
280
|
+
*
|
|
281
|
+
* @param transform - Transform parameters (scale and offset).
|
|
282
|
+
* @param pointIn - Input point.
|
|
283
|
+
* @param pointOut - Optional output vector. If provided, it will be
|
|
284
|
+
* written into and returned; otherwise a new {@link Vector2} is allocated.
|
|
285
|
+
* @returns The transformed point.
|
|
286
|
+
*/ transformPoint(transform, pointIn, pointOut) {
|
|
287
|
+
const out = pointOut ?? new Vector2();
|
|
288
|
+
out.x = pointIn.x * transform.scaleX + transform.offsetX;
|
|
289
|
+
out.y = pointIn.y * transform.scaleY + transform.offsetY;
|
|
290
|
+
return out;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Resolves the current viewport, updating internal state as needed.
|
|
294
|
+
*/ resolveViewport() {
|
|
295
|
+
const device = getDevice();
|
|
296
|
+
const vp = this._viewport?.slice() ?? [
|
|
297
|
+
0,
|
|
298
|
+
0,
|
|
299
|
+
device.deviceXToScreen(device.getDrawingBufferWidth()),
|
|
300
|
+
device.deviceYToScreen(device.getDrawingBufferHeight())
|
|
301
|
+
];
|
|
302
|
+
if (this._resolvedViewport !== vp) {
|
|
303
|
+
this._resolvedViewport = vp;
|
|
304
|
+
this._version++;
|
|
305
|
+
this._transform = null;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
getDefaultConfig() {
|
|
309
|
+
return {
|
|
310
|
+
designWidth: 1280,
|
|
311
|
+
designHeight: 720,
|
|
312
|
+
scaleMode: 'cover'
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
export { ScreenAdapter };
|
|
318
|
+
//# sourceMappingURL=screen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen.js","sources":["../../src/app/screen.ts"],"sourcesContent":["import type { Immutable, Nullable, Rect } from '@zephyr3d/base';\r\nimport { Vector2 } from '@zephyr3d/base';\r\nimport { getDevice } from './api';\r\n\r\n/**\r\n * Scaling mode used to adapt the design resolution to the viewport.\r\n *\r\n * - 'fit' – Preserve aspect ratio, show whole design area, may add letterboxing (black bars).\r\n * - 'fit-width' – Match viewport width exactly; height follows aspect ratio (may crop or letterbox vertically).\r\n * - 'fit-height' – Match viewport height exactly; width follows aspect ratio (may crop or letterbox horizontall\r\n * - 'cover' – Preserve aspect ratio, fill the entire viewport, design area may be cropped.\r\n * - 'stretch' – Do not preserve aspect ratio, stretch to fill the viewport.\r\n *\r\n * @public\r\n */\r\nexport type ScreenScaleMode = 'fit' | 'fit-width' | 'fit-height' | 'cover' | 'stretch';\r\n\r\n/**\r\n * Screen adapter configuration\r\n *\r\n * @public\r\n */\r\nexport type ScreenConfig = {\r\n /** Logical width in the design resolution coordinate system. */\r\n designWidth: number;\r\n /** Logical height in the design resolution coordinate system. */\r\n designHeight: number;\r\n /** Scaling mode used to adapt the design resolution to the viewport. */\r\n scaleMode: ScreenScaleMode;\r\n};\r\n\r\n/**\r\n * Parameters used to describe a 2D affine transform in the form:\r\n *\r\n * outX = inX * scaleX + offsetX\r\n * outY = inY * scaleY + offsetY\r\n */\r\nexport type PointTransform = {\r\n scaleX: number;\r\n scaleY: number;\r\n offsetX: number;\r\n offsetY: number;\r\n};\r\n\r\n/**\r\n * Resolution transform information derived from a {@link ScreenConfig}\r\n * and a concrete viewport rectangle.\r\n */\r\nexport type ResolutionTransform = {\r\n /**\r\n * X position of the adjusted viewport in canvas coordinates (CSS pixels).\r\n */\r\n viewportX: number;\r\n /**\r\n * Y position of the adjusted viewport in canvas coordinates (CSS pixels).\r\n */\r\n viewportY: number;\r\n /**\r\n * Width of the adjusted viewport in canvas coordinates (CSS pixels).\r\n */\r\n viewportWidth: number;\r\n /**\r\n * Height of the adjusted viewport in canvas coordinates (CSS pixels).\r\n */\r\n viewportHeight: number;\r\n /**\r\n * Visible part of the adjusted viewport, i.e. intersection with original viewport.\r\n **/\r\n croppedViewport: Rect;\r\n /**\r\n * Transform from canvas coordinates to the adjusted viewport's local coordinates.\r\n *\r\n * Typically used to convert mouse / pointer positions into the active rendering region.\r\n */\r\n canvasToViewport: PointTransform;\r\n /**\r\n * Transform from canvas coordinates to logical coordinates in the\r\n * design resolution space.\r\n *\r\n * Typically used for UI editing and interaction, so that logic consistently\r\n * works in designWidth × designHeight space.\r\n */\r\n canvasToLogic: PointTransform;\r\n};\r\n\r\n/**\r\n * Adapts a given physical viewport to a logical design resolution,\r\n * and provides coordinate transforms between canvas and logical spaces.\r\n *\r\n * @public\r\n */\r\nexport class ScreenAdapter {\r\n private _config!: ScreenConfig;\r\n private _transform: Nullable<ResolutionTransform>;\r\n private _viewport: Nullable<Immutable<number[]>>;\r\n private _resolvedViewport: Nullable<Immutable<number[]>>;\r\n private _version: number;\r\n /**\r\n * Creates a new {@link ScreenAdapter}.\r\n *\r\n * @param config - Optional initial screen configuration. If omitted,\r\n * a default of 1280×720 with 'cover' mode is used.\r\n */\r\n constructor(config?: Immutable<ScreenConfig>) {\r\n this._viewport = null;\r\n this._transform = null;\r\n this._resolvedViewport = null;\r\n this._version = 1;\r\n this._config = { ...this.getDefaultConfig(), ...config };\r\n }\r\n /**\r\n * Returns the current design resolution configuration.\r\n */\r\n get config(): Immutable<ScreenConfig> {\r\n return this._config;\r\n }\r\n set config(config: Immutable<ScreenConfig>) {\r\n this._config = { ...this.getDefaultConfig(), ...config };\r\n this._transform = null;\r\n this._version++;\r\n }\r\n /**\r\n * Returns the viewport of the screen\r\n */\r\n get viewport(): Nullable<Immutable<number[]>> {\r\n return this._viewport;\r\n }\r\n set viewport(vp: Nullable<Immutable<number[]>>) {\r\n if (this._viewport !== vp) {\r\n this._viewport = vp?.slice() ?? null;\r\n this.resolveViewport();\r\n }\r\n }\r\n /**\r\n * Returns the version of the screen adapter\r\n */\r\n get version() {\r\n this.resolveViewport();\r\n return this._version;\r\n }\r\n /**\r\n * Returns the calculated resolution transform\r\n */\r\n get transform(): Immutable<ResolutionTransform> {\r\n this.resolveViewport();\r\n if (!this._transform) {\r\n this._transform = this.calculateResolutionTransform(\r\n this._resolvedViewport![0],\r\n this._resolvedViewport![1],\r\n this._resolvedViewport![2],\r\n this._resolvedViewport![3]\r\n );\r\n }\r\n return this._transform;\r\n }\r\n /**\r\n * Computes the resolution transform for a given viewport in canvas coordinates.\r\n *\r\n * @param viewportX - X position of the provided viewport (CSS pixels).\r\n * @param viewportY - Y position of the provided viewport (CSS pixels).\r\n * @param viewportWidth - Width of the provided viewport (CSS pixels).\r\n * @param viewportHeight - Height of the provided viewport (CSS pixels).\r\n * @returns A {@link ResolutionTransform} describing the adjusted viewport\r\n * and coordinate transforms. If any dimension is non-positive, a\r\n * transform with zero-sized viewport and identity-like transforms is returned.\r\n */\r\n calculateResolutionTransform(\r\n viewportX: number,\r\n viewportY: number,\r\n viewportWidth: number,\r\n viewportHeight: number\r\n ) {\r\n const { designWidth, designHeight, scaleMode } = this._config;\r\n\r\n // Guard against invalid dimensions.\r\n if (viewportWidth <= 0 || viewportHeight <= 0 || designWidth <= 0 || designHeight <= 0) {\r\n return {\r\n viewportX,\r\n viewportY,\r\n viewportWidth: 0,\r\n viewportHeight: 0,\r\n croppedViewport: { x: viewportX, y: viewportY, width: 0, height: 0 },\r\n canvasToViewport: { scaleX: 1, scaleY: 1, offsetX: 0, offsetY: 0 },\r\n canvasToLogic: { scaleX: 1, scaleY: 1, offsetX: 0, offsetY: 0 }\r\n };\r\n }\r\n\r\n const sx = viewportWidth / designWidth;\r\n const sy = viewportHeight / designHeight;\r\n\r\n let scaleX = 1;\r\n let scaleY = 1;\r\n let finalViewportWidth = viewportWidth;\r\n let finalViewportHeight = viewportHeight;\r\n let finalViewportX = viewportX;\r\n let finalViewportY = viewportY;\r\n\r\n switch (scaleMode) {\r\n case 'fit': {\r\n // Uniform scale, entire design area visible, may add letterboxing.\r\n const s = Math.min(sx, sy);\r\n scaleX = scaleY = s;\r\n finalViewportWidth = designWidth * s;\r\n finalViewportHeight = designHeight * s;\r\n finalViewportX = viewportX + (viewportWidth - finalViewportWidth) * 0.5;\r\n finalViewportY = viewportY + (viewportHeight - finalViewportHeight) * 0.5;\r\n break;\r\n }\r\n case 'cover': {\r\n // Uniform scale, viewport fully covered, design area may be cropped.\r\n const s = Math.max(sx, sy);\r\n scaleX = scaleY = s;\r\n finalViewportWidth = designWidth * s;\r\n finalViewportHeight = designHeight * s;\r\n finalViewportX = viewportX + (viewportWidth - finalViewportWidth) * 0.5;\r\n finalViewportY = viewportY + (viewportHeight - finalViewportHeight) * 0.5;\r\n break;\r\n }\r\n case 'stretch': {\r\n // Non-uniform scale, stretch to fill the viewport.\r\n scaleX = sx;\r\n scaleY = sy;\r\n finalViewportWidth = viewportWidth;\r\n finalViewportHeight = viewportHeight;\r\n finalViewportX = viewportX;\r\n finalViewportY = viewportY;\r\n break;\r\n }\r\n case 'fit-width': {\r\n // Match width exactly; height follows aspect ratio.\r\n const s = sx; // width-driven\r\n scaleX = scaleY = s;\r\n finalViewportWidth = designWidth * s; // == viewportWidth\r\n finalViewportHeight = designHeight * s; // may be > or < viewportHeight\r\n finalViewportX = viewportX;\r\n finalViewportY = viewportY + (viewportHeight - finalViewportHeight) * 0.5;\r\n break;\r\n }\r\n case 'fit-height': {\r\n // Match height exactly; width follows aspect ratio.\r\n const s = sy; // height-driven\r\n scaleX = scaleY = s;\r\n finalViewportHeight = designHeight * s; // == viewportHeight\r\n finalViewportWidth = designWidth * s; // may be > or < viewportWidth\r\n finalViewportY = viewportY;\r\n finalViewportX = viewportX + (viewportWidth - finalViewportWidth) * 0.5;\r\n break;\r\n }\r\n }\r\n\r\n // calculate cropped viewport\r\n const adjLeft = finalViewportX;\r\n const adjTop = finalViewportY;\r\n const adjRight = finalViewportX + finalViewportWidth;\r\n const adjBottom = finalViewportY + finalViewportHeight;\r\n\r\n const rawLeft = viewportX;\r\n const rawTop = viewportY;\r\n const rawRight = viewportX + viewportWidth;\r\n const rawBottom = viewportY + viewportHeight;\r\n\r\n const cropLeft = Math.max(adjLeft, rawLeft);\r\n const cropTop = Math.max(adjTop, rawTop);\r\n const cropRight = Math.min(adjRight, rawRight);\r\n const cropBottom = Math.min(adjBottom, rawBottom);\r\n\r\n let croppedViewport: Rect;\r\n if (cropRight <= cropLeft || cropBottom <= cropTop) {\r\n // No intersection\r\n croppedViewport = {\r\n x: viewportX,\r\n y: viewportY,\r\n width: 0,\r\n height: 0\r\n };\r\n } else {\r\n croppedViewport = {\r\n x: cropLeft,\r\n y: cropTop,\r\n width: cropRight - cropLeft,\r\n height: cropBottom - cropTop\r\n };\r\n }\r\n\r\n // Transform: canvas -> viewport-local\r\n // viewportLocalX = canvasX - finalViewportX\r\n // viewportLocalY = canvasY - finalViewportY\r\n const canvasToViewport: PointTransform = {\r\n scaleX: 1,\r\n scaleY: 1,\r\n offsetX: -finalViewportX,\r\n offsetY: -finalViewportY\r\n };\r\n\r\n // Transform: canvas -> logic (design space)\r\n //\r\n // canvas -> viewport-local:\r\n // vx = canvasX - finalViewportX\r\n // vy = canvasY - finalViewportY\r\n //\r\n // viewport-local -> logic:\r\n // logicX = vx / scaleX\r\n // logicY = vy / scaleY\r\n //\r\n // Combined:\r\n // logicX = (canvasX - finalViewportX) / scaleX\r\n // = (1 / scaleX) * canvasX + (-finalViewportX / scaleX)\r\n // logicY = (canvasY - finalViewportY) / scaleY\r\n // = (1 / scaleY) * canvasY + (-finalViewportY / scaleY)\r\n const canvasToLogic: PointTransform = {\r\n scaleX: 1 / scaleX,\r\n scaleY: 1 / scaleY,\r\n offsetX: -finalViewportX / scaleX,\r\n offsetY: -finalViewportY / scaleY\r\n };\r\n\r\n return {\r\n viewportX: finalViewportX,\r\n viewportY: finalViewportY,\r\n viewportWidth: finalViewportWidth,\r\n viewportHeight: finalViewportHeight,\r\n croppedViewport,\r\n canvasToViewport,\r\n canvasToLogic\r\n };\r\n }\r\n /**\r\n * Converts canvas coordinates into adjusted viewport-local coordinates.\r\n *\r\n * @remarks\r\n * This is mainly intended for picking / hit testing within the active\r\n * rendering region, where (0, 0) corresponds to the top-left of the\r\n * adapted viewport.\r\n *\r\n * @param canvasPos - Point in canvas coordinates (CSS pixels).\r\n * @param viewportPosOut - Optional output vector. If provided, it will be\r\n * written into and returned; otherwise a new {@link Vector2} is allocated.\r\n * @returns The point in viewport-local coordinates.\r\n */\r\n canvasPosToViewport(canvasPos: Vector2, viewportPosOut?: Vector2) {\r\n return this.transformPoint(this.transform.canvasToViewport, canvasPos, viewportPosOut);\r\n }\r\n /**\r\n * Converts canvas coordinates into logical coordinates in the design\r\n * resolution space.\r\n *\r\n * @remarks\r\n * This is mainly intended for UI editing and interaction, so that logic\r\n * works consistently in the designWidth × designHeight coordinate system.\r\n *\r\n * @param canvasPos - Point in canvas coordinates (CSS pixels).\r\n * @param logicPosOut - Optional output vector. If provided, it will be\r\n * written into and returned; otherwise a new {@link Vector2} is allocated.\r\n * @returns The point in logical (design resolution) coordinates.\r\n */\r\n canvasPosToLogic(canvasPos: Vector2, logicPosOut?: Vector2) {\r\n return this.transformPoint(this.transform.canvasToLogic, canvasPos, logicPosOut);\r\n }\r\n /**\r\n * Applies a 2D affine transform to a point.\r\n *\r\n * The transform is applied as:\r\n *\r\n * out.x = in.x * scaleX + offsetX\r\n * out.y = in.y * scaleY + offsetY\r\n *\r\n * @param transform - Transform parameters (scale and offset).\r\n * @param pointIn - Input point.\r\n * @param pointOut - Optional output vector. If provided, it will be\r\n * written into and returned; otherwise a new {@link Vector2} is allocated.\r\n * @returns The transformed point.\r\n */\r\n transformPoint(transform: PointTransform, pointIn: Vector2, pointOut?: Vector2) {\r\n const out = pointOut ?? new Vector2();\r\n out.x = pointIn.x * transform.scaleX + transform.offsetX;\r\n out.y = pointIn.y * transform.scaleY + transform.offsetY;\r\n return out;\r\n }\r\n /**\r\n * Resolves the current viewport, updating internal state as needed.\r\n */\r\n resolveViewport() {\r\n const device = getDevice();\r\n const vp = this._viewport?.slice() ?? [\r\n 0,\r\n 0,\r\n device.deviceXToScreen(device.getDrawingBufferWidth()),\r\n device.deviceYToScreen(device.getDrawingBufferHeight())\r\n ];\r\n if (this._resolvedViewport !== vp) {\r\n this._resolvedViewport = vp;\r\n this._version++;\r\n this._transform = null;\r\n }\r\n }\r\n private getDefaultConfig(): ScreenConfig {\r\n return {\r\n designWidth: 1280,\r\n designHeight: 720,\r\n scaleMode: 'cover'\r\n };\r\n }\r\n}\r\n"],"names":["ScreenAdapter","_config","_transform","_viewport","_resolvedViewport","_version","config","getDefaultConfig","viewport","vp","slice","resolveViewport","version","transform","calculateResolutionTransform","viewportX","viewportY","viewportWidth","viewportHeight","designWidth","designHeight","scaleMode","croppedViewport","x","y","width","height","canvasToViewport","scaleX","scaleY","offsetX","offsetY","canvasToLogic","sx","sy","finalViewportWidth","finalViewportHeight","finalViewportX","finalViewportY","s","Math","min","max","adjLeft","adjTop","adjRight","adjBottom","rawLeft","rawTop","rawRight","rawBottom","cropLeft","cropTop","cropRight","cropBottom","canvasPosToViewport","canvasPos","viewportPosOut","transformPoint","canvasPosToLogic","logicPosOut","pointIn","pointOut","out","Vector2","device","getDevice","deviceXToScreen","getDrawingBufferWidth","deviceYToScreen","getDrawingBufferHeight"],"mappings":"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"}
|
|
@@ -30,7 +30,7 @@ import { RuntimeScript } from './runtimescript.js';
|
|
|
30
30
|
*
|
|
31
31
|
* @param opts - Optional configuration.
|
|
32
32
|
*/ constructor(opts = {}){
|
|
33
|
-
this._registry = new ScriptRegistry(opts.VFS ?? new HttpFS('./'), opts.scriptsRoot ?? '/'
|
|
33
|
+
this._registry = new ScriptRegistry(opts.VFS ?? new HttpFS('./'), opts.scriptsRoot ?? '/');
|
|
34
34
|
this._hostScripts = new Map();
|
|
35
35
|
this._scriptHosts = new Map();
|
|
36
36
|
this._importComment = opts.importComment;
|
|
@@ -152,11 +152,13 @@ import { RuntimeScript } from './runtimescript.js';
|
|
|
152
152
|
console.error(`Error occured at onDetach() of module '${it.id}': ${err}`);
|
|
153
153
|
}
|
|
154
154
|
const hostList = this._scriptHosts.get(it.instance);
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
155
|
+
if (hostList) {
|
|
156
|
+
const index = hostList.indexOf(host);
|
|
157
|
+
if (index >= 0) {
|
|
158
|
+
hostList.splice(index, 1);
|
|
159
|
+
}
|
|
158
160
|
}
|
|
159
|
-
if (hostList.length === 0) {
|
|
161
|
+
if (!hostList || hostList.length === 0) {
|
|
160
162
|
try {
|
|
161
163
|
it.instance.onDestroy();
|
|
162
164
|
} catch (err) {
|
|
@@ -210,7 +212,9 @@ import { RuntimeScript } from './runtimescript.js';
|
|
|
210
212
|
*/ detachAllScripts() {
|
|
211
213
|
while(this._hostScripts.size > 0){
|
|
212
214
|
for (const entry of this._hostScripts){
|
|
213
|
-
|
|
215
|
+
if (entry[0]) {
|
|
216
|
+
this.detachScript(entry[0]);
|
|
217
|
+
}
|
|
214
218
|
}
|
|
215
219
|
}
|
|
216
220
|
}
|