@codexo/exojs 0.6.12 → 0.7.12
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/CHANGELOG.md +1424 -0
- package/dist/esm/animation/Tween.d.ts +60 -1
- package/dist/esm/animation/Tween.js +60 -1
- package/dist/esm/animation/Tween.js.map +1 -1
- package/dist/esm/animation/TweenManager.d.ts +10 -0
- package/dist/esm/animation/TweenManager.js +10 -0
- package/dist/esm/animation/TweenManager.js.map +1 -1
- package/dist/esm/animation/types.d.ts +15 -0
- package/dist/esm/animation/types.js +6 -0
- package/dist/esm/animation/types.js.map +1 -1
- package/dist/esm/audio/AbstractMedia.d.ts +29 -0
- package/dist/esm/audio/AbstractMedia.js +76 -0
- package/dist/esm/audio/AbstractMedia.js.map +1 -1
- package/dist/esm/audio/AudioAnalyser.d.ts +83 -23
- package/dist/esm/audio/AudioAnalyser.js +277 -57
- package/dist/esm/audio/AudioAnalyser.js.map +1 -1
- package/dist/esm/audio/AudioBus.d.ts +82 -0
- package/dist/esm/audio/AudioBus.js +255 -0
- package/dist/esm/audio/AudioBus.js.map +1 -0
- package/dist/esm/audio/AudioFilter.d.ts +16 -0
- package/dist/esm/audio/AudioFilter.js +13 -0
- package/dist/esm/audio/AudioFilter.js.map +1 -0
- package/dist/esm/audio/AudioListener.d.ts +39 -0
- package/dist/esm/audio/AudioListener.js +97 -0
- package/dist/esm/audio/AudioListener.js.map +1 -0
- package/dist/esm/audio/AudioManager.d.ts +68 -0
- package/dist/esm/audio/AudioManager.js +139 -0
- package/dist/esm/audio/AudioManager.js.map +1 -0
- package/dist/esm/audio/BeatDetector.d.ts +142 -0
- package/dist/esm/audio/BeatDetector.js +957 -0
- package/dist/esm/audio/BeatDetector.js.map +1 -0
- package/dist/esm/audio/Envelope.d.ts +44 -0
- package/dist/esm/audio/Envelope.js +60 -0
- package/dist/esm/audio/Envelope.js.map +1 -0
- package/dist/esm/audio/Media.d.ts +11 -0
- package/dist/esm/audio/Music.d.ts +20 -0
- package/dist/esm/audio/Music.js +45 -4
- package/dist/esm/audio/Music.js.map +1 -1
- package/dist/esm/audio/OscillatorSound.d.ts +98 -0
- package/dist/esm/audio/OscillatorSound.js +342 -0
- package/dist/esm/audio/OscillatorSound.js.map +1 -0
- package/dist/esm/audio/Sound.d.ts +119 -9
- package/dist/esm/audio/Sound.js +301 -117
- package/dist/esm/audio/Sound.js.map +1 -1
- package/dist/esm/audio/audio-context.d.ts +48 -0
- package/dist/esm/audio/audio-context.js +48 -5
- package/dist/esm/audio/audio-context.js.map +1 -1
- package/dist/esm/audio/crossFade.d.ts +19 -0
- package/dist/esm/audio/crossFade.js +26 -0
- package/dist/esm/audio/crossFade.js.map +1 -0
- package/dist/esm/audio/dsp/fft.d.ts +22 -0
- package/dist/esm/audio/dsp/mel.d.ts +43 -0
- package/dist/esm/audio/dsp/tempogram.d.ts +51 -0
- package/dist/esm/audio/filters/ChorusFilter.d.ts +52 -0
- package/dist/esm/audio/filters/ChorusFilter.js +143 -0
- package/dist/esm/audio/filters/ChorusFilter.js.map +1 -0
- package/dist/esm/audio/filters/CompressorFilter.d.ts +43 -0
- package/dist/esm/audio/filters/CompressorFilter.js +108 -0
- package/dist/esm/audio/filters/CompressorFilter.js.map +1 -0
- package/dist/esm/audio/filters/DelayFilter.d.ts +34 -0
- package/dist/esm/audio/filters/DelayFilter.js +110 -0
- package/dist/esm/audio/filters/DelayFilter.js.map +1 -0
- package/dist/esm/audio/filters/DuckingFilter.d.ts +44 -0
- package/dist/esm/audio/filters/DuckingFilter.js +164 -0
- package/dist/esm/audio/filters/DuckingFilter.js.map +1 -0
- package/dist/esm/audio/filters/EqualizerFilter.d.ts +49 -0
- package/dist/esm/audio/filters/EqualizerFilter.js +134 -0
- package/dist/esm/audio/filters/EqualizerFilter.js.map +1 -0
- package/dist/esm/audio/filters/GranularFilter.d.ts +62 -0
- package/dist/esm/audio/filters/GranularFilter.js +176 -0
- package/dist/esm/audio/filters/GranularFilter.js.map +1 -0
- package/dist/esm/audio/filters/HighpassFilter.d.ts +29 -0
- package/dist/esm/audio/filters/HighpassFilter.js +71 -0
- package/dist/esm/audio/filters/HighpassFilter.js.map +1 -0
- package/dist/esm/audio/filters/LowpassFilter.d.ts +29 -0
- package/dist/esm/audio/filters/LowpassFilter.js +71 -0
- package/dist/esm/audio/filters/LowpassFilter.js.map +1 -0
- package/dist/esm/audio/filters/PitchShiftFilter.d.ts +44 -0
- package/dist/esm/audio/filters/PitchShiftFilter.js +132 -0
- package/dist/esm/audio/filters/PitchShiftFilter.js.map +1 -0
- package/dist/esm/audio/filters/ReverbFilter.d.ts +36 -0
- package/dist/esm/audio/filters/ReverbFilter.js +118 -0
- package/dist/esm/audio/filters/ReverbFilter.js.map +1 -0
- package/dist/esm/audio/filters/VocoderFilter.d.ts +49 -0
- package/dist/esm/audio/filters/VocoderFilter.js +174 -0
- package/dist/esm/audio/filters/VocoderFilter.js.map +1 -0
- package/dist/esm/audio/filters/WorkletFilter.d.ts +51 -0
- package/dist/esm/audio/filters/WorkletFilter.js +106 -0
- package/dist/esm/audio/filters/WorkletFilter.js.map +1 -0
- package/dist/esm/audio/filters/index.d.ts +12 -0
- package/dist/esm/audio/index.d.ts +15 -1
- package/dist/esm/audio/worklet/registerWorklet.d.ts +10 -0
- package/dist/esm/audio/worklet/registerWorklet.js +44 -0
- package/dist/esm/audio/worklet/registerWorklet.js.map +1 -0
- package/dist/esm/core/Application.d.ts +82 -0
- package/dist/esm/core/Application.js +137 -2
- package/dist/esm/core/Application.js.map +1 -1
- package/dist/esm/core/Bounds.d.ts +23 -0
- package/dist/esm/core/Bounds.js +23 -0
- package/dist/esm/core/Bounds.js.map +1 -1
- package/dist/esm/core/Clock.d.ts +21 -0
- package/dist/esm/core/Clock.js +21 -0
- package/dist/esm/core/Clock.js.map +1 -1
- package/dist/esm/core/Color.d.ts +35 -0
- package/dist/esm/core/Color.js +35 -0
- package/dist/esm/core/Color.js.map +1 -1
- package/dist/esm/core/Scene.d.ts +46 -0
- package/dist/esm/core/Scene.js +27 -0
- package/dist/esm/core/Scene.js.map +1 -1
- package/dist/esm/core/SceneManager.d.ts +62 -0
- package/dist/esm/core/SceneManager.js +49 -0
- package/dist/esm/core/SceneManager.js.map +1 -1
- package/dist/esm/core/SceneNode.d.ts +40 -1
- package/dist/esm/core/SceneNode.js +75 -6
- package/dist/esm/core/SceneNode.js.map +1 -1
- package/dist/esm/core/Signal.d.ts +44 -0
- package/dist/esm/core/Signal.js +39 -0
- package/dist/esm/core/Signal.js.map +1 -1
- package/dist/esm/core/Time.d.ts +21 -0
- package/dist/esm/core/Time.js +22 -1
- package/dist/esm/core/Time.js.map +1 -1
- package/dist/esm/core/Timer.d.ts +7 -0
- package/dist/esm/core/Timer.js +7 -0
- package/dist/esm/core/Timer.js.map +1 -1
- package/dist/esm/core/capabilities.d.ts +12 -0
- package/dist/esm/core/capabilities.js +12 -0
- package/dist/esm/core/capabilities.js.map +1 -1
- package/dist/esm/core/index.d.ts +0 -1
- package/dist/esm/core/types.d.ts +37 -0
- package/dist/esm/core/utils.d.ts +48 -0
- package/dist/esm/core/utils.js +48 -0
- package/dist/esm/core/utils.js.map +1 -1
- package/dist/esm/debug/BoundingBoxesLayer.d.ts +26 -0
- package/dist/esm/debug/BoundingBoxesLayer.js +136 -0
- package/dist/esm/debug/BoundingBoxesLayer.js.map +1 -0
- package/dist/esm/debug/DebugLayer.d.ts +42 -0
- package/dist/esm/debug/DebugLayer.js +34 -0
- package/dist/esm/debug/DebugLayer.js.map +1 -0
- package/dist/esm/debug/DebugOverlay.d.ts +59 -0
- package/dist/esm/debug/DebugOverlay.js +123 -0
- package/dist/esm/debug/DebugOverlay.js.map +1 -0
- package/dist/esm/debug/HitTestLayer.d.ts +32 -0
- package/dist/esm/debug/HitTestLayer.js +118 -0
- package/dist/esm/debug/HitTestLayer.js.map +1 -0
- package/dist/esm/debug/PerformanceLayer.d.ts +37 -0
- package/dist/esm/debug/PerformanceLayer.js +193 -0
- package/dist/esm/debug/PerformanceLayer.js.map +1 -0
- package/dist/esm/debug/PointerStackLayer.d.ts +31 -0
- package/dist/esm/debug/PointerStackLayer.js +160 -0
- package/dist/esm/debug/PointerStackLayer.js.map +1 -0
- package/dist/esm/debug/index.d.ts +6 -0
- package/dist/esm/debug/index.js +7 -0
- package/dist/esm/debug/index.js.map +1 -0
- package/dist/esm/index.js +30 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/input/ArcadeStickGamepadMapping.d.ts +7 -0
- package/dist/esm/input/ArcadeStickGamepadMapping.js +7 -0
- package/dist/esm/input/ArcadeStickGamepadMapping.js.map +1 -1
- package/dist/esm/input/GameCubeGamepadMapping.d.ts +9 -0
- package/dist/esm/input/GameCubeGamepadMapping.js +9 -0
- package/dist/esm/input/GameCubeGamepadMapping.js.map +1 -1
- package/dist/esm/input/Gamepad.d.ts +48 -0
- package/dist/esm/input/Gamepad.js +43 -0
- package/dist/esm/input/Gamepad.js.map +1 -1
- package/dist/esm/input/GamepadChannels.d.ts +8 -0
- package/dist/esm/input/GamepadChannels.js +8 -0
- package/dist/esm/input/GamepadChannels.js.map +1 -1
- package/dist/esm/input/GamepadControl.d.ts +18 -0
- package/dist/esm/input/GamepadControl.js +13 -0
- package/dist/esm/input/GamepadControl.js.map +1 -1
- package/dist/esm/input/GamepadDefinitions.d.ts +64 -1
- package/dist/esm/input/GamepadDefinitions.js +40 -1
- package/dist/esm/input/GamepadDefinitions.js.map +1 -1
- package/dist/esm/input/GamepadMapping.d.ts +32 -2
- package/dist/esm/input/GamepadMapping.js +24 -0
- package/dist/esm/input/GamepadMapping.js.map +1 -1
- package/dist/esm/input/GamepadPromptLayouts.d.ts +32 -1
- package/dist/esm/input/GamepadPromptLayouts.js +25 -1
- package/dist/esm/input/GamepadPromptLayouts.js.map +1 -1
- package/dist/esm/input/GenericDualAnalogGamepadMapping.d.ts +10 -0
- package/dist/esm/input/GenericDualAnalogGamepadMapping.js +10 -0
- package/dist/esm/input/GenericDualAnalogGamepadMapping.js.map +1 -1
- package/dist/esm/input/GestureRecognizer.d.ts +11 -2
- package/dist/esm/input/GestureRecognizer.js +11 -2
- package/dist/esm/input/GestureRecognizer.js.map +1 -1
- package/dist/esm/input/Input.d.ts +24 -0
- package/dist/esm/input/Input.js +22 -0
- package/dist/esm/input/Input.js.map +1 -1
- package/dist/esm/input/InputManager.d.ts +43 -0
- package/dist/esm/input/InputManager.js +68 -5
- package/dist/esm/input/InputManager.js.map +1 -1
- package/dist/esm/input/InteractionEvent.d.ts +31 -0
- package/dist/esm/input/InteractionEvent.js +37 -0
- package/dist/esm/input/InteractionEvent.js.map +1 -0
- package/dist/esm/input/InteractionManager.d.ts +163 -0
- package/dist/esm/input/InteractionManager.js +575 -0
- package/dist/esm/input/InteractionManager.js.map +1 -0
- package/dist/esm/input/JoyConLeftGamepadMapping.d.ts +9 -0
- package/dist/esm/input/JoyConLeftGamepadMapping.js +9 -0
- package/dist/esm/input/JoyConLeftGamepadMapping.js.map +1 -1
- package/dist/esm/input/JoyConRightGamepadMapping.d.ts +9 -0
- package/dist/esm/input/JoyConRightGamepadMapping.js +9 -0
- package/dist/esm/input/JoyConRightGamepadMapping.js.map +1 -1
- package/dist/esm/input/PlayStationGamepadMapping.d.ts +8 -0
- package/dist/esm/input/PlayStationGamepadMapping.js +8 -0
- package/dist/esm/input/PlayStationGamepadMapping.js.map +1 -1
- package/dist/esm/input/Pointer.d.ts +22 -0
- package/dist/esm/input/Pointer.js +22 -0
- package/dist/esm/input/Pointer.js.map +1 -1
- package/dist/esm/input/SteamControllerGamepadMapping.d.ts +8 -0
- package/dist/esm/input/SteamControllerGamepadMapping.js +8 -0
- package/dist/esm/input/SteamControllerGamepadMapping.js.map +1 -1
- package/dist/esm/input/SwitchProGamepadMapping.d.ts +9 -0
- package/dist/esm/input/SwitchProGamepadMapping.js +9 -0
- package/dist/esm/input/SwitchProGamepadMapping.js.map +1 -1
- package/dist/esm/input/XboxGamepadMapping.d.ts +8 -0
- package/dist/esm/input/XboxGamepadMapping.js +8 -0
- package/dist/esm/input/XboxGamepadMapping.js.map +1 -1
- package/dist/esm/input/index.d.ts +2 -0
- package/dist/esm/input/interaction-hooks.d.ts +34 -0
- package/dist/esm/input/interaction-hooks.js +35 -0
- package/dist/esm/input/interaction-hooks.js.map +1 -0
- package/dist/esm/input/types.d.ts +20 -0
- package/dist/esm/input/types.js +20 -0
- package/dist/esm/input/types.js.map +1 -1
- package/dist/esm/math/AbstractVector.d.ts +83 -0
- package/dist/esm/math/AbstractVector.js +83 -0
- package/dist/esm/math/AbstractVector.js.map +1 -1
- package/dist/esm/math/Circle.d.ts +44 -2
- package/dist/esm/math/Circle.js +116 -16
- package/dist/esm/math/Circle.js.map +1 -1
- package/dist/esm/math/CircleLike.d.ts +1 -0
- package/dist/esm/math/Collision.d.ts +39 -0
- package/dist/esm/math/Collision.js +5 -0
- package/dist/esm/math/Collision.js.map +1 -1
- package/dist/esm/math/Ellipse.d.ts +11 -0
- package/dist/esm/math/Ellipse.js +18 -2
- package/dist/esm/math/Ellipse.js.map +1 -1
- package/dist/esm/math/EllipseLike.d.ts +3 -0
- package/dist/esm/math/Flags.d.ts +31 -0
- package/dist/esm/math/Flags.js +31 -0
- package/dist/esm/math/Flags.js.map +1 -1
- package/dist/esm/math/Interval.d.ts +15 -0
- package/dist/esm/math/Interval.js +16 -1
- package/dist/esm/math/Interval.js.map +1 -1
- package/dist/esm/math/Line.d.ts +17 -1
- package/dist/esm/math/Line.js +17 -1
- package/dist/esm/math/Line.js.map +1 -1
- package/dist/esm/math/LineLike.d.ts +1 -0
- package/dist/esm/math/Matrix.d.ts +44 -3
- package/dist/esm/math/Matrix.js +44 -3
- package/dist/esm/math/Matrix.js.map +1 -1
- package/dist/esm/math/ObservableSize.d.ts +7 -0
- package/dist/esm/math/ObservableSize.js +7 -0
- package/dist/esm/math/ObservableSize.js.map +1 -1
- package/dist/esm/math/ObservableVector.d.ts +11 -2
- package/dist/esm/math/ObservableVector.js +13 -2
- package/dist/esm/math/ObservableVector.js.map +1 -1
- package/dist/esm/math/PointLike.d.ts +1 -0
- package/dist/esm/math/PolarVector.d.ts +15 -0
- package/dist/esm/math/PolarVector.js +16 -1
- package/dist/esm/math/PolarVector.js.map +1 -1
- package/dist/esm/math/Polygon.d.ts +35 -1
- package/dist/esm/math/Polygon.js +78 -6
- package/dist/esm/math/Polygon.js.map +1 -1
- package/dist/esm/math/PolygonLike.d.ts +4 -0
- package/dist/esm/math/Quadtree.d.ts +84 -0
- package/dist/esm/math/Quadtree.js +204 -0
- package/dist/esm/math/Quadtree.js.map +1 -0
- package/dist/esm/math/Random.d.ts +25 -0
- package/dist/esm/math/Random.js +26 -1
- package/dist/esm/math/Random.js.map +1 -1
- package/dist/esm/math/Rectangle.d.ts +15 -0
- package/dist/esm/math/Rectangle.js +17 -2
- package/dist/esm/math/Rectangle.js.map +1 -1
- package/dist/esm/math/RectangleLike.d.ts +1 -0
- package/dist/esm/math/Segment.d.ts +7 -0
- package/dist/esm/math/Segment.js +7 -0
- package/dist/esm/math/Segment.js.map +1 -1
- package/dist/esm/math/ShapeLike.d.ts +6 -0
- package/dist/esm/math/Size.d.ts +9 -0
- package/dist/esm/math/Size.js +10 -1
- package/dist/esm/math/Size.js.map +1 -1
- package/dist/esm/math/Vector.d.ts +16 -0
- package/dist/esm/math/Vector.js +17 -1
- package/dist/esm/math/Vector.js.map +1 -1
- package/dist/esm/math/collision-detection.d.ts +47 -1
- package/dist/esm/math/collision-detection.js +231 -17
- package/dist/esm/math/collision-detection.js.map +1 -1
- package/dist/esm/math/collision-primitives.d.ts +23 -0
- package/dist/esm/math/collision-primitives.js +23 -0
- package/dist/esm/math/collision-primitives.js.map +1 -1
- package/dist/esm/math/geometry.d.ts +42 -0
- package/dist/esm/math/geometry.js +37 -0
- package/dist/esm/math/geometry.js.map +1 -1
- package/dist/esm/math/index.d.ts +1 -0
- package/dist/esm/math/utils.d.ts +41 -0
- package/dist/esm/math/utils.js +41 -0
- package/dist/esm/math/utils.js.map +1 -1
- package/dist/esm/particles/Particle.d.ts +37 -0
- package/dist/esm/particles/Particle.js +37 -0
- package/dist/esm/particles/Particle.js.map +1 -1
- package/dist/esm/particles/ParticleProperties.d.ts +15 -0
- package/dist/esm/particles/ParticleSystem.d.ts +69 -0
- package/dist/esm/particles/ParticleSystem.js +70 -0
- package/dist/esm/particles/ParticleSystem.js.map +1 -1
- package/dist/esm/particles/affectors/ColorAffector.d.ts +13 -0
- package/dist/esm/particles/affectors/ColorAffector.js +13 -0
- package/dist/esm/particles/affectors/ColorAffector.js.map +1 -1
- package/dist/esm/particles/affectors/ForceAffector.d.ts +11 -0
- package/dist/esm/particles/affectors/ForceAffector.js +11 -0
- package/dist/esm/particles/affectors/ForceAffector.js.map +1 -1
- package/dist/esm/particles/affectors/ParticleAffector.d.ts +13 -0
- package/dist/esm/particles/affectors/ScaleAffector.d.ts +10 -0
- package/dist/esm/particles/affectors/ScaleAffector.js +10 -0
- package/dist/esm/particles/affectors/ScaleAffector.js.map +1 -1
- package/dist/esm/particles/affectors/TorqueAffector.d.ts +11 -0
- package/dist/esm/particles/affectors/TorqueAffector.js +12 -1
- package/dist/esm/particles/affectors/TorqueAffector.js.map +1 -1
- package/dist/esm/particles/emitters/ParticleEmitter.d.ts +13 -0
- package/dist/esm/particles/emitters/ParticleOptions.d.ts +16 -0
- package/dist/esm/particles/emitters/ParticleOptions.js +16 -0
- package/dist/esm/particles/emitters/ParticleOptions.js.map +1 -1
- package/dist/esm/particles/emitters/UniversalEmitter.d.ts +23 -0
- package/dist/esm/particles/emitters/UniversalEmitter.js +23 -0
- package/dist/esm/particles/emitters/UniversalEmitter.js.map +1 -1
- package/dist/esm/rendering/CallbackRenderPass.d.ts +12 -0
- package/dist/esm/rendering/CallbackRenderPass.js +12 -0
- package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
- package/dist/esm/rendering/Container.d.ts +44 -0
- package/dist/esm/rendering/Container.js +62 -0
- package/dist/esm/rendering/Container.js.map +1 -1
- package/dist/esm/rendering/Drawable.d.ts +22 -0
- package/dist/esm/rendering/Drawable.js +22 -0
- package/dist/esm/rendering/Drawable.js.map +1 -1
- package/dist/esm/rendering/RenderBackend.d.ts +13 -0
- package/dist/esm/rendering/RenderBackendType.d.ts +4 -0
- package/dist/esm/rendering/RenderBackendType.js +4 -0
- package/dist/esm/rendering/RenderBackendType.js.map +1 -1
- package/dist/esm/rendering/RenderNode.d.ts +45 -0
- package/dist/esm/rendering/RenderNode.js +62 -0
- package/dist/esm/rendering/RenderNode.js.map +1 -1
- package/dist/esm/rendering/RenderPass.d.ts +8 -0
- package/dist/esm/rendering/RenderStats.d.ts +19 -0
- package/dist/esm/rendering/RenderStats.js +7 -0
- package/dist/esm/rendering/RenderStats.js.map +1 -1
- package/dist/esm/rendering/RenderTarget.d.ts +17 -0
- package/dist/esm/rendering/RenderTarget.js +17 -0
- package/dist/esm/rendering/RenderTarget.js.map +1 -1
- package/dist/esm/rendering/RenderTargetPass.d.ts +11 -0
- package/dist/esm/rendering/RenderTargetPass.js +7 -0
- package/dist/esm/rendering/RenderTargetPass.js.map +1 -1
- package/dist/esm/rendering/Renderer.d.ts +15 -0
- package/dist/esm/rendering/RendererRegistry.d.ts +7 -0
- package/dist/esm/rendering/RendererRegistry.js +7 -0
- package/dist/esm/rendering/RendererRegistry.js.map +1 -1
- package/dist/esm/rendering/View.d.ts +73 -6
- package/dist/esm/rendering/View.js +69 -2
- package/dist/esm/rendering/View.js.map +1 -1
- package/dist/esm/rendering/filters/BlurFilter.d.ts +9 -0
- package/dist/esm/rendering/filters/BlurFilter.js +8 -0
- package/dist/esm/rendering/filters/BlurFilter.js.map +1 -1
- package/dist/esm/rendering/filters/ColorFilter.d.ts +7 -0
- package/dist/esm/rendering/filters/ColorFilter.js +7 -0
- package/dist/esm/rendering/filters/ColorFilter.js.map +1 -1
- package/dist/esm/rendering/filters/Filter.d.ts +23 -0
- package/dist/esm/rendering/filters/Filter.js +20 -0
- package/dist/esm/rendering/filters/Filter.js.map +1 -1
- package/dist/esm/rendering/filters/WebGl2ShaderFilter.d.ts +114 -0
- package/dist/esm/rendering/filters/WebGl2ShaderFilter.js +273 -0
- package/dist/esm/rendering/filters/WebGl2ShaderFilter.js.map +1 -0
- package/dist/esm/rendering/filters/WebGpuShaderFilter.d.ts +116 -0
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js +402 -0
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -0
- package/dist/esm/rendering/index.d.ts +3 -0
- package/dist/esm/rendering/mesh/Mesh.d.ts +2 -0
- package/dist/esm/rendering/mesh/Mesh.js +3 -0
- package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
- package/dist/esm/rendering/primitives/Graphics.d.ts +34 -0
- package/dist/esm/rendering/primitives/Graphics.js +34 -0
- package/dist/esm/rendering/primitives/Graphics.js.map +1 -1
- package/dist/esm/rendering/shader/Shader.d.ts +36 -0
- package/dist/esm/rendering/shader/Shader.js +26 -0
- package/dist/esm/rendering/shader/Shader.js.map +1 -1
- package/dist/esm/rendering/shader/ShaderAttribute.d.ts +13 -0
- package/dist/esm/rendering/shader/ShaderAttribute.js +13 -0
- package/dist/esm/rendering/shader/ShaderAttribute.js.map +1 -1
- package/dist/esm/rendering/shader/ShaderUniform.d.ts +27 -0
- package/dist/esm/rendering/shader/ShaderUniform.js +28 -1
- package/dist/esm/rendering/shader/ShaderUniform.js.map +1 -1
- package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.d.ts +34 -0
- package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.js +60 -0
- package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.js.map +1 -0
- package/dist/esm/rendering/sprite/AnimatedSprite.d.ts +38 -0
- package/dist/esm/rendering/sprite/AnimatedSprite.js +36 -0
- package/dist/esm/rendering/sprite/AnimatedSprite.js.map +1 -1
- package/dist/esm/rendering/sprite/Sprite.d.ts +62 -1
- package/dist/esm/rendering/sprite/Sprite.js +97 -19
- package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
- package/dist/esm/rendering/sprite/Spritesheet.d.ts +25 -0
- package/dist/esm/rendering/sprite/Spritesheet.js +20 -0
- package/dist/esm/rendering/sprite/Spritesheet.js.map +1 -1
- package/dist/esm/rendering/text/Text.d.ts +2 -0
- package/dist/esm/rendering/text/Text.js +2 -0
- package/dist/esm/rendering/text/Text.js.map +1 -1
- package/dist/esm/rendering/text/TextStyle.d.ts +29 -0
- package/dist/esm/rendering/text/TextStyle.js +24 -0
- package/dist/esm/rendering/text/TextStyle.js.map +1 -1
- package/dist/esm/rendering/text/types.d.ts +1 -0
- package/dist/esm/rendering/texture/RenderTexture.d.ts +16 -0
- package/dist/esm/rendering/texture/RenderTexture.js +16 -0
- package/dist/esm/rendering/texture/RenderTexture.js.map +1 -1
- package/dist/esm/rendering/texture/Sampler.d.ts +23 -0
- package/dist/esm/rendering/texture/Sampler.js +13 -0
- package/dist/esm/rendering/texture/Sampler.js.map +1 -1
- package/dist/esm/rendering/texture/Texture.d.ts +30 -0
- package/dist/esm/rendering/texture/Texture.js +30 -0
- package/dist/esm/rendering/texture/Texture.js.map +1 -1
- package/dist/esm/rendering/types.d.ts +29 -0
- package/dist/esm/rendering/types.js +29 -0
- package/dist/esm/rendering/types.js.map +1 -1
- package/dist/esm/rendering/utils.d.ts +20 -0
- package/dist/esm/rendering/utils.js +10 -0
- package/dist/esm/rendering/utils.js.map +1 -1
- package/dist/esm/rendering/video/Video.d.ts +39 -1
- package/dist/esm/rendering/video/Video.js +68 -6
- package/dist/esm/rendering/video/Video.js.map +1 -1
- package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.d.ts +7 -0
- package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js +7 -0
- package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +17 -4
- package/dist/esm/rendering/webgl2/WebGl2Backend.js +20 -16
- package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.d.ts +8 -0
- package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.js +8 -0
- package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +45 -8
- package/dist/esm/rendering/webgpu/WebGpuBackend.js +160 -40
- package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
- package/dist/esm/resources/AbstractAssetFactory.d.ts +20 -0
- package/dist/esm/resources/AbstractAssetFactory.js +20 -0
- package/dist/esm/resources/AbstractAssetFactory.js.map +1 -1
- package/dist/esm/resources/AssetFactory.d.ts +26 -0
- package/dist/esm/resources/AssetManifest.d.ts +45 -0
- package/dist/esm/resources/AssetManifest.js +25 -0
- package/dist/esm/resources/AssetManifest.js.map +1 -1
- package/dist/esm/resources/CacheFirstStrategy.d.ts +12 -0
- package/dist/esm/resources/CacheFirstStrategy.js +12 -0
- package/dist/esm/resources/CacheFirstStrategy.js.map +1 -1
- package/dist/esm/resources/CacheStore.d.ts +23 -0
- package/dist/esm/resources/CacheStrategy.d.ts +20 -0
- package/dist/esm/resources/Database.d.ts +45 -0
- package/dist/esm/resources/FactoryRegistry.d.ts +28 -0
- package/dist/esm/resources/FactoryRegistry.js +24 -0
- package/dist/esm/resources/FactoryRegistry.js.map +1 -1
- package/dist/esm/resources/IndexedDbDatabase.d.ts +22 -1
- package/dist/esm/resources/IndexedDbDatabase.js +21 -0
- package/dist/esm/resources/IndexedDbDatabase.js.map +1 -1
- package/dist/esm/resources/IndexedDbStore.d.ts +20 -0
- package/dist/esm/resources/IndexedDbStore.js +12 -0
- package/dist/esm/resources/IndexedDbStore.js.map +1 -1
- package/dist/esm/resources/Loader.d.ts +167 -0
- package/dist/esm/resources/Loader.js +110 -0
- package/dist/esm/resources/Loader.js.map +1 -1
- package/dist/esm/resources/NetworkOnlyStrategy.d.ts +8 -0
- package/dist/esm/resources/NetworkOnlyStrategy.js +8 -0
- package/dist/esm/resources/NetworkOnlyStrategy.js.map +1 -1
- package/dist/esm/resources/factories/BinaryFactory.d.ts +13 -0
- package/dist/esm/resources/factories/BinaryFactory.js +13 -0
- package/dist/esm/resources/factories/BinaryFactory.js.map +1 -1
- package/dist/esm/resources/factories/FontFactory.d.ts +37 -0
- package/dist/esm/resources/factories/FontFactory.js +26 -0
- package/dist/esm/resources/factories/FontFactory.js.map +1 -1
- package/dist/esm/resources/factories/ImageFactory.d.ts +24 -0
- package/dist/esm/resources/factories/ImageFactory.js +19 -0
- package/dist/esm/resources/factories/ImageFactory.js.map +1 -1
- package/dist/esm/resources/factories/JsonFactory.d.ts +13 -0
- package/dist/esm/resources/factories/JsonFactory.js +13 -0
- package/dist/esm/resources/factories/JsonFactory.js.map +1 -1
- package/dist/esm/resources/factories/MusicFactory.d.ts +36 -0
- package/dist/esm/resources/factories/MusicFactory.js +44 -4
- package/dist/esm/resources/factories/MusicFactory.js.map +1 -1
- package/dist/esm/resources/factories/SoundFactory.d.ts +29 -0
- package/dist/esm/resources/factories/SoundFactory.js +18 -0
- package/dist/esm/resources/factories/SoundFactory.js.map +1 -1
- package/dist/esm/resources/factories/SvgFactory.d.ts +19 -0
- package/dist/esm/resources/factories/SvgFactory.js +19 -0
- package/dist/esm/resources/factories/SvgFactory.js.map +1 -1
- package/dist/esm/resources/factories/TextFactory.d.ts +11 -0
- package/dist/esm/resources/factories/TextFactory.js +11 -0
- package/dist/esm/resources/factories/TextFactory.js.map +1 -1
- package/dist/esm/resources/factories/TextureFactory.d.ts +25 -0
- package/dist/esm/resources/factories/TextureFactory.js +20 -0
- package/dist/esm/resources/factories/TextureFactory.js.map +1 -1
- package/dist/esm/resources/factories/VideoFactory.d.ts +37 -0
- package/dist/esm/resources/factories/VideoFactory.js +48 -5
- package/dist/esm/resources/factories/VideoFactory.js.map +1 -1
- package/dist/esm/resources/factories/VttFactory.d.ts +18 -0
- package/dist/esm/resources/factories/VttFactory.js +24 -0
- package/dist/esm/resources/factories/VttFactory.js.map +1 -1
- package/dist/esm/resources/factories/WasmFactory.d.ts +16 -0
- package/dist/esm/resources/factories/WasmFactory.js +16 -0
- package/dist/esm/resources/factories/WasmFactory.js.map +1 -1
- package/dist/esm/resources/utils.d.ts +10 -0
- package/dist/esm/resources/utils.js +10 -0
- package/dist/esm/resources/utils.js.map +1 -1
- package/dist/exo.esm.js +11182 -2538
- package/dist/exo.esm.js.map +1 -1
- package/package.json +20 -9
- package/dist/esm/core/Quadtree.d.ts +0 -20
- package/dist/esm/core/Quadtree.js +0 -86
- package/dist/esm/core/Quadtree.js.map +0 -1
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { clamp } from '../math/utils.js';
|
|
2
|
+
import { isAudioContextReady, getAudioContext, onAudioContextReady } from './audio-context.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Hierarchical mixer node in the engine's audio routing graph. Each bus
|
|
6
|
+
* owns three Web Audio nodes (input gain, optional filter chain, stereo
|
|
7
|
+
* pan, output gain) and routes its output into its parent's input — the
|
|
8
|
+
* root bus connects to the destination.
|
|
9
|
+
*
|
|
10
|
+
* The three engine-built-in busses are constructed by {@link AudioManager}:
|
|
11
|
+
* `master` (root), `music` (child of master), `sound` (child of master).
|
|
12
|
+
* User code creates additional busses via `new AudioBus(name, { parent })`
|
|
13
|
+
* and registers them via {@link AudioManager.registerBus}.
|
|
14
|
+
*
|
|
15
|
+
* Volume is in 0..2 (1 = unity), pan is -1..1, mute is a boolean override.
|
|
16
|
+
* {@link AudioBus.fadeIn} / {@link AudioBus.fadeOut} produce smooth ramps
|
|
17
|
+
* over the output gain. Filter changes via {@link AudioBus.addFilter} /
|
|
18
|
+
* {@link AudioBus.removeFilter} rebuild the chain in place.
|
|
19
|
+
*
|
|
20
|
+
* Setup is deferred until the global `AudioContext` is unlocked
|
|
21
|
+
* (browser autoplay policy); operations that need live nodes are no-ops
|
|
22
|
+
* until that happens.
|
|
23
|
+
*/
|
|
24
|
+
class AudioBus {
|
|
25
|
+
name;
|
|
26
|
+
_parent;
|
|
27
|
+
_volume;
|
|
28
|
+
_muted;
|
|
29
|
+
_pan;
|
|
30
|
+
_filters = [];
|
|
31
|
+
_setup = null;
|
|
32
|
+
_scheduledStopId = null;
|
|
33
|
+
constructor(name, options = {}) {
|
|
34
|
+
if (!name || typeof name !== 'string') {
|
|
35
|
+
throw new Error('AudioBus requires a non-empty string name.');
|
|
36
|
+
}
|
|
37
|
+
this.name = name;
|
|
38
|
+
this._parent = options.parent ?? null;
|
|
39
|
+
this._volume = clamp(options.volume ?? 1, 0, 2);
|
|
40
|
+
this._muted = options.muted ?? false;
|
|
41
|
+
this._pan = clamp(options.pan ?? 0, -1, 1);
|
|
42
|
+
if (options.filters) {
|
|
43
|
+
this._filters.push(...options.filters);
|
|
44
|
+
}
|
|
45
|
+
if (isAudioContextReady()) {
|
|
46
|
+
this._setupAudio(getAudioContext());
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
onAudioContextReady.once(this._setupAudio, this);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
get parent() {
|
|
53
|
+
return this._parent;
|
|
54
|
+
}
|
|
55
|
+
get volume() {
|
|
56
|
+
return this._volume;
|
|
57
|
+
}
|
|
58
|
+
set volume(value) {
|
|
59
|
+
const clamped = clamp(value, 0, 2);
|
|
60
|
+
if (this._volume === clamped)
|
|
61
|
+
return;
|
|
62
|
+
this._volume = clamped;
|
|
63
|
+
this._applyVolume();
|
|
64
|
+
}
|
|
65
|
+
get muted() {
|
|
66
|
+
return this._muted;
|
|
67
|
+
}
|
|
68
|
+
set muted(value) {
|
|
69
|
+
if (this._muted === value)
|
|
70
|
+
return;
|
|
71
|
+
this._muted = value;
|
|
72
|
+
this._applyVolume();
|
|
73
|
+
}
|
|
74
|
+
get pan() {
|
|
75
|
+
return this._pan;
|
|
76
|
+
}
|
|
77
|
+
set pan(value) {
|
|
78
|
+
const clamped = clamp(value, -1, 1);
|
|
79
|
+
if (this._pan === clamped)
|
|
80
|
+
return;
|
|
81
|
+
this._pan = clamped;
|
|
82
|
+
if (this._setup) {
|
|
83
|
+
this._setup.panNode.pan.setTargetAtTime(clamped, this._setup.audioContext.currentTime, 0.01);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
get inputNode() {
|
|
87
|
+
return this._setup?.inputNode ?? null;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Append a filter to the end of the chain (before the pan stage). The
|
|
91
|
+
* chain is rebuilt in place; existing audio routes through the new
|
|
92
|
+
* filter on the next frame.
|
|
93
|
+
*/
|
|
94
|
+
addFilter(filter) {
|
|
95
|
+
this._filters.push(filter);
|
|
96
|
+
this._rebuildFilterChain();
|
|
97
|
+
return this;
|
|
98
|
+
}
|
|
99
|
+
/** Remove `filter` from the chain. No-op if not present. Caller still owns + must `destroy()` it. */
|
|
100
|
+
removeFilter(filter) {
|
|
101
|
+
const index = this._filters.indexOf(filter);
|
|
102
|
+
if (index !== -1) {
|
|
103
|
+
this._filters.splice(index, 1);
|
|
104
|
+
this._rebuildFilterChain();
|
|
105
|
+
}
|
|
106
|
+
return this;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Linearly ramp the output gain from 0 to the current volume over
|
|
110
|
+
* `durationMs`. Cancels any in-flight ramps on the same gain node.
|
|
111
|
+
*/
|
|
112
|
+
fadeIn(durationMs) {
|
|
113
|
+
this._clearScheduledStop();
|
|
114
|
+
if (durationMs <= 0 || !this._setup) {
|
|
115
|
+
return this;
|
|
116
|
+
}
|
|
117
|
+
const ctx = this._setup.audioContext;
|
|
118
|
+
const node = this._setup.outputNode;
|
|
119
|
+
const target = this._muted ? 0 : this._volume;
|
|
120
|
+
node.gain.cancelScheduledValues(ctx.currentTime);
|
|
121
|
+
node.gain.setValueAtTime(0, ctx.currentTime);
|
|
122
|
+
node.gain.linearRampToValueAtTime(target, ctx.currentTime + durationMs / 1000);
|
|
123
|
+
return this;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Linearly ramp the output gain to 0 over `durationMs`. By default
|
|
127
|
+
* mutes the bus once the ramp completes (`stopAfter: true`); pass
|
|
128
|
+
* `stopAfter: false` to let the ramp finish silently while leaving
|
|
129
|
+
* `muted` unchanged.
|
|
130
|
+
*/
|
|
131
|
+
fadeOut(durationMs, options = {}) {
|
|
132
|
+
const stopAfter = options.stopAfter ?? true;
|
|
133
|
+
this._clearScheduledStop();
|
|
134
|
+
if (durationMs <= 0 || !this._setup) {
|
|
135
|
+
if (stopAfter)
|
|
136
|
+
this.muted = true;
|
|
137
|
+
return this;
|
|
138
|
+
}
|
|
139
|
+
const ctx = this._setup.audioContext;
|
|
140
|
+
const node = this._setup.outputNode;
|
|
141
|
+
node.gain.cancelScheduledValues(ctx.currentTime);
|
|
142
|
+
node.gain.setValueAtTime(node.gain.value, ctx.currentTime);
|
|
143
|
+
node.gain.linearRampToValueAtTime(0, ctx.currentTime + durationMs / 1000);
|
|
144
|
+
if (stopAfter) {
|
|
145
|
+
this._scheduledStopId = setTimeout(() => {
|
|
146
|
+
this._scheduledStopId = null;
|
|
147
|
+
this.muted = true;
|
|
148
|
+
}, durationMs);
|
|
149
|
+
}
|
|
150
|
+
return this;
|
|
151
|
+
}
|
|
152
|
+
destroy() {
|
|
153
|
+
onAudioContextReady.clearByContext(this);
|
|
154
|
+
this._clearScheduledStop();
|
|
155
|
+
for (const filter of this._filters) {
|
|
156
|
+
filter.destroy();
|
|
157
|
+
}
|
|
158
|
+
this._filters.length = 0;
|
|
159
|
+
if (this._setup) {
|
|
160
|
+
this._setup.inputNode.disconnect();
|
|
161
|
+
this._setup.outputNode.disconnect();
|
|
162
|
+
this._setup.panNode.disconnect();
|
|
163
|
+
this._setup = null;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/** Internal: returns the input GainNode where children should connect. */
|
|
167
|
+
_getInputNode() {
|
|
168
|
+
return this._setup?.inputNode ?? null;
|
|
169
|
+
}
|
|
170
|
+
/** Internal: returns the output GainNode that connects upstream. */
|
|
171
|
+
_getOutputNode() {
|
|
172
|
+
return this._setup?.outputNode ?? null;
|
|
173
|
+
}
|
|
174
|
+
_setupAudio(audioContext) {
|
|
175
|
+
const inputNode = audioContext.createGain();
|
|
176
|
+
const panNode = audioContext.createStereoPanner();
|
|
177
|
+
const outputNode = audioContext.createGain();
|
|
178
|
+
// Internal chain: input → [filters...] → pan → output
|
|
179
|
+
outputNode.gain.setTargetAtTime(this._muted ? 0 : this._volume, audioContext.currentTime, 0.01);
|
|
180
|
+
panNode.pan.setTargetAtTime(this._pan, audioContext.currentTime, 0.01);
|
|
181
|
+
this._setup = { audioContext, inputNode, outputNode, panNode };
|
|
182
|
+
this._rebuildFilterChain();
|
|
183
|
+
this._connectUpstream();
|
|
184
|
+
}
|
|
185
|
+
_connectUpstream() {
|
|
186
|
+
if (!this._setup)
|
|
187
|
+
return;
|
|
188
|
+
if (this._parent) {
|
|
189
|
+
const parentInput = this._parent._getInputNode();
|
|
190
|
+
if (parentInput) {
|
|
191
|
+
this._setup.outputNode.connect(parentInput);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
// Parent not yet ready — subscribe to parent's setup
|
|
195
|
+
this._parent.onceSetup(() => {
|
|
196
|
+
if (this._setup && this._parent) {
|
|
197
|
+
const node = this._parent._getInputNode();
|
|
198
|
+
if (node)
|
|
199
|
+
this._setup.outputNode.connect(node);
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
this._setup.outputNode.connect(this._setup.audioContext.destination);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/** Subscribe to the moment this bus's audio nodes are ready. Internal use. */
|
|
209
|
+
onceSetup(callback) {
|
|
210
|
+
if (this._setup) {
|
|
211
|
+
callback();
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
onAudioContextReady.once(() => {
|
|
215
|
+
if (this._setup)
|
|
216
|
+
callback();
|
|
217
|
+
}, this);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
_rebuildFilterChain() {
|
|
221
|
+
if (!this._setup)
|
|
222
|
+
return;
|
|
223
|
+
const { inputNode, panNode } = this._setup;
|
|
224
|
+
// Disconnect current chain
|
|
225
|
+
inputNode.disconnect();
|
|
226
|
+
for (const filter of this._filters) {
|
|
227
|
+
filter.inputNode.disconnect();
|
|
228
|
+
filter.outputNode.disconnect();
|
|
229
|
+
}
|
|
230
|
+
panNode.disconnect();
|
|
231
|
+
// Rebuild: input → filter[0].input → filter[0].output → filter[1].input → ... → pan → output
|
|
232
|
+
let prev = inputNode;
|
|
233
|
+
for (const filter of this._filters) {
|
|
234
|
+
prev.connect(filter.inputNode);
|
|
235
|
+
prev = filter.outputNode;
|
|
236
|
+
}
|
|
237
|
+
prev.connect(panNode);
|
|
238
|
+
panNode.connect(this._setup.outputNode);
|
|
239
|
+
}
|
|
240
|
+
_applyVolume() {
|
|
241
|
+
if (!this._setup)
|
|
242
|
+
return;
|
|
243
|
+
const target = this._muted ? 0 : this._volume;
|
|
244
|
+
this._setup.outputNode.gain.setTargetAtTime(target, this._setup.audioContext.currentTime, 0.01);
|
|
245
|
+
}
|
|
246
|
+
_clearScheduledStop() {
|
|
247
|
+
if (this._scheduledStopId !== null) {
|
|
248
|
+
clearTimeout(this._scheduledStopId);
|
|
249
|
+
this._scheduledStopId = null;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
export { AudioBus };
|
|
255
|
+
//# sourceMappingURL=AudioBus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioBus.js","sources":["../../../../src/audio/AudioBus.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract base for all audio processing filters in ExoJS. Each filter exposes
|
|
3
|
+
* stable {@link inputNode} and {@link outputNode} AudioNodes that the audio bus
|
|
4
|
+
* connects into the Web Audio graph. Async filters (e.g., worklet-based) expose
|
|
5
|
+
* a {@link ready} promise that resolves once the filter is fully initialized.
|
|
6
|
+
*/
|
|
7
|
+
export declare abstract class AudioFilter {
|
|
8
|
+
/** The node where audio enters this filter. */
|
|
9
|
+
abstract get inputNode(): AudioNode;
|
|
10
|
+
/** The node where audio exits this filter. */
|
|
11
|
+
abstract get outputNode(): AudioNode;
|
|
12
|
+
/** Resolves when the filter is fully initialized. Defaults to immediately-resolved for sync filters. */
|
|
13
|
+
get ready(): Promise<void>;
|
|
14
|
+
/** Disconnects all audio nodes and releases resources. Must be called when the filter is no longer needed. */
|
|
15
|
+
abstract destroy(): void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract base for all audio processing filters in ExoJS. Each filter exposes
|
|
3
|
+
* stable {@link inputNode} and {@link outputNode} AudioNodes that the audio bus
|
|
4
|
+
* connects into the Web Audio graph. Async filters (e.g., worklet-based) expose
|
|
5
|
+
* a {@link ready} promise that resolves once the filter is fully initialized.
|
|
6
|
+
*/
|
|
7
|
+
class AudioFilter {
|
|
8
|
+
/** Resolves when the filter is fully initialized. Defaults to immediately-resolved for sync filters. */
|
|
9
|
+
get ready() { return Promise.resolve(); }
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export { AudioFilter };
|
|
13
|
+
//# sourceMappingURL=AudioFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioFilter.js","sources":["../../../../src/audio/AudioFilter.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;AAKG;MACmB,WAAW,CAAA;;IAM7B,IAAW,KAAK,KAAoB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;AAGjE;;;;"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Vector } from '@/math/Vector';
|
|
2
|
+
import type { SceneNode } from '@/core/SceneNode';
|
|
3
|
+
import type { View } from '@/rendering/View';
|
|
4
|
+
/**
|
|
5
|
+
* Anything {@link AudioListener.target} can be set to. The listener reads
|
|
6
|
+
* its world-space position from the target each frame:
|
|
7
|
+
* - {@link SceneNode}: uses `getGlobalTransform()` translation
|
|
8
|
+
* - {@link View}: uses `view.center`
|
|
9
|
+
* - Plain `{ x, y }` object: read directly
|
|
10
|
+
* - `null`: no automatic tracking — set `position` manually.
|
|
11
|
+
*/
|
|
12
|
+
export type AudioListenerTarget = SceneNode | View | {
|
|
13
|
+
x: number;
|
|
14
|
+
y: number;
|
|
15
|
+
} | null;
|
|
16
|
+
/**
|
|
17
|
+
* Singleton observer position fed to the Web Audio panner nodes used by
|
|
18
|
+
* spatial sounds. Sets the listener orientation once at setup (forward = -Z,
|
|
19
|
+
* up = +Y for 2D scenes) and updates `positionX/Y/Z` (or legacy
|
|
20
|
+
* `setPosition`) every frame from {@link AudioListener.position} —
|
|
21
|
+
* which is in turn read from {@link AudioListener.target} when one is set.
|
|
22
|
+
*
|
|
23
|
+
* Owned by {@link AudioManager}; one instance per engine. `velocity` is a
|
|
24
|
+
* placeholder for future Doppler support (currently not piped to the Web
|
|
25
|
+
* Audio listener).
|
|
26
|
+
*/
|
|
27
|
+
export declare class AudioListener {
|
|
28
|
+
readonly position: Vector;
|
|
29
|
+
readonly velocity: Vector;
|
|
30
|
+
target: AudioListenerTarget;
|
|
31
|
+
private _audioListener;
|
|
32
|
+
private _ctx;
|
|
33
|
+
constructor();
|
|
34
|
+
/** Internal: called by AudioManager.update() once per frame. */
|
|
35
|
+
_tick(): void;
|
|
36
|
+
destroy(): void;
|
|
37
|
+
private _readTargetPosition;
|
|
38
|
+
private _setup;
|
|
39
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Vector } from '../math/Vector.js';
|
|
2
|
+
import { isAudioContextReady, getAudioContext, onAudioContextReady } from './audio-context.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Singleton observer position fed to the Web Audio panner nodes used by
|
|
6
|
+
* spatial sounds. Sets the listener orientation once at setup (forward = -Z,
|
|
7
|
+
* up = +Y for 2D scenes) and updates `positionX/Y/Z` (or legacy
|
|
8
|
+
* `setPosition`) every frame from {@link AudioListener.position} —
|
|
9
|
+
* which is in turn read from {@link AudioListener.target} when one is set.
|
|
10
|
+
*
|
|
11
|
+
* Owned by {@link AudioManager}; one instance per engine. `velocity` is a
|
|
12
|
+
* placeholder for future Doppler support (currently not piped to the Web
|
|
13
|
+
* Audio listener).
|
|
14
|
+
*/
|
|
15
|
+
class AudioListener {
|
|
16
|
+
position = new Vector(0, 0);
|
|
17
|
+
velocity = new Vector(0, 0);
|
|
18
|
+
target = null;
|
|
19
|
+
_audioListener = null;
|
|
20
|
+
_ctx = null;
|
|
21
|
+
constructor() {
|
|
22
|
+
if (isAudioContextReady()) {
|
|
23
|
+
this._setup(getAudioContext());
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
onAudioContextReady.once(this._setup, this);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** Internal: called by AudioManager.update() once per frame. */
|
|
30
|
+
_tick() {
|
|
31
|
+
if (this.target !== null) {
|
|
32
|
+
this._readTargetPosition();
|
|
33
|
+
}
|
|
34
|
+
if (this._audioListener !== null && this._ctx !== null) {
|
|
35
|
+
const t = this._ctx.currentTime;
|
|
36
|
+
const listener = this._audioListener;
|
|
37
|
+
if (listener.positionX) {
|
|
38
|
+
listener.positionX.setValueAtTime(this.position.x, t);
|
|
39
|
+
listener.positionY.setValueAtTime(this.position.y, t);
|
|
40
|
+
listener.positionZ.setValueAtTime(0, t);
|
|
41
|
+
}
|
|
42
|
+
else if (listener.setPosition) {
|
|
43
|
+
listener.setPosition(this.position.x, this.position.y, 0);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
destroy() {
|
|
48
|
+
onAudioContextReady.clearByContext(this);
|
|
49
|
+
this.position.destroy();
|
|
50
|
+
this.velocity.destroy();
|
|
51
|
+
this.target = null;
|
|
52
|
+
this._audioListener = null;
|
|
53
|
+
this._ctx = null;
|
|
54
|
+
}
|
|
55
|
+
_readTargetPosition() {
|
|
56
|
+
const target = this.target;
|
|
57
|
+
if (target === null)
|
|
58
|
+
return;
|
|
59
|
+
// Check for SceneNode (has getGlobalTransform)
|
|
60
|
+
const asSceneNode = target;
|
|
61
|
+
if (typeof asSceneNode.getGlobalTransform === 'function') {
|
|
62
|
+
const m = asSceneNode.getGlobalTransform();
|
|
63
|
+
this.position.set(m.x, m.y);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// Check for View (has center with x/y)
|
|
67
|
+
const asView = target;
|
|
68
|
+
if (asView.center !== undefined && typeof asView.center === 'object') {
|
|
69
|
+
this.position.set(asView.center.x, asView.center.y);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Plain { x, y } object
|
|
73
|
+
const plain = target;
|
|
74
|
+
this.position.set(plain.x, plain.y);
|
|
75
|
+
}
|
|
76
|
+
_setup(ctx) {
|
|
77
|
+
this._ctx = ctx;
|
|
78
|
+
this._audioListener = ctx.listener;
|
|
79
|
+
const t = ctx.currentTime;
|
|
80
|
+
const listener = ctx.listener;
|
|
81
|
+
// Set 2D orientation: forward = -Z (into screen), up = +Y (screen up)
|
|
82
|
+
if (listener.forwardX) {
|
|
83
|
+
listener.forwardX.setValueAtTime(0, t);
|
|
84
|
+
listener.forwardY.setValueAtTime(0, t);
|
|
85
|
+
listener.forwardZ.setValueAtTime(-1, t);
|
|
86
|
+
listener.upX.setValueAtTime(0, t);
|
|
87
|
+
listener.upY.setValueAtTime(1, t);
|
|
88
|
+
listener.upZ.setValueAtTime(0, t);
|
|
89
|
+
}
|
|
90
|
+
else if (listener.setOrientation) {
|
|
91
|
+
listener.setOrientation(0, 0, -1, 0, 1, 0);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export { AudioListener };
|
|
97
|
+
//# sourceMappingURL=AudioListener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioListener.js","sources":["../../../../src/audio/AudioListener.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { AudioBus } from './AudioBus';
|
|
2
|
+
import { AudioListener } from './AudioListener';
|
|
3
|
+
import type { Sound } from './Sound';
|
|
4
|
+
/**
|
|
5
|
+
* Module-level singleton that owns the engine-wide audio mix: three
|
|
6
|
+
* pre-configured {@link AudioBus} instances (`master` ← `music` + `sound`),
|
|
7
|
+
* a single shared {@link AudioListener} for spatial audio, and a registry
|
|
8
|
+
* of any extra busses the user constructs.
|
|
9
|
+
*
|
|
10
|
+
* Access the singleton via {@link getAudioManager} (or `app.audio`). The
|
|
11
|
+
* instance is constructed lazily on first access so client code that does
|
|
12
|
+
* not need audio pays no startup cost.
|
|
13
|
+
*
|
|
14
|
+
* Drives the per-frame `_tick()` on the listener and every spatial sound;
|
|
15
|
+
* propagates visibility-driven mute when {@link AudioManager.muteOnHidden}
|
|
16
|
+
* is enabled.
|
|
17
|
+
*/
|
|
18
|
+
export declare class AudioManager {
|
|
19
|
+
readonly master: AudioBus;
|
|
20
|
+
readonly music: AudioBus;
|
|
21
|
+
readonly sound: AudioBus;
|
|
22
|
+
readonly listener: AudioListener;
|
|
23
|
+
private readonly _registered;
|
|
24
|
+
private readonly _spatialSounds;
|
|
25
|
+
private _muteOnHidden;
|
|
26
|
+
constructor();
|
|
27
|
+
/**
|
|
28
|
+
* When `true`, the master bus is muted while `document.hidden` is true.
|
|
29
|
+
* Wired to {@link Application.onVisibilityChange} via
|
|
30
|
+
* {@link AudioManager._applyVisibility}; the application calls that
|
|
31
|
+
* hook automatically — set this flag to opt in to the behavior.
|
|
32
|
+
*/
|
|
33
|
+
get muteOnHidden(): boolean;
|
|
34
|
+
set muteOnHidden(value: boolean);
|
|
35
|
+
/** Called once per frame from Application.update(). */
|
|
36
|
+
update(): void;
|
|
37
|
+
/** Internal: called by Sound when it becomes spatial. */
|
|
38
|
+
_registerSpatialSound(sound: Sound): void;
|
|
39
|
+
/** Internal: called by Sound when it stops being spatial. */
|
|
40
|
+
_unregisterSpatialSound(sound: Sound): void;
|
|
41
|
+
/** Internal: called by Application when visibility changes. */
|
|
42
|
+
_applyVisibility(visible: boolean): void;
|
|
43
|
+
/**
|
|
44
|
+
* Register a user-constructed {@link AudioBus} so it can be looked up by
|
|
45
|
+
* name via {@link AudioManager.getBus}. Throws if a bus with the same
|
|
46
|
+
* name is already registered.
|
|
47
|
+
*/
|
|
48
|
+
registerBus(bus: AudioBus): this;
|
|
49
|
+
/**
|
|
50
|
+
* Unregister and {@link AudioBus.destroy} a previously registered bus.
|
|
51
|
+
* Throws if you attempt to unregister one of the three built-ins
|
|
52
|
+
* (`master`, `music`, `sound`). No-op if the bus is unknown.
|
|
53
|
+
*/
|
|
54
|
+
unregisterBus(bus: AudioBus): this;
|
|
55
|
+
/** Look up a bus by name. Throws if the name is not registered. */
|
|
56
|
+
getBus(name: string): AudioBus;
|
|
57
|
+
/** `true` when a bus with `name` has been registered. */
|
|
58
|
+
hasBus(name: string): boolean;
|
|
59
|
+
destroy(): void;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Lazy accessor for the singleton {@link AudioManager}. Constructs the
|
|
63
|
+
* instance on first call, returns the same instance for every subsequent
|
|
64
|
+
* call. Equivalent to `app.audio`.
|
|
65
|
+
*/
|
|
66
|
+
export declare function getAudioManager(): AudioManager;
|
|
67
|
+
/** For tests: reset the singleton so fresh instances can be created. */
|
|
68
|
+
export declare function _resetAudioManagerForTesting(): void;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { AudioBus } from './AudioBus.js';
|
|
2
|
+
import { AudioListener } from './AudioListener.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Module-level singleton that owns the engine-wide audio mix: three
|
|
6
|
+
* pre-configured {@link AudioBus} instances (`master` ← `music` + `sound`),
|
|
7
|
+
* a single shared {@link AudioListener} for spatial audio, and a registry
|
|
8
|
+
* of any extra busses the user constructs.
|
|
9
|
+
*
|
|
10
|
+
* Access the singleton via {@link getAudioManager} (or `app.audio`). The
|
|
11
|
+
* instance is constructed lazily on first access so client code that does
|
|
12
|
+
* not need audio pays no startup cost.
|
|
13
|
+
*
|
|
14
|
+
* Drives the per-frame `_tick()` on the listener and every spatial sound;
|
|
15
|
+
* propagates visibility-driven mute when {@link AudioManager.muteOnHidden}
|
|
16
|
+
* is enabled.
|
|
17
|
+
*/
|
|
18
|
+
class AudioManager {
|
|
19
|
+
master;
|
|
20
|
+
music;
|
|
21
|
+
sound;
|
|
22
|
+
listener;
|
|
23
|
+
_registered = new Map();
|
|
24
|
+
_spatialSounds = new Set();
|
|
25
|
+
_muteOnHidden = false;
|
|
26
|
+
constructor() {
|
|
27
|
+
this.master = new AudioBus('master', { parent: null });
|
|
28
|
+
this.music = new AudioBus('music', { parent: this.master });
|
|
29
|
+
this.sound = new AudioBus('sound', { parent: this.master });
|
|
30
|
+
this.listener = new AudioListener();
|
|
31
|
+
// Built-ins are also lookup-able via getBus.
|
|
32
|
+
this._registered.set('master', this.master);
|
|
33
|
+
this._registered.set('music', this.music);
|
|
34
|
+
this._registered.set('sound', this.sound);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* When `true`, the master bus is muted while `document.hidden` is true.
|
|
38
|
+
* Wired to {@link Application.onVisibilityChange} via
|
|
39
|
+
* {@link AudioManager._applyVisibility}; the application calls that
|
|
40
|
+
* hook automatically — set this flag to opt in to the behavior.
|
|
41
|
+
*/
|
|
42
|
+
get muteOnHidden() {
|
|
43
|
+
return this._muteOnHidden;
|
|
44
|
+
}
|
|
45
|
+
set muteOnHidden(value) {
|
|
46
|
+
this._muteOnHidden = value;
|
|
47
|
+
// Wiring to app.onVisibilityChange happens externally — the
|
|
48
|
+
// Application is responsible for calling _applyVisibility() when
|
|
49
|
+
// visibility changes.
|
|
50
|
+
}
|
|
51
|
+
/** Called once per frame from Application.update(). */
|
|
52
|
+
update() {
|
|
53
|
+
this.listener._tick();
|
|
54
|
+
for (const sound of this._spatialSounds) {
|
|
55
|
+
sound._tickSpatial();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** Internal: called by Sound when it becomes spatial. */
|
|
59
|
+
_registerSpatialSound(sound) {
|
|
60
|
+
this._spatialSounds.add(sound);
|
|
61
|
+
}
|
|
62
|
+
/** Internal: called by Sound when it stops being spatial. */
|
|
63
|
+
_unregisterSpatialSound(sound) {
|
|
64
|
+
this._spatialSounds.delete(sound);
|
|
65
|
+
}
|
|
66
|
+
/** Internal: called by Application when visibility changes. */
|
|
67
|
+
_applyVisibility(visible) {
|
|
68
|
+
if (this._muteOnHidden) {
|
|
69
|
+
this.master.muted = !visible;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Register a user-constructed {@link AudioBus} so it can be looked up by
|
|
74
|
+
* name via {@link AudioManager.getBus}. Throws if a bus with the same
|
|
75
|
+
* name is already registered.
|
|
76
|
+
*/
|
|
77
|
+
registerBus(bus) {
|
|
78
|
+
if (this._registered.has(bus.name)) {
|
|
79
|
+
throw new Error(`Audio bus "${bus.name}" is already registered.`);
|
|
80
|
+
}
|
|
81
|
+
this._registered.set(bus.name, bus);
|
|
82
|
+
return this;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Unregister and {@link AudioBus.destroy} a previously registered bus.
|
|
86
|
+
* Throws if you attempt to unregister one of the three built-ins
|
|
87
|
+
* (`master`, `music`, `sound`). No-op if the bus is unknown.
|
|
88
|
+
*/
|
|
89
|
+
unregisterBus(bus) {
|
|
90
|
+
if (bus === this.master || bus === this.music || bus === this.sound) {
|
|
91
|
+
throw new Error(`Cannot unregister built-in bus "${bus.name}".`);
|
|
92
|
+
}
|
|
93
|
+
const existing = this._registered.get(bus.name);
|
|
94
|
+
if (existing !== bus) {
|
|
95
|
+
// Either not registered, or different instance with same name.
|
|
96
|
+
return this;
|
|
97
|
+
}
|
|
98
|
+
this._registered.delete(bus.name);
|
|
99
|
+
bus.destroy();
|
|
100
|
+
return this;
|
|
101
|
+
}
|
|
102
|
+
/** Look up a bus by name. Throws if the name is not registered. */
|
|
103
|
+
getBus(name) {
|
|
104
|
+
const bus = this._registered.get(name);
|
|
105
|
+
if (!bus) {
|
|
106
|
+
throw new Error(`Audio bus "${name}" is not registered.`);
|
|
107
|
+
}
|
|
108
|
+
return bus;
|
|
109
|
+
}
|
|
110
|
+
/** `true` when a bus with `name` has been registered. */
|
|
111
|
+
hasBus(name) {
|
|
112
|
+
return this._registered.has(name);
|
|
113
|
+
}
|
|
114
|
+
destroy() {
|
|
115
|
+
this.listener.destroy();
|
|
116
|
+
this._spatialSounds.clear();
|
|
117
|
+
for (const bus of this._registered.values()) {
|
|
118
|
+
// Note: destroying built-ins too — AudioManager is destroyed only when app shuts down.
|
|
119
|
+
bus.destroy();
|
|
120
|
+
}
|
|
121
|
+
this._registered.clear();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Module-level singleton (lazy)
|
|
125
|
+
let _manager = null;
|
|
126
|
+
/**
|
|
127
|
+
* Lazy accessor for the singleton {@link AudioManager}. Constructs the
|
|
128
|
+
* instance on first call, returns the same instance for every subsequent
|
|
129
|
+
* call. Equivalent to `app.audio`.
|
|
130
|
+
*/
|
|
131
|
+
function getAudioManager() {
|
|
132
|
+
if (_manager === null) {
|
|
133
|
+
_manager = new AudioManager();
|
|
134
|
+
}
|
|
135
|
+
return _manager;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export { AudioManager, getAudioManager };
|
|
139
|
+
//# sourceMappingURL=AudioManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioManager.js","sources":["../../../../src/audio/AudioManager.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;;AAaG;MACU,YAAY,CAAA;AACL,IAAA,MAAM;AACN,IAAA,KAAK;AACL,IAAA,KAAK;AACL,IAAA,QAAQ;AAEP,IAAA,WAAW,GAAG,IAAI,GAAG,EAAoB;AACzC,IAAA,cAAc,GAAe,IAAI,GAAG,EAAE;IAC/C,aAAa,GAAY,KAAK;AAEtC,IAAA,WAAA,GAAA;AACI,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACtD,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAC3D,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAC3D,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE;;QAGnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;QAC3C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;QACzC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;IAC7C;AAEA;;;;;AAKG;AACH,IAAA,IAAW,YAAY,GAAA;QACnB,OAAO,IAAI,CAAC,aAAa;IAC7B;IAEA,IAAW,YAAY,CAAC,KAAc,EAAA;AAClC,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;;;;IAI9B;;IAGO,MAAM,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AACrB,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE;YACrC,KAAK,CAAC,YAAY,EAAE;QACxB;IACJ;;AAGO,IAAA,qBAAqB,CAAC,KAAY,EAAA;AACrC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;IAClC;;AAGO,IAAA,uBAAuB,CAAC,KAAY,EAAA;AACvC,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC;IACrC;;AAGO,IAAA,gBAAgB,CAAC,OAAgB,EAAA;AACpC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACpB,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,OAAO;QAChC;IACJ;AAEA;;;;AAIG;AACI,IAAA,WAAW,CAAC,GAAa,EAAA;QAC5B,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,CAAA,WAAA,EAAc,GAAG,CAAC,IAAI,CAAA,wBAAA,CAA0B,CAAC;QACrE;QACA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;AACnC,QAAA,OAAO,IAAI;IACf;AAEA;;;;AAIG;AACI,IAAA,aAAa,CAAC,GAAa,EAAA;AAC9B,QAAA,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,IAAI,GAAG,KAAK,IAAI,CAAC,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,KAAK,EAAE;YACjE,MAAM,IAAI,KAAK,CAAC,CAAA,gCAAA,EAAmC,GAAG,CAAC,IAAI,CAAA,EAAA,CAAI,CAAC;QACpE;AACA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/C,QAAA,IAAI,QAAQ,KAAK,GAAG,EAAE;;AAElB,YAAA,OAAO,IAAI;QACf;QACA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QACjC,GAAG,CAAC,OAAO,EAAE;AACb,QAAA,OAAO,IAAI;IACf;;AAGO,IAAA,MAAM,CAAC,IAAY,EAAA;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QACtC,IAAI,CAAC,GAAG,EAAE;AACN,YAAA,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,CAAA,oBAAA,CAAsB,CAAC;QAC7D;AACA,QAAA,OAAO,GAAG;IACd;;AAGO,IAAA,MAAM,CAAC,IAAY,EAAA;QACtB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IACrC;IAEO,OAAO,GAAA;AACV,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;AACvB,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;QAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE;;YAEzC,GAAG,CAAC,OAAO,EAAE;QACjB;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;IAC5B;AACH;AAED;AACA,IAAI,QAAQ,GAAwB,IAAI;AAExC;;;;AAIG;SACa,eAAe,GAAA;AAC3B,IAAA,IAAI,QAAQ,KAAK,IAAI,EAAE;AACnB,QAAA,QAAQ,GAAG,IAAI,YAAY,EAAE;IACjC;AACA,IAAA,OAAO,QAAQ;AACnB;;;;"}
|