@codexo/exojs 0.8.4 → 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 +55 -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 +16 -4
- 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
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { AbstractText } from './AbstractText.js';
|
|
2
|
+
import { layoutText, buildTextPageQuads } from './TextLayout.js';
|
|
3
|
+
import { TextStyle } from './TextStyle.js';
|
|
4
|
+
|
|
5
|
+
// ── BmFontAdapter ─────────────────────────────────────────────────────────────
|
|
6
|
+
/**
|
|
7
|
+
* Adapts {@link BmFontData} to the {@link GlyphProvider} interface consumed
|
|
8
|
+
* by {@link layoutText}.
|
|
9
|
+
*
|
|
10
|
+
* - `getGlyph()` maps BMFont metrics to {@link GlyphInfo} using bearings that
|
|
11
|
+
* place each glyph correctly relative to its line's Y origin.
|
|
12
|
+
* - `getKerning()` looks up the BMFont kerning table.
|
|
13
|
+
*
|
|
14
|
+
* @internal
|
|
15
|
+
*/
|
|
16
|
+
class BmFontAdapter {
|
|
17
|
+
_fontData;
|
|
18
|
+
_textures;
|
|
19
|
+
_scale;
|
|
20
|
+
/** Fallback advance for characters not present in the font (≈ ½ line height). */
|
|
21
|
+
_fallbackAdvance;
|
|
22
|
+
constructor(fontData, textures, scale) {
|
|
23
|
+
this._fontData = fontData;
|
|
24
|
+
this._textures = textures;
|
|
25
|
+
this._scale = scale;
|
|
26
|
+
this._fallbackAdvance = fontData.lineHeight * scale * 0.5;
|
|
27
|
+
}
|
|
28
|
+
getGlyph(char, _fontSize) {
|
|
29
|
+
const cp = char.codePointAt(0) ?? 0;
|
|
30
|
+
const g = this._fontData.chars.get(cp);
|
|
31
|
+
const s = this._scale;
|
|
32
|
+
const lh = this._fontData.lineHeight;
|
|
33
|
+
const base = this._fontData.base;
|
|
34
|
+
if (g === undefined) {
|
|
35
|
+
// Unknown glyph — return an invisible placeholder with a cursor advance.
|
|
36
|
+
return {
|
|
37
|
+
x: 0,
|
|
38
|
+
y: 0,
|
|
39
|
+
width: 0,
|
|
40
|
+
height: 0,
|
|
41
|
+
advance: this._fallbackAdvance,
|
|
42
|
+
ascent: 0,
|
|
43
|
+
page: 0,
|
|
44
|
+
uvLeft: 0,
|
|
45
|
+
uvTop: 0,
|
|
46
|
+
uvRight: 0,
|
|
47
|
+
uvBottom: 0,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const texW = this._textures[g.page]?.width ?? 1;
|
|
51
|
+
const texH = this._textures[g.page]?.height ?? 1;
|
|
52
|
+
return {
|
|
53
|
+
x: g.x,
|
|
54
|
+
y: g.y,
|
|
55
|
+
width: g.width * s,
|
|
56
|
+
height: g.height * s,
|
|
57
|
+
advance: g.xAdvance * s,
|
|
58
|
+
ascent: 0,
|
|
59
|
+
page: g.page,
|
|
60
|
+
uvLeft: g.x / texW,
|
|
61
|
+
uvTop: g.y / texH,
|
|
62
|
+
uvRight: (g.x + g.width) / texW,
|
|
63
|
+
uvBottom: (g.y + g.height) / texH,
|
|
64
|
+
// xBearing shifts the quad right by the glyph's left bearing so the
|
|
65
|
+
// visual left edge aligns with the cursor.
|
|
66
|
+
xBearing: g.xOffset * s,
|
|
67
|
+
// yBearing places the glyph so its top is at lineY + lineHeight + yOffset - base.
|
|
68
|
+
// This matches the BMFont convention: yOffset is relative to the line top,
|
|
69
|
+
// and adding lineHeight gives one full line of descent before the glyph top.
|
|
70
|
+
yBearing: (g.yOffset - base) * s + lh * s,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
getKerning(prev, next, _fontSize) {
|
|
74
|
+
const a = prev.codePointAt(0);
|
|
75
|
+
const b = next.codePointAt(0);
|
|
76
|
+
if (a === undefined || b === undefined)
|
|
77
|
+
return 0;
|
|
78
|
+
return (this._fontData.kernings.get(`${a},${b}`) ?? 0) * this._scale;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// ── BitmapText ────────────────────────────────────────────────────────────────
|
|
82
|
+
/**
|
|
83
|
+
* Text node that renders from an offline-generated atlas — either a BMFont
|
|
84
|
+
* (AngelCode .fnt + .png) or an MSDF atlas (msdf-atlas-gen + .json).
|
|
85
|
+
*
|
|
86
|
+
* The atlas is pre-built so there is no runtime Canvas 2D rasterisation.
|
|
87
|
+
* All layout features (alignment, word-wrap, justify, leading, breakWords,
|
|
88
|
+
* whiteSpace, letterSpacing) and kerning pairs from the descriptor are fully
|
|
89
|
+
* supported. Outline effects are handled as shader uniforms — no extra draw
|
|
90
|
+
* calls, no atlas rebuilds.
|
|
91
|
+
*
|
|
92
|
+
* ## Usage
|
|
93
|
+
*
|
|
94
|
+
* ```ts
|
|
95
|
+
* const font = await loader.load('fonts/ui.fnt'); // BmFont, no setup needed
|
|
96
|
+
* const label = new BitmapText('Score: 0', font, { msdf: true });
|
|
97
|
+
* scene.addChild(label);
|
|
98
|
+
*
|
|
99
|
+
* label.text = 'Score: 42'; // instant geometry rebuild
|
|
100
|
+
* label.style.align = 'center'; // immediate rebuild
|
|
101
|
+
* ```
|
|
102
|
+
* @stable
|
|
103
|
+
*/
|
|
104
|
+
class BitmapText extends AbstractText {
|
|
105
|
+
_font;
|
|
106
|
+
_fontScale;
|
|
107
|
+
_msdf;
|
|
108
|
+
_style;
|
|
109
|
+
_layout;
|
|
110
|
+
/** Per-page quad geometry consumed by the text renderer. */
|
|
111
|
+
_pageQuads = [];
|
|
112
|
+
_textBounds = { width: 0, height: 0 };
|
|
113
|
+
_adapter;
|
|
114
|
+
constructor(text, font, options = {}) {
|
|
115
|
+
super(text);
|
|
116
|
+
this._font = font;
|
|
117
|
+
this._fontScale = options.scale ?? 1;
|
|
118
|
+
this._msdf = options.msdf ?? false;
|
|
119
|
+
this._style = new TextStyle(options);
|
|
120
|
+
this._layout = options.layout ?? {};
|
|
121
|
+
this._adapter = new BmFontAdapter(font.fontData, font.textures, this._fontScale);
|
|
122
|
+
this._rebuild();
|
|
123
|
+
}
|
|
124
|
+
// ── Text ──────────────────────────────────────────────────────────────────
|
|
125
|
+
get text() {
|
|
126
|
+
return this._text;
|
|
127
|
+
}
|
|
128
|
+
set text(v) {
|
|
129
|
+
if (this._text === v)
|
|
130
|
+
return;
|
|
131
|
+
this._text = v;
|
|
132
|
+
this._rebuild();
|
|
133
|
+
}
|
|
134
|
+
// ── Style & layout ────────────────────────────────────────────────────────
|
|
135
|
+
/** Visual style — `align`, `leading`, `fillColor`, `outlineColor` etc. */
|
|
136
|
+
get style() {
|
|
137
|
+
return this._style;
|
|
138
|
+
}
|
|
139
|
+
set style(v) {
|
|
140
|
+
this._style = v instanceof TextStyle ? v : new TextStyle(v);
|
|
141
|
+
this._rebuild();
|
|
142
|
+
}
|
|
143
|
+
/** Flow-control options — `maxWidth`, `letterSpacing`, `whiteSpace` etc. */
|
|
144
|
+
get layout() {
|
|
145
|
+
return this._layout;
|
|
146
|
+
}
|
|
147
|
+
set layout(v) {
|
|
148
|
+
this._layout = v;
|
|
149
|
+
this._rebuild();
|
|
150
|
+
}
|
|
151
|
+
/** Scale factor applied to all glyph metrics from the font descriptor. */
|
|
152
|
+
get fontScale() {
|
|
153
|
+
return this._fontScale;
|
|
154
|
+
}
|
|
155
|
+
set fontScale(v) {
|
|
156
|
+
if (this._fontScale === v)
|
|
157
|
+
return;
|
|
158
|
+
this._fontScale = v;
|
|
159
|
+
this._adapter = new BmFontAdapter(this._font.fontData, this._font.textures, v);
|
|
160
|
+
this._rebuild();
|
|
161
|
+
}
|
|
162
|
+
// ── Read-only state ───────────────────────────────────────────────────────
|
|
163
|
+
/** `true` when the atlas was produced by `msdf-atlas-gen`. */
|
|
164
|
+
get msdf() {
|
|
165
|
+
return this._msdf;
|
|
166
|
+
}
|
|
167
|
+
/** Per-page quad data consumed by the text renderer. */
|
|
168
|
+
get pageQuads() {
|
|
169
|
+
return this._pageQuads;
|
|
170
|
+
}
|
|
171
|
+
get textBounds() {
|
|
172
|
+
return this._textBounds;
|
|
173
|
+
}
|
|
174
|
+
/** The page textures this node draws from. */
|
|
175
|
+
get textures() {
|
|
176
|
+
return this._font.textures;
|
|
177
|
+
}
|
|
178
|
+
// ── Font replacement ──────────────────────────────────────────────────────
|
|
179
|
+
/** Replace the font and rebuild the geometry. */
|
|
180
|
+
setFont(font) {
|
|
181
|
+
this._font = font;
|
|
182
|
+
this._adapter = new BmFontAdapter(font.fontData, font.textures, this._fontScale);
|
|
183
|
+
this._rebuild();
|
|
184
|
+
}
|
|
185
|
+
destroy() {
|
|
186
|
+
this._pageQuads = [];
|
|
187
|
+
super.destroy();
|
|
188
|
+
}
|
|
189
|
+
// ── Private ──────────────────────────────────────────────────────────────
|
|
190
|
+
_rebuild() {
|
|
191
|
+
this._pageQuads = [];
|
|
192
|
+
this._textBounds = { width: 0, height: 0 };
|
|
193
|
+
if (this._text.length === 0)
|
|
194
|
+
return;
|
|
195
|
+
// Derive a TextLayoutStyle from the BMFont descriptor + scale.
|
|
196
|
+
// Setting fontSize = fontData.lineHeight * scale makes computedLineHeight
|
|
197
|
+
// equal to the BMFont's native line height multiplied by style.lineHeight.
|
|
198
|
+
const layoutStyle = {
|
|
199
|
+
fontSize: this._font.fontData.lineHeight * this._fontScale,
|
|
200
|
+
lineHeight: this._style.lineHeight,
|
|
201
|
+
leading: this._style.leading,
|
|
202
|
+
align: this._style.align,
|
|
203
|
+
};
|
|
204
|
+
const placements = layoutText(this._text, layoutStyle, this._layout, this._adapter);
|
|
205
|
+
let maxX = 0, maxY = 0;
|
|
206
|
+
for (const p of placements) {
|
|
207
|
+
const px = p.x + p.width;
|
|
208
|
+
const py = p.y + p.height;
|
|
209
|
+
if (px > maxX)
|
|
210
|
+
maxX = px;
|
|
211
|
+
if (py > maxY)
|
|
212
|
+
maxY = py;
|
|
213
|
+
}
|
|
214
|
+
this._textBounds = { width: maxX, height: maxY };
|
|
215
|
+
this._pageQuads = buildTextPageQuads(placements);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export { BitmapText, BmFontAdapter };
|
|
220
|
+
//# sourceMappingURL=BitmapText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BitmapText.js","sources":["../../../../../src/rendering/text/BitmapText.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Texture } from '@/rendering/texture/Texture';
|
|
2
|
+
/** Per-character metrics from a BMFont descriptor. */
|
|
3
|
+
export interface BmFontChar {
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
/** Horizontal draw offset from the cursor to the glyph's left edge. */
|
|
9
|
+
xOffset: number;
|
|
10
|
+
/** Vertical draw offset from the line top to the glyph's top edge. */
|
|
11
|
+
yOffset: number;
|
|
12
|
+
/** Cursor advance after this character. */
|
|
13
|
+
xAdvance: number;
|
|
14
|
+
/** Atlas page this character lives on. */
|
|
15
|
+
page: number;
|
|
16
|
+
}
|
|
17
|
+
/** Parsed representation of a BMFont (.fnt) descriptor. */
|
|
18
|
+
export interface BmFontData {
|
|
19
|
+
/** Texture file names for each atlas page (relative paths). */
|
|
20
|
+
pages: string[];
|
|
21
|
+
/** Code-point → glyph metrics. */
|
|
22
|
+
chars: Map<number, BmFontChar>;
|
|
23
|
+
/**
|
|
24
|
+
* Kerning pairs — key `"${first},${second}"`, value = pixel adjustment.
|
|
25
|
+
* Negative values pull glyphs together; positive push them apart.
|
|
26
|
+
*/
|
|
27
|
+
kernings: Map<string, number>;
|
|
28
|
+
/** Full line height in font units. */
|
|
29
|
+
lineHeight: number;
|
|
30
|
+
/** Baseline position from the top of the line in font units. */
|
|
31
|
+
base: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A loaded BMFont asset: the parsed descriptor plus all page textures.
|
|
35
|
+
*
|
|
36
|
+
* Loaded by the built-in BMFont factory — no extra setup required.
|
|
37
|
+
* Pass directly to {@link BitmapText}.
|
|
38
|
+
*
|
|
39
|
+
* ```ts
|
|
40
|
+
* const font = await loader.load('fonts/ui.fnt'); // BmFont via extension
|
|
41
|
+
* const font = await loader.load(BmFont, 'fonts/ui.fnt'); // explicit token
|
|
42
|
+
* const label = new BitmapText('Score: 0', font);
|
|
43
|
+
* ```
|
|
44
|
+
* @stable
|
|
45
|
+
*/
|
|
46
|
+
export declare class BmFont {
|
|
47
|
+
readonly fontData: BmFontData;
|
|
48
|
+
readonly textures: readonly Texture[];
|
|
49
|
+
constructor(fontData: BmFontData, textures: readonly Texture[]);
|
|
50
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A loaded BMFont asset: the parsed descriptor plus all page textures.
|
|
3
|
+
*
|
|
4
|
+
* Loaded by the built-in BMFont factory — no extra setup required.
|
|
5
|
+
* Pass directly to {@link BitmapText}.
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* const font = await loader.load('fonts/ui.fnt'); // BmFont via extension
|
|
9
|
+
* const font = await loader.load(BmFont, 'fonts/ui.fnt'); // explicit token
|
|
10
|
+
* const label = new BitmapText('Score: 0', font);
|
|
11
|
+
* ```
|
|
12
|
+
* @stable
|
|
13
|
+
*/
|
|
14
|
+
class BmFont {
|
|
15
|
+
fontData;
|
|
16
|
+
textures;
|
|
17
|
+
constructor(fontData, textures) {
|
|
18
|
+
this.fontData = fontData;
|
|
19
|
+
this.textures = textures;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { BmFont };
|
|
24
|
+
//# sourceMappingURL=BmFont.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BmFont.js","sources":["../../../../../src/rendering/text/BmFont.ts"],"sourcesContent":[null],"names":[],"mappings":"AAmCA;;;;;;;;;;;;AAYG;MACU,MAAM,CAAA;AACD,IAAA,QAAQ;AACR,IAAA,QAAQ;IAExB,WAAA,CAAmB,QAAoB,EAAE,QAA4B,EAAA;AACnE,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;IAC1B;AACD;;;;"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { Signal } from '@/core/Signal';
|
|
2
|
+
import { Texture } from '@/rendering/texture/Texture';
|
|
3
|
+
import type { GlyphInfo, GlyphProvider } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* Atlas rendering mode. Determines texture format and rasterization strategy.
|
|
6
|
+
* `'sdf'` uses a single-channel R8 DataTexture with EDT-based rasterization.
|
|
7
|
+
* `'color'` uses an RGBA canvas for emoji / colour-font glyphs.
|
|
8
|
+
* MSDF is supported for {@link BitmapText} via offline-generated atlases only.
|
|
9
|
+
*/
|
|
10
|
+
export type AtlasMode = 'sdf' | 'color';
|
|
11
|
+
/**
|
|
12
|
+
* SDF buffer radius in pixels — the maximum distance outside a glyph that the
|
|
13
|
+
* SDF field encodes. Determines the maximum usable outline/shadow reach.
|
|
14
|
+
* Exported so applications can import this constant when computing shader uniforms.
|
|
15
|
+
*/
|
|
16
|
+
export declare const SDF_RADIUS = 8;
|
|
17
|
+
/**
|
|
18
|
+
* A single texture page within a {@link GlyphAtlas}. Glyphs are packed into
|
|
19
|
+
* the page using a shelf-bin algorithm.
|
|
20
|
+
*
|
|
21
|
+
* In `'sdf'` mode the page owns a `DataTexture` (`r8`) populated by tiny-sdf
|
|
22
|
+
* output. In `'color'` mode a Canvas 2D context preserves full glyph colours
|
|
23
|
+
* for emoji.
|
|
24
|
+
* @advanced
|
|
25
|
+
*/
|
|
26
|
+
export declare class AtlasPage {
|
|
27
|
+
readonly texture: Texture;
|
|
28
|
+
readonly index: number;
|
|
29
|
+
readonly mode: AtlasMode;
|
|
30
|
+
private readonly _packer;
|
|
31
|
+
private readonly _width;
|
|
32
|
+
private readonly _height;
|
|
33
|
+
private readonly _sdfBuffer;
|
|
34
|
+
private readonly _sdfTexture;
|
|
35
|
+
private readonly _ctx;
|
|
36
|
+
private readonly _colorGlyphs;
|
|
37
|
+
constructor(index: number, width: number, height: number, mode: AtlasMode);
|
|
38
|
+
insert(w: number, h: number): {
|
|
39
|
+
x: number;
|
|
40
|
+
y: number;
|
|
41
|
+
} | null;
|
|
42
|
+
/**
|
|
43
|
+
* Copy R8 SDF data into the page buffer at the given slot origin.
|
|
44
|
+
* Only valid in `'sdf'` mode.
|
|
45
|
+
*
|
|
46
|
+
* `data` is a `Uint8ClampedArray` of single-channel SDF values as produced
|
|
47
|
+
* by {@link GlyphSdf.draw}. Each value is one byte (0 = far outside the
|
|
48
|
+
* glyph, 255 = deep inside, ~128 = glyph edge).
|
|
49
|
+
*/
|
|
50
|
+
writeSdf(data: Uint8ClampedArray, slotX: number, slotY: number, srcW: number, srcH: number): void;
|
|
51
|
+
measureGlyph(char: string, font: string): TextMetrics;
|
|
52
|
+
/** Rasterize a white glyph into the canvas at the given padded slot origin (canvas mode only). */
|
|
53
|
+
rasterize(char: string, slotX: number, slotY: number, ascent: number, bbLeft: number, font: string): void;
|
|
54
|
+
uploadDirtyRegion(): void;
|
|
55
|
+
reset(): void;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* A per-font-variant glyph atlas with automatic multi-page growth.
|
|
59
|
+
*
|
|
60
|
+
* In `'sdf'` mode (default) each atlas page is a single-channel R8
|
|
61
|
+
* `DataTexture` populated by {@link GlyphSdf}. One `GlyphSdf` instance is kept per
|
|
62
|
+
* font size so the atlas can mix sizes efficiently.
|
|
63
|
+
*
|
|
64
|
+
* In `'color'` mode pages are RGBA canvas textures that preserve full glyph
|
|
65
|
+
* colour data for emoji and colour fonts.
|
|
66
|
+
* @advanced
|
|
67
|
+
*/
|
|
68
|
+
export declare class GlyphAtlas implements GlyphProvider {
|
|
69
|
+
private _pages;
|
|
70
|
+
private readonly _cache;
|
|
71
|
+
private readonly _kerningCache;
|
|
72
|
+
private readonly _pageSize;
|
|
73
|
+
private readonly _family;
|
|
74
|
+
private readonly _fontStyle;
|
|
75
|
+
private readonly _fontWeight;
|
|
76
|
+
private readonly _mode;
|
|
77
|
+
private readonly _sdfRadius;
|
|
78
|
+
/**
|
|
79
|
+
* Dispatched whenever a new atlas page is allocated.
|
|
80
|
+
*
|
|
81
|
+
* Listen here to detect unexpected atlas growth (e.g. many unique CJK glyphs
|
|
82
|
+
* or an oversized font size). The payload is the zero-based page index.
|
|
83
|
+
*
|
|
84
|
+
* ```ts
|
|
85
|
+
* const atlas = pool.getAtlas('Roboto', 'normal', '400');
|
|
86
|
+
* atlas.onPageAdded.on(idx => console.warn(`Atlas page ${idx} added`));
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
readonly onPageAdded: Signal<[pageIndex: number]>;
|
|
90
|
+
/** {@link GlyphSdf} instances keyed by font size — only used in SDF mode. */
|
|
91
|
+
private readonly _sdfInstances;
|
|
92
|
+
constructor(family: string, fontStyle: 'normal' | 'italic', fontWeight: string, pageSize?: number, mode?: AtlasMode, sdfRadius?: number);
|
|
93
|
+
get pages(): readonly AtlasPage[];
|
|
94
|
+
get mode(): AtlasMode;
|
|
95
|
+
getGlyph(char: string, size: number): GlyphInfo;
|
|
96
|
+
getKerning(prev: string, next: string, fontSize: number): number;
|
|
97
|
+
clear(): void;
|
|
98
|
+
private _addPage;
|
|
99
|
+
private _cssFont;
|
|
100
|
+
private _getSdf;
|
|
101
|
+
private _rasterizeSdf;
|
|
102
|
+
private _rasterizeCanvas;
|
|
103
|
+
private _allocateSlot;
|
|
104
|
+
}
|