@codexo/exojs 0.8.4 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +99 -0
- package/README.md +34 -13
- package/dist/esm/animation/Tween.d.ts +20 -3
- package/dist/esm/animation/Tween.js +16 -8
- package/dist/esm/animation/Tween.js.map +1 -1
- package/dist/esm/animation/TweenManager.d.ts +16 -1
- package/dist/esm/animation/TweenManager.js +27 -2
- package/dist/esm/animation/TweenManager.js.map +1 -1
- package/dist/esm/audio/AudioAnalyser.d.ts +2 -0
- package/dist/esm/audio/AudioAnalyser.js +24 -9
- package/dist/esm/audio/AudioAnalyser.js.map +1 -1
- package/dist/esm/audio/AudioBus.d.ts +1 -0
- package/dist/esm/audio/AudioBus.js +8 -4
- package/dist/esm/audio/AudioBus.js.map +1 -1
- package/dist/esm/audio/AudioListener.d.ts +1 -0
- package/dist/esm/audio/AudioListener.js +7 -5
- package/dist/esm/audio/AudioListener.js.map +1 -1
- package/dist/esm/audio/AudioManager.d.ts +8 -2
- package/dist/esm/audio/AudioManager.js +14 -1
- package/dist/esm/audio/AudioManager.js.map +1 -1
- package/dist/esm/audio/BeatDetector.d.ts +2 -0
- package/dist/esm/audio/BeatDetector.js +27 -661
- package/dist/esm/audio/BeatDetector.js.map +1 -1
- package/dist/esm/audio/Music.d.ts +1 -0
- package/dist/esm/audio/Music.js +7 -3
- package/dist/esm/audio/Music.js.map +1 -1
- package/dist/esm/audio/OscillatorSound.d.ts +1 -0
- package/dist/esm/audio/OscillatorSound.js +7 -3
- package/dist/esm/audio/OscillatorSound.js.map +1 -1
- package/dist/esm/audio/Sound.d.ts +1 -0
- package/dist/esm/audio/Sound.js +7 -3
- package/dist/esm/audio/Sound.js.map +1 -1
- package/dist/esm/audio/audio-context.d.ts +2 -2
- package/dist/esm/audio/audio-context.js +4 -4
- package/dist/esm/audio/audio-context.js.map +1 -1
- package/dist/esm/audio/filters/ChorusFilter.d.ts +1 -0
- package/dist/esm/audio/filters/ChorusFilter.js +7 -3
- package/dist/esm/audio/filters/ChorusFilter.js.map +1 -1
- package/dist/esm/audio/filters/CompressorFilter.d.ts +1 -0
- package/dist/esm/audio/filters/CompressorFilter.js +7 -3
- package/dist/esm/audio/filters/CompressorFilter.js.map +1 -1
- package/dist/esm/audio/filters/DelayFilter.d.ts +1 -0
- package/dist/esm/audio/filters/DelayFilter.js +7 -3
- package/dist/esm/audio/filters/DelayFilter.js.map +1 -1
- package/dist/esm/audio/filters/EqualizerFilter.d.ts +1 -0
- package/dist/esm/audio/filters/EqualizerFilter.js +7 -3
- package/dist/esm/audio/filters/EqualizerFilter.js.map +1 -1
- package/dist/esm/audio/filters/GranularFilter.js +1 -86
- package/dist/esm/audio/filters/GranularFilter.js.map +1 -1
- package/dist/esm/audio/filters/HighpassFilter.d.ts +1 -0
- package/dist/esm/audio/filters/HighpassFilter.js +7 -3
- package/dist/esm/audio/filters/HighpassFilter.js.map +1 -1
- package/dist/esm/audio/filters/LowpassFilter.d.ts +1 -0
- package/dist/esm/audio/filters/LowpassFilter.js +7 -3
- package/dist/esm/audio/filters/LowpassFilter.js.map +1 -1
- package/dist/esm/audio/filters/PitchShiftFilter.js +1 -71
- package/dist/esm/audio/filters/PitchShiftFilter.js.map +1 -1
- package/dist/esm/audio/filters/ReverbFilter.d.ts +1 -0
- package/dist/esm/audio/filters/ReverbFilter.js +7 -3
- package/dist/esm/audio/filters/ReverbFilter.js.map +1 -1
- package/dist/esm/audio/filters/VocoderFilter.js +1 -89
- package/dist/esm/audio/filters/VocoderFilter.js.map +1 -1
- package/dist/esm/audio/filters/WorkletFilter.d.ts +2 -0
- package/dist/esm/audio/filters/WorkletFilter.js +10 -5
- package/dist/esm/audio/filters/WorkletFilter.js.map +1 -1
- package/dist/esm/audio/index.d.ts +15 -10
- package/dist/esm/audio/worklet/registerWorklet.d.ts +1 -1
- package/dist/esm/audio/worklet/registerWorklet.js +2 -2
- package/dist/esm/audio/worklet/registerWorklet.js.map +1 -1
- package/dist/esm/audio/worklets/beat-detector.worklet.d.ts +1 -0
- package/dist/esm/audio/worklets/beat-detector.worklet.js +647 -0
- package/dist/esm/audio/worklets/beat-detector.worklet.js.map +1 -0
- package/dist/esm/audio/worklets/granular.worklet.d.ts +1 -0
- package/dist/esm/audio/worklets/granular.worklet.js +89 -0
- package/dist/esm/audio/worklets/granular.worklet.js.map +1 -0
- package/dist/esm/audio/worklets/pitch-shift.worklet.d.ts +1 -0
- package/dist/esm/audio/worklets/pitch-shift.worklet.js +74 -0
- package/dist/esm/audio/worklets/pitch-shift.worklet.js.map +1 -0
- package/dist/esm/audio/worklets/vocoder.worklet.d.ts +1 -0
- package/dist/esm/audio/worklets/vocoder.worklet.js +92 -0
- package/dist/esm/audio/worklets/vocoder.worklet.js.map +1 -0
- package/dist/esm/core/Application.d.ts +86 -29
- package/dist/esm/core/Application.js +157 -47
- package/dist/esm/core/Application.js.map +1 -1
- package/dist/esm/core/Color.d.ts +0 -8
- package/dist/esm/core/Color.js +0 -24
- package/dist/esm/core/Color.js.map +1 -1
- package/dist/esm/core/Perf.d.ts +23 -0
- package/dist/esm/core/Perf.js +49 -0
- package/dist/esm/core/Perf.js.map +1 -0
- package/dist/esm/core/Scene.d.ts +40 -80
- package/dist/esm/core/Scene.js +63 -43
- package/dist/esm/core/Scene.js.map +1 -1
- package/dist/esm/core/SceneManager.d.ts +11 -25
- package/dist/esm/core/SceneManager.js +37 -100
- package/dist/esm/core/SceneManager.js.map +1 -1
- package/dist/esm/core/SceneNode.d.ts +28 -17
- package/dist/esm/core/SceneNode.js +66 -42
- package/dist/esm/core/SceneNode.js.map +1 -1
- package/dist/esm/core/Signal.d.ts +24 -28
- package/dist/esm/core/Signal.js +64 -50
- package/dist/esm/core/Signal.js.map +1 -1
- package/dist/esm/core/Timer.d.ts +1 -0
- package/dist/esm/core/Timer.js +3 -0
- package/dist/esm/core/Timer.js.map +1 -1
- package/dist/esm/core/capabilities.d.ts +2 -0
- package/dist/esm/core/capabilities.js +15 -0
- package/dist/esm/core/capabilities.js.map +1 -1
- package/dist/esm/core/index.d.ts +1 -0
- package/dist/esm/core/types.d.ts +1 -1
- package/dist/esm/core/utils.d.ts +12 -0
- package/dist/esm/core/utils.js +18 -1
- package/dist/esm/core/utils.js.map +1 -1
- package/dist/esm/debug/BoundingBoxesLayer.js +1 -1
- package/dist/esm/debug/BoundingBoxesLayer.js.map +1 -1
- package/dist/esm/debug/HitTestLayer.js +1 -1
- package/dist/esm/debug/HitTestLayer.js.map +1 -1
- package/dist/esm/debug/PerformanceLayer.js +1 -2
- package/dist/esm/debug/PerformanceLayer.js.map +1 -1
- package/dist/esm/debug/PointerStackLayer.js +1 -2
- package/dist/esm/debug/PointerStackLayer.js.map +1 -1
- package/dist/esm/debug/RenderPassInspectorLayer.js +1 -2
- package/dist/esm/debug/RenderPassInspectorLayer.js.map +1 -1
- package/dist/esm/index.js +37 -10
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/input/InputManager.d.ts +1 -0
- package/dist/esm/input/InputManager.js +30 -3
- package/dist/esm/input/InputManager.js.map +1 -1
- package/dist/esm/input/InteractionManager.d.ts +5 -2
- package/dist/esm/input/InteractionManager.js +29 -18
- package/dist/esm/input/InteractionManager.js.map +1 -1
- package/dist/esm/input/Pointer.js +3 -2
- package/dist/esm/input/Pointer.js.map +1 -1
- package/dist/esm/input/internal/interactionManagerRegistry.d.ts +9 -0
- package/dist/esm/input/internal/interactionManagerRegistry.js +10 -0
- package/dist/esm/input/internal/interactionManagerRegistry.js.map +1 -0
- package/dist/esm/math/AbstractVector.d.ts +1 -7
- package/dist/esm/math/AbstractVector.js +6 -20
- package/dist/esm/math/AbstractVector.js.map +1 -1
- package/dist/esm/math/Circle.js +0 -2
- package/dist/esm/math/Circle.js.map +1 -1
- package/dist/esm/math/Collision.d.ts +9 -3
- package/dist/esm/math/Ellipse.d.ts +2 -5
- package/dist/esm/math/Ellipse.js +10 -7
- package/dist/esm/math/Ellipse.js.map +1 -1
- package/dist/esm/math/ObservableVector.d.ts +1 -1
- package/dist/esm/math/ObservableVector.js +3 -3
- package/dist/esm/math/ObservableVector.js.map +1 -1
- package/dist/esm/math/Polygon.d.ts +0 -2
- package/dist/esm/math/Polygon.js +1 -9
- package/dist/esm/math/Polygon.js.map +1 -1
- package/dist/esm/math/Rectangle.js +0 -2
- package/dist/esm/math/Rectangle.js.map +1 -1
- package/dist/esm/math/collision-detection.d.ts +19 -4
- package/dist/esm/math/collision-detection.js +61 -4
- package/dist/esm/math/collision-detection.js.map +1 -1
- package/dist/esm/math/swept-collision.d.ts +16 -12
- package/dist/esm/math/swept-collision.js +109 -19
- package/dist/esm/math/swept-collision.js.map +1 -1
- package/dist/esm/particles/ParticleSystem.d.ts +8 -5
- package/dist/esm/particles/ParticleSystem.js +10 -6
- package/dist/esm/particles/ParticleSystem.js.map +1 -1
- package/dist/esm/particles/distributions/{Gradient.d.ts → ColorGradient.d.ts} +5 -5
- package/dist/esm/particles/distributions/{Gradient.js → ColorGradient.js} +5 -5
- package/dist/esm/particles/distributions/ColorGradient.js.map +1 -0
- package/dist/esm/particles/distributions/Distribution.d.ts +2 -2
- package/dist/esm/particles/distributions/index.d.ts +2 -2
- package/dist/esm/particles/gpu/ParticleGpuState.js +1 -1
- package/dist/esm/particles/index.d.ts +1 -0
- package/dist/esm/particles/modules/ColorOverLifetime.d.ts +3 -3
- package/dist/esm/particles/modules/ColorOverLifetime.js.map +1 -1
- package/dist/esm/particles/modules/ColorOverSpeed.d.ts +3 -3
- package/dist/esm/particles/modules/ColorOverSpeed.js.map +1 -1
- package/dist/esm/particles/modules/UpdateModule.d.ts +2 -2
- package/dist/esm/particles/modules/UpdateModule.js +1 -1
- package/dist/esm/particles/modules/WgslContribution.d.ts +2 -2
- package/dist/esm/rendering/CallbackRenderPass.d.ts +1 -0
- package/dist/esm/rendering/CallbackRenderPass.js +1 -0
- package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
- package/dist/esm/rendering/Camera.d.ts +33 -0
- package/dist/esm/rendering/Camera.js +38 -0
- package/dist/esm/rendering/Camera.js.map +1 -0
- package/dist/esm/rendering/Container.d.ts +7 -25
- package/dist/esm/rendering/Container.js +25 -87
- package/dist/esm/rendering/Container.js.map +1 -1
- package/dist/esm/rendering/Drawable.d.ts +8 -10
- package/dist/esm/rendering/Drawable.js +12 -20
- package/dist/esm/rendering/Drawable.js.map +1 -1
- package/dist/esm/rendering/RenderBackend.d.ts +19 -0
- package/dist/esm/rendering/RenderNode.d.ts +82 -11
- package/dist/esm/rendering/RenderNode.js +133 -163
- package/dist/esm/rendering/RenderNode.js.map +1 -1
- package/dist/esm/rendering/RenderPass.d.ts +1 -0
- package/dist/esm/rendering/RenderStats.d.ts +9 -0
- package/dist/esm/rendering/RenderStats.js +2 -0
- package/dist/esm/rendering/RenderStats.js.map +1 -1
- package/dist/esm/rendering/RenderTarget.d.ts +13 -0
- package/dist/esm/rendering/RenderTarget.js +13 -0
- package/dist/esm/rendering/RenderTarget.js.map +1 -1
- package/dist/esm/rendering/RenderTargetPass.js +17 -0
- package/dist/esm/rendering/RenderTargetPass.js.map +1 -1
- package/dist/esm/rendering/RendererRegistry.d.ts +1 -0
- package/dist/esm/rendering/RendererRegistry.js +1 -0
- package/dist/esm/rendering/RendererRegistry.js.map +1 -1
- package/dist/esm/rendering/RenderingContext.d.ts +87 -0
- package/dist/esm/rendering/RenderingContext.js +157 -0
- package/dist/esm/rendering/RenderingContext.js.map +1 -0
- package/dist/esm/rendering/TransformBuffer.d.ts +38 -0
- package/dist/esm/rendering/TransformBuffer.js +116 -0
- package/dist/esm/rendering/TransformBuffer.js.map +1 -0
- package/dist/esm/rendering/View.d.ts +23 -0
- package/dist/esm/rendering/View.js +42 -0
- package/dist/esm/rendering/View.js.map +1 -1
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js +5 -12
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -1
- package/dist/esm/rendering/geometry/Geometry.d.ts +40 -0
- package/dist/esm/rendering/geometry/Geometry.js +228 -0
- package/dist/esm/rendering/geometry/Geometry.js.map +1 -0
- package/dist/esm/rendering/geometry/GeometryAttribute.d.ts +32 -0
- package/dist/esm/rendering/geometry/QuadGeometry.d.ts +5 -0
- package/dist/esm/rendering/gradient/Gradient.d.ts +34 -0
- package/dist/esm/rendering/gradient/Gradient.js +114 -0
- package/dist/esm/rendering/gradient/Gradient.js.map +1 -0
- package/dist/esm/rendering/gradient/LinearGradient.d.ts +10 -0
- package/dist/esm/rendering/gradient/LinearGradient.js +26 -0
- package/dist/esm/rendering/gradient/LinearGradient.js.map +1 -0
- package/dist/esm/rendering/gradient/RadialGradient.d.ts +10 -0
- package/dist/esm/rendering/gradient/RadialGradient.js +25 -0
- package/dist/esm/rendering/gradient/RadialGradient.js.map +1 -0
- package/dist/esm/rendering/index.d.ts +103 -59
- package/dist/esm/rendering/material/Material.d.ts +114 -0
- package/dist/esm/rendering/material/Material.js +111 -0
- package/dist/esm/rendering/material/Material.js.map +1 -0
- package/dist/esm/rendering/material/MaterialKey.d.ts +18 -0
- package/dist/esm/rendering/material/MaterialKey.js +82 -0
- package/dist/esm/rendering/material/MaterialKey.js.map +1 -0
- package/dist/esm/rendering/material/MeshMaterial.d.ts +16 -0
- package/dist/esm/rendering/material/MeshMaterial.js +21 -0
- package/dist/esm/rendering/material/MeshMaterial.js.map +1 -0
- package/dist/esm/rendering/{mesh/MeshShader.d.ts → material/ShaderSource.d.ts} +30 -62
- package/dist/esm/rendering/{mesh/MeshShader.js → material/ShaderSource.js} +36 -62
- package/dist/esm/rendering/material/ShaderSource.js.map +1 -0
- package/dist/esm/rendering/material/SpriteMaterial.d.ts +15 -0
- package/dist/esm/rendering/material/SpriteMaterial.js +20 -0
- package/dist/esm/rendering/material/SpriteMaterial.js.map +1 -0
- package/dist/esm/rendering/mesh/Mesh.d.ts +29 -12
- package/dist/esm/rendering/mesh/Mesh.js +123 -4
- package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
- package/dist/esm/rendering/pass/RenderPassCoordinator.d.ts +63 -0
- package/dist/esm/rendering/pass/RenderPassDescriptor.d.ts +48 -0
- package/dist/esm/rendering/pass/RenderPassDescriptor.js +16 -0
- package/dist/esm/rendering/pass/RenderPassDescriptor.js.map +1 -0
- package/dist/esm/rendering/plan/RenderCommand.d.ts +67 -0
- package/dist/esm/rendering/plan/RenderCommand.js +94 -0
- package/dist/esm/rendering/plan/RenderCommand.js.map +1 -0
- package/dist/esm/rendering/plan/RenderEffectExecutor.d.ts +10 -0
- package/dist/esm/rendering/plan/RenderEffectExecutor.js +159 -0
- package/dist/esm/rendering/plan/RenderEffectExecutor.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlan.d.ts +23 -0
- package/dist/esm/rendering/plan/RenderPlan.js +12 -0
- package/dist/esm/rendering/plan/RenderPlan.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlanBuilder.d.ts +31 -0
- package/dist/esm/rendering/plan/RenderPlanBuilder.js +242 -0
- package/dist/esm/rendering/plan/RenderPlanBuilder.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlanOptimizer.d.ts +10 -0
- package/dist/esm/rendering/plan/RenderPlanOptimizer.js +180 -0
- package/dist/esm/rendering/plan/RenderPlanOptimizer.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlanPlayer.d.ts +9 -0
- package/dist/esm/rendering/plan/RenderPlanPlayer.js +56 -0
- package/dist/esm/rendering/plan/RenderPlanPlayer.js.map +1 -0
- package/dist/esm/rendering/plan/RenderScope.d.ts +70 -0
- package/dist/esm/rendering/plan/RenderScope.js +16 -0
- package/dist/esm/rendering/plan/RenderScope.js.map +1 -0
- package/dist/esm/rendering/plan/playRenderTree.d.ts +4 -0
- package/dist/esm/rendering/plan/playRenderTree.js +19 -0
- package/dist/esm/rendering/plan/playRenderTree.js.map +1 -0
- package/dist/esm/rendering/shader/Shader.d.ts +1 -0
- package/dist/esm/rendering/shader/Shader.js +1 -0
- package/dist/esm/rendering/shader/Shader.js.map +1 -1
- package/dist/esm/rendering/shader/ShaderUniform.d.ts +1 -0
- package/dist/esm/rendering/shader/ShaderUniform.js +1 -0
- package/dist/esm/rendering/shader/ShaderUniform.js.map +1 -1
- package/dist/esm/rendering/sprite/Sprite.d.ts +25 -3
- package/dist/esm/rendering/sprite/Sprite.js +48 -15
- package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
- package/dist/esm/rendering/sprite/spriteMaterialSources.d.ts +36 -0
- package/dist/esm/rendering/sprite/spriteMaterialSources.js +128 -0
- package/dist/esm/rendering/sprite/spriteMaterialSources.js.map +1 -0
- package/dist/esm/rendering/text/AbstractText.d.ts +36 -0
- package/dist/esm/rendering/text/AbstractText.js +49 -0
- package/dist/esm/rendering/text/AbstractText.js.map +1 -0
- package/dist/esm/rendering/text/BitmapText.d.ts +97 -0
- package/dist/esm/rendering/text/BitmapText.js +220 -0
- package/dist/esm/rendering/text/BitmapText.js.map +1 -0
- package/dist/esm/rendering/text/BmFont.d.ts +50 -0
- package/dist/esm/rendering/text/BmFont.js +24 -0
- package/dist/esm/rendering/text/BmFont.js.map +1 -0
- package/dist/esm/rendering/text/GlyphAtlas.d.ts +104 -0
- package/dist/esm/rendering/text/GlyphAtlas.js +347 -0
- package/dist/esm/rendering/text/GlyphAtlas.js.map +1 -0
- package/dist/esm/rendering/text/GlyphAtlasPool.d.ts +40 -0
- package/dist/esm/rendering/text/GlyphAtlasPool.js +67 -0
- package/dist/esm/rendering/text/GlyphAtlasPool.js.map +1 -0
- package/dist/esm/rendering/text/GlyphSdf.d.ts +92 -0
- package/dist/esm/rendering/text/GlyphSdf.js +220 -0
- package/dist/esm/rendering/text/GlyphSdf.js.map +1 -0
- package/dist/esm/rendering/text/HTMLText.d.ts +107 -0
- package/dist/esm/rendering/text/HTMLText.js +284 -0
- package/dist/esm/rendering/text/HTMLText.js.map +1 -0
- package/dist/esm/rendering/text/LayoutOptions.d.ts +30 -0
- package/dist/esm/rendering/text/Text.d.ts +89 -20
- package/dist/esm/rendering/text/Text.js +176 -101
- package/dist/esm/rendering/text/Text.js.map +1 -1
- package/dist/esm/rendering/text/TextLayout.d.ts +20 -8
- package/dist/esm/rendering/text/TextLayout.js +234 -25
- package/dist/esm/rendering/text/TextLayout.js.map +1 -1
- package/dist/esm/rendering/text/TextStyle.d.ts +154 -87
- package/dist/esm/rendering/text/TextStyle.js +257 -203
- package/dist/esm/rendering/text/TextStyle.js.map +1 -1
- package/dist/esm/rendering/text/types.d.ts +73 -13
- package/dist/esm/rendering/texture/DataTexture.d.ts +5 -0
- package/dist/esm/rendering/texture/DataTexture.js +7 -0
- package/dist/esm/rendering/texture/DataTexture.js.map +1 -1
- package/dist/esm/rendering/texture/Texture.d.ts +1 -0
- package/dist/esm/rendering/texture/Texture.js +1 -0
- package/dist/esm/rendering/texture/Texture.js.map +1 -1
- package/dist/esm/rendering/types.d.ts +3 -1
- package/dist/esm/rendering/types.js +2 -0
- package/dist/esm/rendering/types.js.map +1 -1
- package/dist/esm/rendering/video/Video.d.ts +5 -8
- package/dist/esm/rendering/video/Video.js +12 -13
- package/dist/esm/rendering/video/Video.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +40 -0
- package/dist/esm/rendering/webgl2/WebGl2Backend.js +344 -27
- package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.d.ts +22 -2
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +404 -112
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.d.ts +57 -0
- package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js +79 -0
- package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +12 -0
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +214 -58
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2StencilClipper.d.ts +34 -0
- package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js +169 -0
- package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.d.ts +56 -0
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js +486 -0
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/mesh.frag.js +1 -1
- package/dist/esm/rendering/webgl2/glsl/mesh.vert.js +1 -1
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/text-color.frag.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/text-color.frag.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/text-msdf.frag.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/text-msdf.frag.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/text-sdf.frag.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/text-sdf.frag.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/text.vert.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/text.vert.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +50 -0
- package/dist/esm/rendering/webgpu/WebGpuBackend.js +151 -27
- package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuBlendState.js +26 -0
- package/dist/esm/rendering/webgpu/WebGpuBlendState.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js +22 -17
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +26 -2
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +511 -89
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +13 -17
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.d.ts +141 -0
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js +270 -0
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +16 -0
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +344 -27
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.d.ts +57 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js +257 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilState.d.ts +14 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilState.js +36 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilState.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.d.ts +70 -0
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js +775 -0
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts +16 -0
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js +57 -0
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js.map +1 -0
- package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js +96 -0
- package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js.map +1 -0
- package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js +68 -0
- package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js.map +1 -0
- package/dist/esm/resources/Asset.d.ts +23 -0
- package/dist/esm/resources/Asset.js +23 -0
- package/dist/esm/resources/Asset.js.map +1 -0
- package/dist/esm/resources/AssetDefinitions.d.ts +137 -0
- package/dist/esm/resources/Assets.d.ts +35 -0
- package/dist/esm/resources/Assets.js +32 -0
- package/dist/esm/resources/Assets.js.map +1 -0
- package/dist/esm/resources/IndexedDbDatabase.js +17 -1
- package/dist/esm/resources/IndexedDbDatabase.js.map +1 -1
- package/dist/esm/resources/IndexedDbStore.js +17 -1
- package/dist/esm/resources/IndexedDbStore.js.map +1 -1
- package/dist/esm/resources/JsonStore.d.ts +18 -0
- package/dist/esm/resources/JsonStore.js +62 -0
- package/dist/esm/resources/JsonStore.js.map +1 -0
- package/dist/esm/resources/Loader.d.ts +244 -18
- package/dist/esm/resources/Loader.js +456 -50
- package/dist/esm/resources/Loader.js.map +1 -1
- package/dist/esm/resources/LoadingQueue.d.ts +28 -0
- package/dist/esm/resources/LoadingQueue.js +59 -0
- package/dist/esm/resources/LoadingQueue.js.map +1 -0
- package/dist/esm/resources/factories/BmFontFactory.d.ts +25 -0
- package/dist/esm/resources/factories/BmFontFactory.js +96 -0
- package/dist/esm/resources/factories/BmFontFactory.js.map +1 -0
- package/dist/esm/resources/factories/CsvFactory.d.ts +35 -0
- package/dist/esm/resources/factories/CsvFactory.js +87 -0
- package/dist/esm/resources/factories/CsvFactory.js.map +1 -0
- package/dist/esm/resources/factories/ImageFactory.d.ts +14 -8
- package/dist/esm/resources/factories/ImageFactory.js +13 -6
- package/dist/esm/resources/factories/ImageFactory.js.map +1 -1
- package/dist/esm/resources/factories/MusicFactory.d.ts +8 -2
- package/dist/esm/resources/factories/MusicFactory.js +25 -14
- package/dist/esm/resources/factories/MusicFactory.js.map +1 -1
- package/dist/esm/resources/factories/SoundFactory.d.ts +2 -2
- package/dist/esm/resources/factories/SoundFactory.js.map +1 -1
- package/dist/esm/resources/factories/SubtitleFactory.d.ts +28 -0
- package/dist/esm/resources/factories/SubtitleFactory.js +203 -0
- package/dist/esm/resources/factories/SubtitleFactory.js.map +1 -0
- package/dist/esm/resources/factories/SvgFactory.d.ts +18 -1
- package/dist/esm/resources/factories/SvgFactory.js +21 -2
- package/dist/esm/resources/factories/SvgFactory.js.map +1 -1
- package/dist/esm/resources/factories/TextureFactory.d.ts +4 -4
- package/dist/esm/resources/factories/TextureFactory.js +8 -4
- package/dist/esm/resources/factories/TextureFactory.js.map +1 -1
- package/dist/esm/resources/factories/VideoFactory.d.ts +8 -2
- package/dist/esm/resources/factories/VideoFactory.js +27 -20
- package/dist/esm/resources/factories/VideoFactory.js.map +1 -1
- package/dist/esm/resources/factories/XmlFactory.d.ts +24 -0
- package/dist/esm/resources/factories/XmlFactory.js +37 -0
- package/dist/esm/resources/factories/XmlFactory.js.map +1 -0
- package/dist/esm/resources/index.d.ts +9 -1
- package/dist/esm/resources/tokens.d.ts +49 -3
- package/dist/esm/resources/tokens.js +50 -4
- package/dist/esm/resources/tokens.js.map +1 -1
- package/dist/exo.esm.js +15382 -8078
- package/dist/exo.esm.js.map +1 -1
- package/package.json +34 -16
- package/dist/esm/input/interaction-hooks.d.ts +0 -34
- package/dist/esm/input/interaction-hooks.js +0 -35
- package/dist/esm/input/interaction-hooks.js.map +0 -1
- package/dist/esm/particles/distributions/Gradient.js.map +0 -1
- package/dist/esm/rendering/mesh/MeshShader.js.map +0 -1
- package/dist/esm/rendering/text/DynamicGlyphAtlas.d.ts +0 -33
- package/dist/esm/rendering/text/DynamicGlyphAtlas.js +0 -134
- package/dist/esm/rendering/text/DynamicGlyphAtlas.js.map +0 -1
- package/dist/esm/rendering/text/atlas-singleton.d.ts +0 -7
- package/dist/esm/rendering/text/atlas-singleton.js +0 -17
- package/dist/esm/rendering/text/atlas-singleton.js.map +0 -1
- package/dist/esm/resources/factories/VttFactory.d.ts +0 -24
- package/dist/esm/resources/factories/VttFactory.js +0 -158
- package/dist/esm/resources/factories/VttFactory.js.map +0 -1
- package/dist/esm/vendor/webgl-debug.js +0 -1160
- package/dist/esm/vendor/webgl-debug.js.map +0 -1
|
@@ -32,27 +32,38 @@ class MusicFactory extends AbstractAssetFactory {
|
|
|
32
32
|
* load event is received.
|
|
33
33
|
*/
|
|
34
34
|
async create(source, options = {}) {
|
|
35
|
-
const { mimeType, loadEvent, playbackOptions } = options;
|
|
35
|
+
const { mimeType, loadEvent, playbackOptions, stallTimeout } = options;
|
|
36
36
|
const blob = new Blob([source], { type: mimeType ?? determineMimeType(source) });
|
|
37
37
|
const objectUrl = this.createObjectUrl(blob);
|
|
38
38
|
return new Promise((resolve, reject) => {
|
|
39
39
|
const audio = document.createElement('audio');
|
|
40
40
|
this._audioElements.push(audio);
|
|
41
|
-
|
|
41
|
+
let stallTimer;
|
|
42
|
+
let settled = false;
|
|
43
|
+
const settle = (fn) => {
|
|
44
|
+
if (settled)
|
|
45
|
+
return;
|
|
46
|
+
settled = true;
|
|
47
|
+
if (stallTimer !== undefined) {
|
|
48
|
+
clearTimeout(stallTimer);
|
|
49
|
+
stallTimer = undefined;
|
|
50
|
+
}
|
|
42
51
|
this.revokeObjectUrl(objectUrl);
|
|
52
|
+
fn();
|
|
43
53
|
};
|
|
44
|
-
audio.addEventListener('error', () =>
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
audio.addEventListener('error', () => settle(() => reject(new Error('Error loading audio source.'))), onceListenerOption);
|
|
55
|
+
audio.addEventListener('abort', () => settle(() => reject(new Error('Audio loading was canceled.'))), onceListenerOption);
|
|
56
|
+
audio.addEventListener('emptied', () => settle(() => reject(new Error('Audio loading was emptied.'))), onceListenerOption);
|
|
57
|
+
audio.addEventListener(loadEvent ?? 'canplaythrough', () => settle(() => resolve(new Music(audio, playbackOptions))), onceListenerOption);
|
|
58
|
+
if (stallTimeout !== undefined) {
|
|
59
|
+
audio.addEventListener('stalled', () => {
|
|
60
|
+
if (settled)
|
|
61
|
+
return;
|
|
62
|
+
if (stallTimer !== undefined)
|
|
63
|
+
clearTimeout(stallTimer);
|
|
64
|
+
stallTimer = setTimeout(() => settle(() => reject(new Error('Audio loading stalled.'))), stallTimeout);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
56
67
|
audio.preload = 'auto';
|
|
57
68
|
audio.src = objectUrl;
|
|
58
69
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MusicFactory.js","sources":["../../../../../src/resources/factories/MusicFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAKA,MAAM,kBAAkB,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"MusicFactory.js","sources":["../../../../../src/resources/factories/MusicFactory.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { type AudioSpriteClip, Sound } from '@/audio/Sound';
|
|
2
2
|
import type { PlaybackOptions } from '@/core/types';
|
|
3
3
|
import { AbstractAssetFactory } from '@/resources/AbstractAssetFactory';
|
|
4
|
-
|
|
4
|
+
/** Construction options for {@link SoundFactory.create}. */
|
|
5
|
+
export interface SoundFactoryOptions {
|
|
5
6
|
/** Initial playback settings forwarded to the {@link Sound} instance. */
|
|
6
7
|
playbackOptions?: Partial<PlaybackOptions>;
|
|
7
8
|
/**
|
|
@@ -40,4 +41,3 @@ export declare class SoundFactory extends AbstractAssetFactory<Sound> {
|
|
|
40
41
|
*/
|
|
41
42
|
create(source: ArrayBuffer, options?: SoundFactoryOptions): Promise<Sound>;
|
|
42
43
|
}
|
|
43
|
-
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SoundFactory.js","sources":["../../../../../src/resources/factories/SoundFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"SoundFactory.js","sources":["../../../../../src/resources/factories/SoundFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAuBA;;;;;;;;;AASG;AACG,MAAO,YAAa,SAAQ,oBAA2B,CAAA;IAC3C,WAAW,GAAG,OAAO;AAErC;;;AAGG;IACI,MAAM,OAAO,CAAC,QAAkB,EAAA;AACrC,QAAA,OAAO,QAAQ,CAAC,WAAW,EAAE;IAC/B;AAEA;;;AAGG;AACI,IAAA,MAAM,MAAM,CAAC,MAAmB,EAAE,UAA+B,EAAE,EAAA;AACxE,QAAA,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC;AAEjD,QAAA,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE;YACnC,GAAG,OAAO,CAAC,eAAe;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;AACzB,SAAA,CAAC;AAEF,QAAA,OAAO,KAAK;IACd;AACD;;;;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { AbstractAssetFactory } from '@/resources/AbstractAssetFactory';
|
|
2
|
+
type SubtitleFormat = 'vtt' | 'srt';
|
|
3
|
+
interface SubtitleIntermediate {
|
|
4
|
+
fmt: SubtitleFormat;
|
|
5
|
+
text: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* {@link AssetFactory} implementation that parses WebVTT (`.vtt`) and SubRip
|
|
9
|
+
* (`.srt`) subtitle files and produces an array of {@link VTTCue} instances.
|
|
10
|
+
*
|
|
11
|
+
* Format is detected from the file extension of the response URL; unknown
|
|
12
|
+
* extensions default to VTT parsing. VTT cue settings (`align`, `line`,
|
|
13
|
+
* `position`, `size`, `vertical`) are applied; SRT cues retain default
|
|
14
|
+
* positional properties.
|
|
15
|
+
*/
|
|
16
|
+
export declare class SubtitleFactory extends AbstractAssetFactory<VTTCue[]> {
|
|
17
|
+
readonly storageName = "subtitle";
|
|
18
|
+
/**
|
|
19
|
+
* Reads the response body as UTF-8 text and records the subtitle format
|
|
20
|
+
* derived from the response URL's file extension.
|
|
21
|
+
*/
|
|
22
|
+
process(response: Response): Promise<SubtitleIntermediate>;
|
|
23
|
+
/**
|
|
24
|
+
* Parses the subtitle text into an ordered array of {@link VTTCue} instances.
|
|
25
|
+
*/
|
|
26
|
+
create(source: SubtitleIntermediate): Promise<VTTCue[]>;
|
|
27
|
+
}
|
|
28
|
+
export {};
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { AbstractAssetFactory } from '../AbstractAssetFactory.js';
|
|
2
|
+
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// VTT helpers
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
/**
|
|
7
|
+
* Converts a WebVTT timestamp string (`HH:MM:SS.mmm`, `MM:SS.mmm`, or
|
|
8
|
+
* `SS.mmm`) into a floating-point number of seconds.
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
const parseVttTimestamp = (value) => {
|
|
13
|
+
const parts = value.split(':');
|
|
14
|
+
let seconds;
|
|
15
|
+
if (parts.length === 3) {
|
|
16
|
+
seconds = Number(parts[0]) * 3600 + Number(parts[1]) * 60 + Number(parts[2]);
|
|
17
|
+
}
|
|
18
|
+
else if (parts.length === 2) {
|
|
19
|
+
seconds = Number(parts[0]) * 60 + Number(parts[1]);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
seconds = Number(parts[0]);
|
|
23
|
+
}
|
|
24
|
+
return seconds;
|
|
25
|
+
};
|
|
26
|
+
const validAlignValues = new Set(['start', 'center', 'end', 'left', 'right']);
|
|
27
|
+
const validLineAlignValues = new Set(['start', 'center', 'end']);
|
|
28
|
+
const validPositionAlignValues = new Set(['auto', 'line-left', 'center', 'line-right']);
|
|
29
|
+
/**
|
|
30
|
+
* Parses the WebVTT cue-settings tail (`align:center line:80% position:50%`)
|
|
31
|
+
* and applies each recognized setting to the supplied {@link VTTCue}.
|
|
32
|
+
*
|
|
33
|
+
* Unknown keys, malformed values, and unknown enum members are silently
|
|
34
|
+
* skipped so that one bad token does not invalidate an otherwise valid cue.
|
|
35
|
+
* Percent signs on numeric values are tolerated and stripped.
|
|
36
|
+
*
|
|
37
|
+
* @internal
|
|
38
|
+
*/
|
|
39
|
+
const applyCueSettings = (cue, settings) => {
|
|
40
|
+
if (!settings) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
for (const token of settings.split(/\s+/)) {
|
|
44
|
+
const colonIndex = token.indexOf(':');
|
|
45
|
+
if (colonIndex === -1) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const name = token.slice(0, colonIndex);
|
|
49
|
+
const value = token.slice(colonIndex + 1);
|
|
50
|
+
switch (name) {
|
|
51
|
+
case 'vertical':
|
|
52
|
+
if (value === 'rl' || value === 'lr' || value === '') {
|
|
53
|
+
cue.vertical = value;
|
|
54
|
+
}
|
|
55
|
+
break;
|
|
56
|
+
case 'line': {
|
|
57
|
+
if (value === 'auto') {
|
|
58
|
+
cue.line = 'auto';
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
const [linePart, alignPart] = value.split(',');
|
|
62
|
+
const num = parseFloat(linePart);
|
|
63
|
+
if (!Number.isNaN(num)) {
|
|
64
|
+
cue.line = num;
|
|
65
|
+
}
|
|
66
|
+
if (alignPart !== undefined && validLineAlignValues.has(alignPart)) {
|
|
67
|
+
cue.lineAlign = alignPart;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
case 'position': {
|
|
73
|
+
const [posPart, alignPart] = value.split(',');
|
|
74
|
+
const num = parseFloat(posPart);
|
|
75
|
+
if (!Number.isNaN(num)) {
|
|
76
|
+
cue.position = num;
|
|
77
|
+
}
|
|
78
|
+
if (alignPart !== undefined && validPositionAlignValues.has(alignPart)) {
|
|
79
|
+
cue.positionAlign = alignPart;
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
case 'size': {
|
|
84
|
+
const num = parseFloat(value);
|
|
85
|
+
if (!Number.isNaN(num)) {
|
|
86
|
+
cue.size = num;
|
|
87
|
+
}
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
case 'align':
|
|
91
|
+
if (validAlignValues.has(value)) {
|
|
92
|
+
cue.align = value;
|
|
93
|
+
}
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
const parseVtt = (source) => {
|
|
99
|
+
const cues = [];
|
|
100
|
+
const lines = source.replaceAll('\r\n', '\n').replaceAll('\r', '\n').split('\n');
|
|
101
|
+
let i = 0;
|
|
102
|
+
// Skip header and any blank lines/metadata before first cue
|
|
103
|
+
while (i < lines.length && !lines[i].includes('-->')) {
|
|
104
|
+
i++;
|
|
105
|
+
}
|
|
106
|
+
while (i < lines.length) {
|
|
107
|
+
const line = lines[i].trim();
|
|
108
|
+
if (line.includes('-->')) {
|
|
109
|
+
const arrowIndex = line.indexOf('-->');
|
|
110
|
+
const startString = line.slice(0, arrowIndex).trim();
|
|
111
|
+
const rest = line.slice(arrowIndex + 3).trim();
|
|
112
|
+
const restTokens = rest.split(/\s+/);
|
|
113
|
+
const endString = restTokens[0];
|
|
114
|
+
const settingsString = restTokens.slice(1).join(' ');
|
|
115
|
+
const start = parseVttTimestamp(startString);
|
|
116
|
+
const end = parseVttTimestamp(endString);
|
|
117
|
+
i++;
|
|
118
|
+
const textLines = [];
|
|
119
|
+
while (i < lines.length && lines[i].trim() !== '') {
|
|
120
|
+
textLines.push(lines[i]);
|
|
121
|
+
i++;
|
|
122
|
+
}
|
|
123
|
+
const cue = new VTTCue(start, end, textLines.join('\n'));
|
|
124
|
+
applyCueSettings(cue, settingsString);
|
|
125
|
+
cues.push(cue);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
i++;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return cues;
|
|
132
|
+
};
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
// SRT helpers
|
|
135
|
+
// ---------------------------------------------------------------------------
|
|
136
|
+
/**
|
|
137
|
+
* Converts an SRT timestamp string (`HH:MM:SS,mmm`) into a floating-point
|
|
138
|
+
* number of seconds.
|
|
139
|
+
*
|
|
140
|
+
* @internal
|
|
141
|
+
*/
|
|
142
|
+
const parseSrtTimestamp = (value) => {
|
|
143
|
+
const normalized = value.trim().replace(',', '.');
|
|
144
|
+
const parts = normalized.split(':');
|
|
145
|
+
return Number(parts[0]) * 3600 + Number(parts[1]) * 60 + Number(parts[2]);
|
|
146
|
+
};
|
|
147
|
+
const parseSrt = (source) => {
|
|
148
|
+
const cues = [];
|
|
149
|
+
const normalized = source.replaceAll('\r\n', '\n').replaceAll('\r', '\n');
|
|
150
|
+
const blocks = normalized.split(/\n[ \t]*\n/);
|
|
151
|
+
for (const block of blocks) {
|
|
152
|
+
const lines = block.trim().split('\n');
|
|
153
|
+
if (lines.length < 2)
|
|
154
|
+
continue;
|
|
155
|
+
let timingIndex = 0;
|
|
156
|
+
if (/^\d+$/.test(lines[0].trim())) {
|
|
157
|
+
timingIndex = 1;
|
|
158
|
+
}
|
|
159
|
+
const timingLine = lines[timingIndex];
|
|
160
|
+
if (!timingLine?.includes('-->'))
|
|
161
|
+
continue;
|
|
162
|
+
const arrowIndex = timingLine.indexOf('-->');
|
|
163
|
+
const start = parseSrtTimestamp(timingLine.slice(0, arrowIndex));
|
|
164
|
+
const end = parseSrtTimestamp(timingLine.slice(arrowIndex + 3));
|
|
165
|
+
const text = lines.slice(timingIndex + 1).join('\n');
|
|
166
|
+
cues.push(new VTTCue(start, end, text));
|
|
167
|
+
}
|
|
168
|
+
return cues;
|
|
169
|
+
};
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
// Factory
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
/**
|
|
174
|
+
* {@link AssetFactory} implementation that parses WebVTT (`.vtt`) and SubRip
|
|
175
|
+
* (`.srt`) subtitle files and produces an array of {@link VTTCue} instances.
|
|
176
|
+
*
|
|
177
|
+
* Format is detected from the file extension of the response URL; unknown
|
|
178
|
+
* extensions default to VTT parsing. VTT cue settings (`align`, `line`,
|
|
179
|
+
* `position`, `size`, `vertical`) are applied; SRT cues retain default
|
|
180
|
+
* positional properties.
|
|
181
|
+
*/
|
|
182
|
+
class SubtitleFactory extends AbstractAssetFactory {
|
|
183
|
+
storageName = 'subtitle';
|
|
184
|
+
/**
|
|
185
|
+
* Reads the response body as UTF-8 text and records the subtitle format
|
|
186
|
+
* derived from the response URL's file extension.
|
|
187
|
+
*/
|
|
188
|
+
async process(response) {
|
|
189
|
+
const text = await response.text();
|
|
190
|
+
const url = response.url.split('?')[0].toLowerCase();
|
|
191
|
+
const fmt = url.endsWith('.srt') ? 'srt' : 'vtt';
|
|
192
|
+
return { fmt, text };
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Parses the subtitle text into an ordered array of {@link VTTCue} instances.
|
|
196
|
+
*/
|
|
197
|
+
async create(source) {
|
|
198
|
+
return source.fmt === 'srt' ? parseSrt(source.text) : parseVtt(source.text);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export { SubtitleFactory };
|
|
203
|
+
//# sourceMappingURL=SubtitleFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubtitleFactory.js","sources":["../../../../../src/resources/factories/SubtitleFactory.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
import { AbstractAssetFactory } from '@/resources/AbstractAssetFactory';
|
|
2
|
+
/** Construction options for {@link SvgFactory.create}. */
|
|
3
|
+
export interface SvgFactoryOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Target render width in pixels. When provided, the value is injected into
|
|
6
|
+
* the root `<svg>` element's `width` attribute before the browser rasterises
|
|
7
|
+
* the image, overriding any intrinsic width declared in the file.
|
|
8
|
+
*
|
|
9
|
+
* SVGs that carry only a `viewBox` (no `width`/`height` attributes) render
|
|
10
|
+
* as a 0×0 image by default; supplying `width` and `height` here fixes that.
|
|
11
|
+
*/
|
|
12
|
+
width?: number;
|
|
13
|
+
/** Target render height in pixels. See {@link width}. */
|
|
14
|
+
height?: number;
|
|
15
|
+
}
|
|
2
16
|
/**
|
|
3
17
|
* {@link AssetFactory} implementation that loads SVG markup and produces a
|
|
4
18
|
* rasterised {@link HTMLImageElement}.
|
|
@@ -17,9 +31,12 @@ export declare class SvgFactory extends AbstractAssetFactory<HTMLImageElement> {
|
|
|
17
31
|
/**
|
|
18
32
|
* Renders the SVG markup into a fully loaded {@link HTMLImageElement}.
|
|
19
33
|
*
|
|
34
|
+
* When `options.width` or `options.height` are provided, the values are
|
|
35
|
+
* injected into the root `<svg>` element before rasterisation so the browser
|
|
36
|
+
* renders at the requested pixel dimensions rather than the intrinsic size.
|
|
20
37
|
* Creates a temporary `image/svg+xml` object URL, assigns it to an `<img>`
|
|
21
38
|
* element, and revokes the URL once loading settles. Rejects on load error
|
|
22
39
|
* or abort.
|
|
23
40
|
*/
|
|
24
|
-
create(source: string): Promise<HTMLImageElement>;
|
|
41
|
+
create(source: string, options?: SvgFactoryOptions): Promise<HTMLImageElement>;
|
|
25
42
|
}
|
|
@@ -20,12 +20,31 @@ class SvgFactory extends AbstractAssetFactory {
|
|
|
20
20
|
/**
|
|
21
21
|
* Renders the SVG markup into a fully loaded {@link HTMLImageElement}.
|
|
22
22
|
*
|
|
23
|
+
* When `options.width` or `options.height` are provided, the values are
|
|
24
|
+
* injected into the root `<svg>` element before rasterisation so the browser
|
|
25
|
+
* renders at the requested pixel dimensions rather than the intrinsic size.
|
|
23
26
|
* Creates a temporary `image/svg+xml` object URL, assigns it to an `<img>`
|
|
24
27
|
* element, and revokes the URL once loading settles. Rejects on load error
|
|
25
28
|
* or abort.
|
|
26
29
|
*/
|
|
27
|
-
async create(source) {
|
|
28
|
-
const
|
|
30
|
+
async create(source, options = {}) {
|
|
31
|
+
const { width, height } = options;
|
|
32
|
+
let svgSource = source;
|
|
33
|
+
if (width !== undefined || height !== undefined) {
|
|
34
|
+
const svgStart = svgSource.indexOf('<svg');
|
|
35
|
+
const tagClose = svgSource.indexOf('>', svgStart);
|
|
36
|
+
if (svgStart !== -1 && tagClose !== -1) {
|
|
37
|
+
const before = svgSource.slice(0, svgStart);
|
|
38
|
+
const attrs = svgSource.slice(svgStart + 4, tagClose); // after '<svg', before '>'
|
|
39
|
+
const after = svgSource.slice(tagClose + 1);
|
|
40
|
+
const cleaned = String(attrs)
|
|
41
|
+
.replaceAll(/\s+width=(?:"[^"]*"|'[^']*')/g, '')
|
|
42
|
+
.replaceAll(/\s+height=(?:"[^"]*"|'[^']*')/g, '');
|
|
43
|
+
const additions = (width !== undefined ? ` width="${width}"` : '') + (height !== undefined ? ` height="${height}"` : '');
|
|
44
|
+
svgSource = `${before}<svg${cleaned}${additions}>${after}`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const blob = new Blob([svgSource], { type: 'image/svg+xml' });
|
|
29
48
|
const objectUrl = this.createObjectUrl(blob);
|
|
30
49
|
return new Promise((resolve, reject) => {
|
|
31
50
|
const image = new Image();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SvgFactory.js","sources":["../../../../../src/resources/factories/SvgFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"SvgFactory.js","sources":["../../../../../src/resources/factories/SvgFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAiBA;;;;;;;;AAQG;AACG,MAAO,UAAW,SAAQ,oBAAsC,CAAA;IACpD,WAAW,GAAG,KAAK;AAEnC;;AAEG;IACI,MAAM,OAAO,CAAC,QAAkB,EAAA;AACrC,QAAA,OAAO,QAAQ,CAAC,IAAI,EAAE;IACxB;AAEA;;;;;;;;;AASG;AACI,IAAA,MAAM,MAAM,CAAC,MAAc,EAAE,UAA6B,EAAE,EAAA;AACjE,QAAA,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;QACjC,IAAI,SAAS,GAAG,MAAM;QAEtB,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE;YAC/C,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;YAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC;YAEjD,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,EAAE,EAAE;gBACtC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;AAC3C,gBAAA,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACtD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;AAE3C,gBAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK;AACzB,qBAAA,UAAU,CAAC,+BAA+B,EAAE,EAAE;AAC9C,qBAAA,UAAU,CAAC,gCAAgC,EAAE,EAAE,CAAC;AACnD,gBAAA,MAAM,SAAS,GAAG,CAAC,KAAK,KAAK,SAAS,GAAG,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA,CAAG,GAAG,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG,CAAA,SAAA,EAAY,MAAM,GAAG,GAAG,EAAE,CAAC;gBAExH,SAAS,GAAG,CAAA,EAAG,MAAM,CAAA,IAAA,EAAO,OAAO,GAAG,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;YAC5D;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;QAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAE5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE;YACzB,MAAM,QAAQ,GAAG,MAAW;AAC1B,gBAAA,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;AACjC,YAAA,CAAC;AAED,YAAA,KAAK,CAAC,gBAAgB,CACpB,MAAM,EACN,MAAK;AACH,gBAAA,QAAQ,EAAE;gBACV,OAAO,CAAC,KAAK,CAAC;AAChB,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAClD,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAClD,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AAED,YAAA,KAAK,CAAC,GAAG,GAAG,SAAS;AACvB,QAAA,CAAC,CAAC;IACJ;AACD;;;;"}
|
|
@@ -28,11 +28,11 @@ export declare class TextureFactory extends AbstractAssetFactory<Texture> {
|
|
|
28
28
|
*/
|
|
29
29
|
process(response: Response): Promise<ArrayBuffer>;
|
|
30
30
|
/**
|
|
31
|
-
* Decodes image bytes
|
|
32
|
-
* wraps it in a {@link Texture} with the given sampler options.
|
|
31
|
+
* Decodes image bytes and wraps the result in a {@link Texture}.
|
|
33
32
|
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
33
|
+
* Prefers `createImageBitmap` for a zero-copy GPU-upload path. Falls back
|
|
34
|
+
* to a temporary object URL + `<img>` element on environments that do not
|
|
35
|
+
* support `createImageBitmap`.
|
|
36
36
|
*/
|
|
37
37
|
create(source: ArrayBuffer, options?: TextureFactoryOptions): Promise<Texture>;
|
|
38
38
|
}
|
|
@@ -21,15 +21,19 @@ class TextureFactory extends AbstractAssetFactory {
|
|
|
21
21
|
return response.arrayBuffer();
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
|
-
* Decodes image bytes
|
|
25
|
-
* wraps it in a {@link Texture} with the given sampler options.
|
|
24
|
+
* Decodes image bytes and wraps the result in a {@link Texture}.
|
|
26
25
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
26
|
+
* Prefers `createImageBitmap` for a zero-copy GPU-upload path. Falls back
|
|
27
|
+
* to a temporary object URL + `<img>` element on environments that do not
|
|
28
|
+
* support `createImageBitmap`.
|
|
29
29
|
*/
|
|
30
30
|
async create(source, options = {}) {
|
|
31
31
|
const { mimeType, samplerOptions } = options;
|
|
32
32
|
const blob = new Blob([source], { type: mimeType ?? determineMimeType(source) });
|
|
33
|
+
if (typeof createImageBitmap === 'function') {
|
|
34
|
+
const bitmap = await createImageBitmap(blob);
|
|
35
|
+
return new Texture(bitmap, samplerOptions);
|
|
36
|
+
}
|
|
33
37
|
const objectUrl = this.createObjectUrl(blob);
|
|
34
38
|
return new Promise((resolve, reject) => {
|
|
35
39
|
const image = new Image();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextureFactory.js","sources":["../../../../../src/resources/factories/TextureFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAgBA;;;;;;;;AAQG;AACG,MAAO,cAAe,SAAQ,oBAA6B,CAAA;IAC/C,WAAW,GAAG,SAAS;AAEvC;;;AAGG;IACI,MAAM,OAAO,CAAC,QAAkB,EAAA;AACrC,QAAA,OAAO,QAAQ,CAAC,WAAW,EAAE;IAC/B;AAEA;;;;;;AAMG;AACI,IAAA,MAAM,MAAM,CAAC,MAAmB,EAAE,UAAiC,EAAE,EAAA;AAC1E,QAAA,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,OAAO;QAC5C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"TextureFactory.js","sources":["../../../../../src/resources/factories/TextureFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAgBA;;;;;;;;AAQG;AACG,MAAO,cAAe,SAAQ,oBAA6B,CAAA;IAC/C,WAAW,GAAG,SAAS;AAEvC;;;AAGG;IACI,MAAM,OAAO,CAAC,QAAkB,EAAA;AACrC,QAAA,OAAO,QAAQ,CAAC,WAAW,EAAE;IAC/B;AAEA;;;;;;AAMG;AACI,IAAA,MAAM,MAAM,CAAC,MAAmB,EAAE,UAAiC,EAAE,EAAA;AAC1E,QAAA,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,OAAO;QAC5C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;AAEhF,QAAA,IAAI,OAAO,iBAAiB,KAAK,UAAU,EAAE;AAC3C,YAAA,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC;AAC5C,YAAA,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC;QAC5C;QAEA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAE5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE;YACzB,MAAM,QAAQ,GAAG,MAAW;AAC1B,gBAAA,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;AACjC,YAAA,CAAC;AAED,YAAA,KAAK,CAAC,gBAAgB,CACpB,MAAM,EACN,MAAK;AACH,gBAAA,QAAQ,EAAE;gBACV,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;AAC7C,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAClD,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAClD,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AAED,YAAA,KAAK,CAAC,GAAG,GAAG,SAAS;AACvB,QAAA,CAAC,CAAC;IACJ;AACD;;;;"}
|
|
@@ -2,7 +2,8 @@ import type { PlaybackOptions, StreamingLoadEvent } from '@/core/types';
|
|
|
2
2
|
import type { SamplerOptions } from '@/rendering/texture/Sampler';
|
|
3
3
|
import { Video } from '@/rendering/video/Video';
|
|
4
4
|
import { AbstractAssetFactory } from '@/resources/AbstractAssetFactory';
|
|
5
|
-
|
|
5
|
+
/** Construction options for {@link VideoFactory.create}. */
|
|
6
|
+
export interface VideoFactoryOptions {
|
|
6
7
|
/**
|
|
7
8
|
* MIME type for the video blob. Inferred from magic bytes when omitted.
|
|
8
9
|
*/
|
|
@@ -17,6 +18,12 @@ interface VideoFactoryOptions {
|
|
|
17
18
|
playbackOptions?: Partial<PlaybackOptions>;
|
|
18
19
|
/** Sampler parameters forwarded to the {@link Video} instance's texture. */
|
|
19
20
|
samplerOptions?: Partial<SamplerOptions>;
|
|
21
|
+
/**
|
|
22
|
+
* Milliseconds to wait after a `stalled` event before rejecting the load
|
|
23
|
+
* promise. When omitted no timeout is applied and a stalled load will wait
|
|
24
|
+
* indefinitely. Each subsequent `stalled` event resets the timer.
|
|
25
|
+
*/
|
|
26
|
+
stallTimeout?: number;
|
|
20
27
|
}
|
|
21
28
|
/**
|
|
22
29
|
* {@link AssetFactory} implementation that loads video files (MP4, WebM, OGG,
|
|
@@ -52,4 +59,3 @@ export declare class VideoFactory extends AbstractAssetFactory<Video> {
|
|
|
52
59
|
*/
|
|
53
60
|
destroy(): void;
|
|
54
61
|
}
|
|
55
|
-
export {};
|
|
@@ -32,33 +32,40 @@ class VideoFactory extends AbstractAssetFactory {
|
|
|
32
32
|
* load event is received.
|
|
33
33
|
*/
|
|
34
34
|
async create(source, options = {}) {
|
|
35
|
-
const { mimeType, loadEvent, playbackOptions, samplerOptions } = options;
|
|
35
|
+
const { mimeType, loadEvent, playbackOptions, samplerOptions, stallTimeout } = options;
|
|
36
36
|
const blob = new Blob([source], { type: mimeType ?? determineMimeType(source) });
|
|
37
37
|
const objectUrl = this.createObjectUrl(blob);
|
|
38
38
|
return new Promise((resolve, reject) => {
|
|
39
39
|
const video = document.createElement('video');
|
|
40
40
|
this._videoElements.push(video);
|
|
41
|
-
|
|
41
|
+
let stallTimer;
|
|
42
|
+
let settled = false;
|
|
43
|
+
const settle = (fn) => {
|
|
44
|
+
if (settled)
|
|
45
|
+
return;
|
|
46
|
+
settled = true;
|
|
47
|
+
if (stallTimer !== undefined) {
|
|
48
|
+
clearTimeout(stallTimer);
|
|
49
|
+
stallTimer = undefined;
|
|
50
|
+
}
|
|
42
51
|
this.revokeObjectUrl(objectUrl);
|
|
52
|
+
fn();
|
|
43
53
|
};
|
|
44
|
-
video.addEventListener('error', () =>
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
finalize();
|
|
60
|
-
resolve(new Video(video, playbackOptions, samplerOptions));
|
|
61
|
-
}, onceListenerOption);
|
|
54
|
+
video.addEventListener('error', () => settle(() => reject(new Error('Video loading error.'))), onceListenerOption);
|
|
55
|
+
video.addEventListener('abort', () => settle(() => reject(new Error('Video loading error: cancelled.'))), onceListenerOption);
|
|
56
|
+
video.addEventListener('emptied', () => settle(() => reject(new Error('Video loading error: emptied.'))), onceListenerOption);
|
|
57
|
+
video.addEventListener(loadEvent ?? 'canplaythrough', () => settle(() => resolve(new Video(video, playbackOptions, samplerOptions))), onceListenerOption);
|
|
58
|
+
// 'stalled' fires transiently during normal buffering on slow connections and is not
|
|
59
|
+
// treated as an error by default. Supply stallTimeout to reject after a stall persists.
|
|
60
|
+
if (stallTimeout !== undefined) {
|
|
61
|
+
video.addEventListener('stalled', () => {
|
|
62
|
+
if (settled)
|
|
63
|
+
return;
|
|
64
|
+
if (stallTimer !== undefined)
|
|
65
|
+
clearTimeout(stallTimer);
|
|
66
|
+
stallTimer = setTimeout(() => settle(() => reject(new Error('Video loading stalled.'))), stallTimeout);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
62
69
|
video.preload = 'auto';
|
|
63
70
|
video.src = objectUrl;
|
|
64
71
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VideoFactory.js","sources":["../../../../../src/resources/factories/VideoFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAMA,MAAM,kBAAkB,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"VideoFactory.js","sources":["../../../../../src/resources/factories/VideoFactory.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { AbstractAssetFactory } from '@/resources/AbstractAssetFactory';
|
|
2
|
+
/**
|
|
3
|
+
* {@link AssetFactory} implementation that loads XML files and produces a
|
|
4
|
+
* parsed {@link Document} via the browser's built-in {@link DOMParser}.
|
|
5
|
+
*
|
|
6
|
+
* Throws if the response body is not well-formed XML. Use the returned
|
|
7
|
+
* `Document` directly with standard DOM APIs — `doc.querySelector`,
|
|
8
|
+
* `doc.getElementsByTagName`, etc. — or pass it to a format-specific parser
|
|
9
|
+
* (e.g. for Tiled TMX, BMFont, or TexturePacker XML atlas files).
|
|
10
|
+
*/
|
|
11
|
+
export declare class XmlFactory extends AbstractAssetFactory<Document> {
|
|
12
|
+
readonly storageName = "xml";
|
|
13
|
+
/**
|
|
14
|
+
* Reads the response body as a UTF-8 string containing the raw XML markup.
|
|
15
|
+
*/
|
|
16
|
+
process(response: Response): Promise<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Parses the XML string into a {@link Document}.
|
|
19
|
+
*
|
|
20
|
+
* Throws if the browser's DOMParser reports a parse error (indicated by a
|
|
21
|
+
* `<parsererror>` element in the returned document).
|
|
22
|
+
*/
|
|
23
|
+
create(source: string): Promise<Document>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { AbstractAssetFactory } from '../AbstractAssetFactory.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* {@link AssetFactory} implementation that loads XML files and produces a
|
|
5
|
+
* parsed {@link Document} via the browser's built-in {@link DOMParser}.
|
|
6
|
+
*
|
|
7
|
+
* Throws if the response body is not well-formed XML. Use the returned
|
|
8
|
+
* `Document` directly with standard DOM APIs — `doc.querySelector`,
|
|
9
|
+
* `doc.getElementsByTagName`, etc. — or pass it to a format-specific parser
|
|
10
|
+
* (e.g. for Tiled TMX, BMFont, or TexturePacker XML atlas files).
|
|
11
|
+
*/
|
|
12
|
+
class XmlFactory extends AbstractAssetFactory {
|
|
13
|
+
storageName = 'xml';
|
|
14
|
+
/**
|
|
15
|
+
* Reads the response body as a UTF-8 string containing the raw XML markup.
|
|
16
|
+
*/
|
|
17
|
+
async process(response) {
|
|
18
|
+
return response.text();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Parses the XML string into a {@link Document}.
|
|
22
|
+
*
|
|
23
|
+
* Throws if the browser's DOMParser reports a parse error (indicated by a
|
|
24
|
+
* `<parsererror>` element in the returned document).
|
|
25
|
+
*/
|
|
26
|
+
async create(source) {
|
|
27
|
+
const doc = new DOMParser().parseFromString(source, 'text/xml');
|
|
28
|
+
const parseError = doc.querySelector('parsererror');
|
|
29
|
+
if (parseError) {
|
|
30
|
+
throw new Error(`XML parse error: ${parseError.textContent.trim() || 'unknown error'}`);
|
|
31
|
+
}
|
|
32
|
+
return doc;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { XmlFactory };
|
|
37
|
+
//# sourceMappingURL=XmlFactory.js.map
|