@codexo/exojs 0.8.3 → 0.9.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 +107 -0
- package/README.md +26 -5
- 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 +62 -24
- package/dist/esm/core/Application.js +116 -40
- 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/Scene.d.ts +32 -72
- package/dist/esm/core/Scene.js +56 -36
- 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 -14
- package/dist/esm/core/SceneNode.js +66 -33
- 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/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 +23 -7
- 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.js +1 -1
- package/dist/esm/particles/ParticleSystem.js.map +1 -1
- package/dist/esm/particles/index.d.ts +1 -0
- 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/Container.d.ts +2 -1
- package/dist/esm/rendering/Container.js +17 -16
- package/dist/esm/rendering/Container.js.map +1 -1
- package/dist/esm/rendering/RenderBackend.d.ts +1 -0
- package/dist/esm/rendering/RenderNode.d.ts +1 -3
- package/dist/esm/rendering/RenderNode.js +12 -19
- 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/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/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/index.d.ts +89 -59
- package/dist/esm/rendering/mesh/Mesh.js +1 -1
- package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
- package/dist/esm/rendering/mesh/MeshShader.d.ts +1 -0
- package/dist/esm/rendering/mesh/MeshShader.js +1 -0
- package/dist/esm/rendering/mesh/MeshShader.js.map +1 -1
- 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 +3 -2
- package/dist/esm/rendering/sprite/Sprite.js +15 -13
- package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
- 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/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 +2 -1
- package/dist/esm/rendering/video/Video.js +9 -5
- package/dist/esm/rendering/video/Video.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2Backend.js +41 -5
- package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +4 -4
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.d.ts +56 -0
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js +482 -0
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.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.js +16 -8
- 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/WebGpuMeshRenderer.d.ts +2 -2
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +23 -15
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +9 -1
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.d.ts +70 -0
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js +773 -0
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.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/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/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/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 +8 -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 +6635 -2550
- package/dist/exo.esm.js.map +1 -1
- package/package.json +19 -6
- 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/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/package.json
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codexo/exojs",
|
|
3
3
|
"description": "A TypeScript-first browser 2D runtime for games and interactive apps.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.9.0",
|
|
5
5
|
"type": "module",
|
|
6
|
+
"workspaces": [
|
|
7
|
+
"site"
|
|
8
|
+
],
|
|
6
9
|
"files": [
|
|
7
10
|
"dist/esm/",
|
|
8
11
|
"dist/exo.esm.js",
|
|
@@ -41,24 +44,33 @@
|
|
|
41
44
|
"./package.json": "./package.json"
|
|
42
45
|
},
|
|
43
46
|
"scripts": {
|
|
47
|
+
"bootstrap": "npm ci --ignore-scripts --no-audit --fund=false",
|
|
44
48
|
"clean": "rimraf dist",
|
|
45
|
-
"build": "npm run clean && tsx node_modules/rollup/dist/bin/rollup -c",
|
|
46
|
-
"build:
|
|
49
|
+
"build": "npm run clean && tsx node_modules/rollup/dist/bin/rollup -c --environment EXOJS_ENV:production",
|
|
50
|
+
"build:dev": "npm run clean && tsx node_modules/rollup/dist/bin/rollup -c --environment EXOJS_ENV:development",
|
|
51
|
+
"build:watch": "tsx node_modules/rollup/dist/bin/rollup -cw --environment EXOJS_ENV:development",
|
|
47
52
|
"verify:exports": "tsx ./scripts/verify-exports.ts",
|
|
48
|
-
"verify:package": "npm run build && npm run verify:exports && npm pack --dry-run --ignore-scripts",
|
|
53
|
+
"verify:package": "npm run build && npm run verify:exports && npm pack --dry-run --ignore-scripts --cache ./.npm-cache",
|
|
49
54
|
"sync:example-capabilities": "tsx ./scripts/sync-example-capabilities.ts",
|
|
50
55
|
"verify:release": "npm run typecheck && npm run lint:strict && npm run format:check && npm test && npm run verify:package",
|
|
51
|
-
"release": "
|
|
56
|
+
"release": "tsx ./scripts/release.ts",
|
|
57
|
+
"release:notes": "tsx ./scripts/generate-release-notes.ts",
|
|
52
58
|
"prepack": "npm run build",
|
|
53
59
|
"typecheck": "tsc --noEmit",
|
|
54
60
|
"lint": "eslint \"src/**/*.ts\" \"test/**/*.ts\" \"examples/**/*.js\"",
|
|
55
61
|
"lint:fix": "eslint --fix \"src/**/*.ts\" \"test/**/*.ts\" \"examples/**/*.js\"",
|
|
56
62
|
"lint:strict": "eslint --max-warnings=0 \"src/**/*.ts\"",
|
|
63
|
+
"lint:strict:fast": "eslint --cache --cache-location .cache/eslintcache --max-warnings=0 \"src/**/*.ts\"",
|
|
57
64
|
"lint:strict:fix": "eslint --fix --max-warnings=0 \"src/**/*.ts\"",
|
|
65
|
+
"lint:strict:fast:fix": "eslint --cache --cache-location .cache/eslintcache --fix --max-warnings=0 \"src/**/*.ts\"",
|
|
58
66
|
"format": "prettier --write .",
|
|
59
67
|
"format:check": "prettier --check .",
|
|
60
|
-
"test": "jest
|
|
68
|
+
"test": "jest",
|
|
69
|
+
"test:serial": "jest --runInBand",
|
|
61
70
|
"test:watch": "jest --watch",
|
|
71
|
+
"site:install": "npm run bootstrap",
|
|
72
|
+
"site:build": "npm run build --workspace=@codexo/exojs-examples",
|
|
73
|
+
"site:build:api": "npm run build:api --workspace=@codexo/exojs-examples",
|
|
62
74
|
"perf:bench:rendering": "tsx test/perf/rendering-benchmark.ts",
|
|
63
75
|
"perf:bench:audio": "tsx test/perf/audio-benchmark.ts",
|
|
64
76
|
"perf:bench:collision": "tsx test/perf/collision-benchmark.ts",
|
|
@@ -86,6 +98,7 @@
|
|
|
86
98
|
"@eslint/js": "^10.0.1",
|
|
87
99
|
"@rollup/plugin-commonjs": "^29.0.2",
|
|
88
100
|
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
101
|
+
"@rollup/plugin-replace": "^6.0.3",
|
|
89
102
|
"@rollup/plugin-typescript": "^12.3.0",
|
|
90
103
|
"@types/css-font-loading-module": "0.0.14",
|
|
91
104
|
"@types/jest": "^30.0.0",
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Lightweight module that holds the module-level InteractionManager pointer
|
|
3
|
-
* used by SceneNode / Container / RenderNode hooks.
|
|
4
|
-
*
|
|
5
|
-
* Kept in its own file to break the circular import chain:
|
|
6
|
-
* SceneNode ← InteractionManager ← Container ← RenderNode ← SceneNode
|
|
7
|
-
*
|
|
8
|
-
* By splitting the singleton out here, SceneNode/Container/RenderNode can
|
|
9
|
-
* import from this module while InteractionManager (which imports Container)
|
|
10
|
-
* remains free of a SceneNode ↔ InteractionManager cycle.
|
|
11
|
-
*
|
|
12
|
-
* @internal
|
|
13
|
-
*/
|
|
14
|
-
import type { RenderNode } from '@/rendering/RenderNode';
|
|
15
|
-
export interface InteractionManagerHooks {
|
|
16
|
-
_notifyNodeAdded(node: RenderNode): void;
|
|
17
|
-
_notifyNodeRemoved(node: RenderNode): void;
|
|
18
|
-
_notifyInteractiveChanged(node: RenderNode, becameInteractive: boolean): void;
|
|
19
|
-
_notifyBoundsInvalidated(node: RenderNode): void;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Returns the currently-registered InteractionManager, or null if none is
|
|
23
|
-
* active. Called by RenderNode / Container / SceneNode hooks.
|
|
24
|
-
*
|
|
25
|
-
* @internal
|
|
26
|
-
*/
|
|
27
|
-
export declare function _getCurrentInteractionManager(): InteractionManagerHooks | null;
|
|
28
|
-
/**
|
|
29
|
-
* Register the active InteractionManager. Called from the InteractionManager
|
|
30
|
-
* constructor. Last-constructed-wins (single-Application assumed).
|
|
31
|
-
*
|
|
32
|
-
* @internal
|
|
33
|
-
*/
|
|
34
|
-
export declare function _setCurrentInteractionManager(manager: InteractionManagerHooks | null): void;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Lightweight module that holds the module-level InteractionManager pointer
|
|
3
|
-
* used by SceneNode / Container / RenderNode hooks.
|
|
4
|
-
*
|
|
5
|
-
* Kept in its own file to break the circular import chain:
|
|
6
|
-
* SceneNode ← InteractionManager ← Container ← RenderNode ← SceneNode
|
|
7
|
-
*
|
|
8
|
-
* By splitting the singleton out here, SceneNode/Container/RenderNode can
|
|
9
|
-
* import from this module while InteractionManager (which imports Container)
|
|
10
|
-
* remains free of a SceneNode ↔ InteractionManager cycle.
|
|
11
|
-
*
|
|
12
|
-
* @internal
|
|
13
|
-
*/
|
|
14
|
-
let _currentManager = null;
|
|
15
|
-
/**
|
|
16
|
-
* Returns the currently-registered InteractionManager, or null if none is
|
|
17
|
-
* active. Called by RenderNode / Container / SceneNode hooks.
|
|
18
|
-
*
|
|
19
|
-
* @internal
|
|
20
|
-
*/
|
|
21
|
-
function _getCurrentInteractionManager() {
|
|
22
|
-
return _currentManager;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Register the active InteractionManager. Called from the InteractionManager
|
|
26
|
-
* constructor. Last-constructed-wins (single-Application assumed).
|
|
27
|
-
*
|
|
28
|
-
* @internal
|
|
29
|
-
*/
|
|
30
|
-
function _setCurrentInteractionManager(manager) {
|
|
31
|
-
_currentManager = manager;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export { _getCurrentInteractionManager, _setCurrentInteractionManager };
|
|
35
|
-
//# sourceMappingURL=interaction-hooks.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"interaction-hooks.js","sources":["../../../../src/input/interaction-hooks.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;;;;;;;AAYG;AAWH,IAAI,eAAe,GAAmC,IAAI;AAE1D;;;;;AAKG;SACa,6BAA6B,GAAA;AAC3C,IAAA,OAAO,eAAe;AACxB;AAEA;;;;;AAKG;AACG,SAAU,6BAA6B,CAAC,OAAuC,EAAA;IACnF,eAAe,GAAG,OAAO;AAC3B;;;;"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { Texture } from '@/rendering/texture/Texture';
|
|
2
|
-
import type { GlyphInfo } from './types';
|
|
3
|
-
/**
|
|
4
|
-
* A shared atlas that rasterizes glyphs on demand into an offscreen canvas
|
|
5
|
-
* and wraps it as a Texture for use by the Mesh-based Text renderer.
|
|
6
|
-
*
|
|
7
|
-
* Glyphs are always rasterized in white so that runtime tinting via
|
|
8
|
-
* `Mesh.tint` applies the fill color without requiring re-rasterization.
|
|
9
|
-
*
|
|
10
|
-
* Use `getDefaultGlyphAtlas()` from `atlas-singleton.ts` rather than
|
|
11
|
-
* constructing directly.
|
|
12
|
-
*/
|
|
13
|
-
export declare class DynamicGlyphAtlas {
|
|
14
|
-
readonly texture: Texture;
|
|
15
|
-
private readonly _canvas;
|
|
16
|
-
private readonly _ctx;
|
|
17
|
-
private readonly _packer;
|
|
18
|
-
private readonly _cache;
|
|
19
|
-
private readonly _width;
|
|
20
|
-
private readonly _height;
|
|
21
|
-
constructor(width?: number, height?: number);
|
|
22
|
-
/**
|
|
23
|
-
* Returns the cached GlyphInfo for the given character + font parameters,
|
|
24
|
-
* rasterizing it into the atlas if not already present.
|
|
25
|
-
*/
|
|
26
|
-
getGlyph(char: string, family: string, size: number, weight: string | number, style: 'normal' | 'italic'): GlyphInfo;
|
|
27
|
-
/**
|
|
28
|
-
* Clears all cached glyphs and resets the atlas packer.
|
|
29
|
-
* The underlying canvas pixels are also cleared.
|
|
30
|
-
*/
|
|
31
|
-
clear(): void;
|
|
32
|
-
private _rasterize;
|
|
33
|
-
}
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import { Texture } from '../texture/Texture.js';
|
|
2
|
-
|
|
3
|
-
const glyphPadding = 2;
|
|
4
|
-
class ShelfPacker {
|
|
5
|
-
_shelves = [];
|
|
6
|
-
_width;
|
|
7
|
-
_height;
|
|
8
|
-
constructor(width, height) {
|
|
9
|
-
this._width = width;
|
|
10
|
-
this._height = height;
|
|
11
|
-
}
|
|
12
|
-
insert(width, height) {
|
|
13
|
-
// Try existing shelves in order (ascending y)
|
|
14
|
-
for (const shelf of this._shelves) {
|
|
15
|
-
if (shelf.height >= height && shelf.cursorX + width <= this._width) {
|
|
16
|
-
const x = shelf.cursorX;
|
|
17
|
-
shelf.cursorX += width;
|
|
18
|
-
return { x, y: shelf.y };
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
// Create a new shelf at the bottom
|
|
22
|
-
const last = this._shelves[this._shelves.length - 1];
|
|
23
|
-
const bottomY = last === undefined ? 0 : last.y + last.height;
|
|
24
|
-
if (bottomY + height > this._height) {
|
|
25
|
-
throw new Error(`GlyphAtlas full — clear() and re-render, or instantiate with larger dims`);
|
|
26
|
-
}
|
|
27
|
-
this._shelves.push({ y: bottomY, height, cursorX: width });
|
|
28
|
-
return { x: 0, y: bottomY };
|
|
29
|
-
}
|
|
30
|
-
reset() {
|
|
31
|
-
this._shelves.length = 0;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* A shared atlas that rasterizes glyphs on demand into an offscreen canvas
|
|
36
|
-
* and wraps it as a Texture for use by the Mesh-based Text renderer.
|
|
37
|
-
*
|
|
38
|
-
* Glyphs are always rasterized in white so that runtime tinting via
|
|
39
|
-
* `Mesh.tint` applies the fill color without requiring re-rasterization.
|
|
40
|
-
*
|
|
41
|
-
* Use `getDefaultGlyphAtlas()` from `atlas-singleton.ts` rather than
|
|
42
|
-
* constructing directly.
|
|
43
|
-
*/
|
|
44
|
-
class DynamicGlyphAtlas {
|
|
45
|
-
texture;
|
|
46
|
-
_canvas;
|
|
47
|
-
_ctx;
|
|
48
|
-
_packer;
|
|
49
|
-
_cache = new Map();
|
|
50
|
-
_width;
|
|
51
|
-
_height;
|
|
52
|
-
constructor(width = 1024, height = 1024) {
|
|
53
|
-
this._width = width;
|
|
54
|
-
this._height = height;
|
|
55
|
-
// Use OffscreenCanvas when available, fall back to HTMLCanvasElement.
|
|
56
|
-
// In jsdom / Node the global may be absent; createCanvas falls through
|
|
57
|
-
// to document.createElement which jsdom provides.
|
|
58
|
-
const canvas = typeof OffscreenCanvas !== 'undefined' ? new OffscreenCanvas(width, height) : document.createElement('canvas');
|
|
59
|
-
if ('width' in canvas) {
|
|
60
|
-
canvas.width = width;
|
|
61
|
-
canvas.height = height;
|
|
62
|
-
}
|
|
63
|
-
this._canvas = canvas;
|
|
64
|
-
const ctx = canvas.getContext('2d');
|
|
65
|
-
if (ctx === null) {
|
|
66
|
-
throw new Error('DynamicGlyphAtlas: could not obtain a 2D context.');
|
|
67
|
-
}
|
|
68
|
-
this._ctx = ctx;
|
|
69
|
-
this._packer = new ShelfPacker(width, height);
|
|
70
|
-
this.texture = new Texture(canvas);
|
|
71
|
-
this.texture.setSize(width, height);
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Returns the cached GlyphInfo for the given character + font parameters,
|
|
75
|
-
* rasterizing it into the atlas if not already present.
|
|
76
|
-
*/
|
|
77
|
-
getGlyph(char, family, size, weight, style) {
|
|
78
|
-
const key = `${char}:${family}:${size}:${weight}:${style}`;
|
|
79
|
-
const cached = this._cache.get(key);
|
|
80
|
-
if (cached !== undefined) {
|
|
81
|
-
return cached;
|
|
82
|
-
}
|
|
83
|
-
const info = this._rasterize(char, family, size, weight, style, key);
|
|
84
|
-
this._cache.set(key, info);
|
|
85
|
-
// Bump texture version so GPU backends re-upload the canvas data.
|
|
86
|
-
this.texture.updateSource();
|
|
87
|
-
return info;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Clears all cached glyphs and resets the atlas packer.
|
|
91
|
-
* The underlying canvas pixels are also cleared.
|
|
92
|
-
*/
|
|
93
|
-
clear() {
|
|
94
|
-
this._cache.clear();
|
|
95
|
-
this._packer.reset();
|
|
96
|
-
this._ctx.clearRect(0, 0, this._width, this._height);
|
|
97
|
-
this.texture.updateSource();
|
|
98
|
-
}
|
|
99
|
-
// -----------------------------------------------------------------------
|
|
100
|
-
_rasterize(char, family, size, weight, fontStyle, _key) {
|
|
101
|
-
const ctx = this._ctx;
|
|
102
|
-
const padding = glyphPadding;
|
|
103
|
-
ctx.font = `${fontStyle} ${weight} ${size}px ${family}`;
|
|
104
|
-
ctx.textBaseline = 'alphabetic';
|
|
105
|
-
ctx.fillStyle = '#ffffff';
|
|
106
|
-
const metrics = ctx.measureText(char);
|
|
107
|
-
const ascent = Math.ceil(metrics.fontBoundingBoxAscent ?? metrics.actualBoundingBoxAscent ?? size * 0.8);
|
|
108
|
-
const descent = Math.ceil(metrics.fontBoundingBoxDescent ?? metrics.actualBoundingBoxDescent ?? size * 0.2);
|
|
109
|
-
const advance = metrics.width;
|
|
110
|
-
const glyphWidth = Math.max(1, Math.ceil((metrics.actualBoundingBoxLeft ?? 0) + (metrics.actualBoundingBoxRight ?? 0)) || Math.ceil(advance));
|
|
111
|
-
const glyphHeight = Math.max(1, ascent + descent);
|
|
112
|
-
const slotW = glyphWidth + padding * 2;
|
|
113
|
-
const slotH = glyphHeight + padding * 2;
|
|
114
|
-
const slot = this._packer.insert(slotW, slotH);
|
|
115
|
-
// Draw the glyph white into the atlas slot
|
|
116
|
-
ctx.fillText(char, slot.x + padding + (metrics.actualBoundingBoxLeft ?? 0), slot.y + padding + ascent);
|
|
117
|
-
const info = {
|
|
118
|
-
x: slot.x,
|
|
119
|
-
y: slot.y,
|
|
120
|
-
width: glyphWidth,
|
|
121
|
-
height: glyphHeight,
|
|
122
|
-
advance,
|
|
123
|
-
ascent,
|
|
124
|
-
uvLeft: slot.x / this._width,
|
|
125
|
-
uvTop: slot.y / this._height,
|
|
126
|
-
uvRight: (slot.x + slotW) / this._width,
|
|
127
|
-
uvBottom: (slot.y + slotH) / this._height,
|
|
128
|
-
};
|
|
129
|
-
return info;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
export { DynamicGlyphAtlas };
|
|
134
|
-
//# sourceMappingURL=DynamicGlyphAtlas.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicGlyphAtlas.js","sources":["../../../../../src/rendering/text/DynamicGlyphAtlas.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { DynamicGlyphAtlas } from './DynamicGlyphAtlas';
|
|
2
|
-
/**
|
|
3
|
-
* Returns the shared process-wide glyph atlas, creating it lazily on first
|
|
4
|
-
* call. All `Text` instances share this atlas so that identical glyph shapes
|
|
5
|
-
* (same char + family + size + weight + style) are rasterized only once.
|
|
6
|
-
*/
|
|
7
|
-
export declare function getDefaultGlyphAtlas(): DynamicGlyphAtlas;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { DynamicGlyphAtlas } from './DynamicGlyphAtlas.js';
|
|
2
|
-
|
|
3
|
-
let _defaultAtlas = null;
|
|
4
|
-
/**
|
|
5
|
-
* Returns the shared process-wide glyph atlas, creating it lazily on first
|
|
6
|
-
* call. All `Text` instances share this atlas so that identical glyph shapes
|
|
7
|
-
* (same char + family + size + weight + style) are rasterized only once.
|
|
8
|
-
*/
|
|
9
|
-
function getDefaultGlyphAtlas() {
|
|
10
|
-
if (_defaultAtlas === null) {
|
|
11
|
-
_defaultAtlas = new DynamicGlyphAtlas();
|
|
12
|
-
}
|
|
13
|
-
return _defaultAtlas;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export { getDefaultGlyphAtlas };
|
|
17
|
-
//# sourceMappingURL=atlas-singleton.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"atlas-singleton.js","sources":["../../../../../src/rendering/text/atlas-singleton.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAEA,IAAI,aAAa,GAA6B,IAAI;AAElD;;;;AAIG;SACa,oBAAoB,GAAA;AAClC,IAAA,IAAI,aAAa,KAAK,IAAI,EAAE;AAC1B,QAAA,aAAa,GAAG,IAAI,iBAAiB,EAAE;IACzC;AAEA,IAAA,OAAO,aAAa;AACtB;;;;"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { AbstractAssetFactory } from '@/resources/AbstractAssetFactory';
|
|
2
|
-
/**
|
|
3
|
-
* {@link AssetFactory} implementation that parses WebVTT (`.vtt`) subtitle and
|
|
4
|
-
* caption files and produces an array of {@link VTTCue} instances.
|
|
5
|
-
*
|
|
6
|
-
* The parser handles CRLF and CR line endings, skips the `WEBVTT` header and
|
|
7
|
-
* any metadata blocks, and applies optional cue settings (`align`, `line`,
|
|
8
|
-
* `position`, `size`, `vertical`) on the timestamp line directly to the
|
|
9
|
-
* resulting {@link VTTCue}.
|
|
10
|
-
*/
|
|
11
|
-
export declare class VttFactory extends AbstractAssetFactory<VTTCue[]> {
|
|
12
|
-
readonly storageName = "vtt";
|
|
13
|
-
/**
|
|
14
|
-
* Reads the response body as a UTF-8 string containing the raw VTT markup.
|
|
15
|
-
*/
|
|
16
|
-
process(response: Response): Promise<string>;
|
|
17
|
-
/**
|
|
18
|
-
* Parses VTT markup into an ordered array of {@link VTTCue} instances.
|
|
19
|
-
*
|
|
20
|
-
* Line endings are normalised before parsing. Cues are emitted in document
|
|
21
|
-
* order; overlapping or out-of-order timestamps are preserved as-is.
|
|
22
|
-
*/
|
|
23
|
-
create(source: string): Promise<VTTCue[]>;
|
|
24
|
-
}
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import { AbstractAssetFactory } from '../AbstractAssetFactory.js';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Converts a WebVTT timestamp string (`HH:MM:SS.mmm`, `MM:SS.mmm`, or
|
|
5
|
-
* `SS.mmm`) into a floating-point number of seconds.
|
|
6
|
-
*
|
|
7
|
-
* @internal
|
|
8
|
-
*/
|
|
9
|
-
const parseTimestamp = (value) => {
|
|
10
|
-
const parts = value.split(':');
|
|
11
|
-
let seconds;
|
|
12
|
-
if (parts.length === 3) {
|
|
13
|
-
seconds = Number(parts[0]) * 3600 + Number(parts[1]) * 60 + Number(parts[2]);
|
|
14
|
-
}
|
|
15
|
-
else if (parts.length === 2) {
|
|
16
|
-
seconds = Number(parts[0]) * 60 + Number(parts[1]);
|
|
17
|
-
}
|
|
18
|
-
else {
|
|
19
|
-
seconds = Number(parts[0]);
|
|
20
|
-
}
|
|
21
|
-
return seconds;
|
|
22
|
-
};
|
|
23
|
-
const validAlignValues = new Set(['start', 'center', 'end', 'left', 'right']);
|
|
24
|
-
const validLineAlignValues = new Set(['start', 'center', 'end']);
|
|
25
|
-
const validPositionAlignValues = new Set(['auto', 'line-left', 'center', 'line-right']);
|
|
26
|
-
/**
|
|
27
|
-
* Parses the WebVTT cue-settings tail (`align:center line:80% position:50%`)
|
|
28
|
-
* and applies each recognized setting to the supplied {@link VTTCue}.
|
|
29
|
-
*
|
|
30
|
-
* Unknown keys, malformed values, and unknown enum members are silently
|
|
31
|
-
* skipped so that one bad token does not invalidate an otherwise valid cue.
|
|
32
|
-
* Percent signs on numeric values are tolerated and stripped.
|
|
33
|
-
*
|
|
34
|
-
* @internal
|
|
35
|
-
*/
|
|
36
|
-
const applyCueSettings = (cue, settings) => {
|
|
37
|
-
if (!settings) {
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
for (const token of settings.split(/\s+/)) {
|
|
41
|
-
const colonIndex = token.indexOf(':');
|
|
42
|
-
if (colonIndex === -1) {
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
|
-
const name = token.slice(0, colonIndex);
|
|
46
|
-
const value = token.slice(colonIndex + 1);
|
|
47
|
-
switch (name) {
|
|
48
|
-
case 'vertical':
|
|
49
|
-
if (value === 'rl' || value === 'lr' || value === '') {
|
|
50
|
-
cue.vertical = value;
|
|
51
|
-
}
|
|
52
|
-
break;
|
|
53
|
-
case 'line': {
|
|
54
|
-
if (value === 'auto') {
|
|
55
|
-
cue.line = 'auto';
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
const [linePart, alignPart] = value.split(',');
|
|
59
|
-
const num = parseFloat(linePart);
|
|
60
|
-
if (!Number.isNaN(num)) {
|
|
61
|
-
cue.line = num;
|
|
62
|
-
}
|
|
63
|
-
if (alignPart !== undefined && validLineAlignValues.has(alignPart)) {
|
|
64
|
-
cue.lineAlign = alignPart;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
break;
|
|
68
|
-
}
|
|
69
|
-
case 'position': {
|
|
70
|
-
const [posPart, alignPart] = value.split(',');
|
|
71
|
-
const num = parseFloat(posPart);
|
|
72
|
-
if (!Number.isNaN(num)) {
|
|
73
|
-
cue.position = num;
|
|
74
|
-
}
|
|
75
|
-
if (alignPart !== undefined && validPositionAlignValues.has(alignPart)) {
|
|
76
|
-
cue.positionAlign = alignPart;
|
|
77
|
-
}
|
|
78
|
-
break;
|
|
79
|
-
}
|
|
80
|
-
case 'size': {
|
|
81
|
-
const num = parseFloat(value);
|
|
82
|
-
if (!Number.isNaN(num)) {
|
|
83
|
-
cue.size = num;
|
|
84
|
-
}
|
|
85
|
-
break;
|
|
86
|
-
}
|
|
87
|
-
case 'align':
|
|
88
|
-
if (validAlignValues.has(value)) {
|
|
89
|
-
cue.align = value;
|
|
90
|
-
}
|
|
91
|
-
break;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
};
|
|
95
|
-
/**
|
|
96
|
-
* {@link AssetFactory} implementation that parses WebVTT (`.vtt`) subtitle and
|
|
97
|
-
* caption files and produces an array of {@link VTTCue} instances.
|
|
98
|
-
*
|
|
99
|
-
* The parser handles CRLF and CR line endings, skips the `WEBVTT` header and
|
|
100
|
-
* any metadata blocks, and applies optional cue settings (`align`, `line`,
|
|
101
|
-
* `position`, `size`, `vertical`) on the timestamp line directly to the
|
|
102
|
-
* resulting {@link VTTCue}.
|
|
103
|
-
*/
|
|
104
|
-
class VttFactory extends AbstractAssetFactory {
|
|
105
|
-
storageName = 'vtt';
|
|
106
|
-
/**
|
|
107
|
-
* Reads the response body as a UTF-8 string containing the raw VTT markup.
|
|
108
|
-
*/
|
|
109
|
-
async process(response) {
|
|
110
|
-
return response.text();
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Parses VTT markup into an ordered array of {@link VTTCue} instances.
|
|
114
|
-
*
|
|
115
|
-
* Line endings are normalised before parsing. Cues are emitted in document
|
|
116
|
-
* order; overlapping or out-of-order timestamps are preserved as-is.
|
|
117
|
-
*/
|
|
118
|
-
async create(source) {
|
|
119
|
-
const cues = [];
|
|
120
|
-
const lines = source.replaceAll('\r\n', '\n').replaceAll('\r', '\n').split('\n');
|
|
121
|
-
let i = 0;
|
|
122
|
-
// Skip header and any blank lines/metadata before first cue
|
|
123
|
-
while (i < lines.length && !lines[i].includes('-->')) {
|
|
124
|
-
i++;
|
|
125
|
-
}
|
|
126
|
-
while (i < lines.length) {
|
|
127
|
-
const line = lines[i].trim();
|
|
128
|
-
if (line.includes('-->')) {
|
|
129
|
-
const arrowIndex = line.indexOf('-->');
|
|
130
|
-
const startString = line.slice(0, arrowIndex).trim();
|
|
131
|
-
const rest = line.slice(arrowIndex + 3).trim();
|
|
132
|
-
// rest contains the end timestamp followed by optional cue
|
|
133
|
-
// settings (align, line, position, size, vertical).
|
|
134
|
-
const restTokens = rest.split(/\s+/);
|
|
135
|
-
const endString = restTokens[0];
|
|
136
|
-
const settingsString = restTokens.slice(1).join(' ');
|
|
137
|
-
const start = parseTimestamp(startString);
|
|
138
|
-
const end = parseTimestamp(endString);
|
|
139
|
-
i++;
|
|
140
|
-
const textLines = [];
|
|
141
|
-
while (i < lines.length && lines[i].trim() !== '') {
|
|
142
|
-
textLines.push(lines[i]);
|
|
143
|
-
i++;
|
|
144
|
-
}
|
|
145
|
-
const cue = new VTTCue(start, end, textLines.join('\n'));
|
|
146
|
-
applyCueSettings(cue, settingsString);
|
|
147
|
-
cues.push(cue);
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
i++;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
return cues;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
export { VttFactory };
|
|
158
|
-
//# sourceMappingURL=VttFactory.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VttFactory.js","sources":["../../../../../src/resources/factories/VttFactory.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|