@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
|
@@ -1,32 +1,101 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AbstractText } from './AbstractText';
|
|
2
|
+
import type { AtlasMode } from './GlyphAtlas';
|
|
3
|
+
import type { GlyphAtlas } from './GlyphAtlas';
|
|
4
|
+
import { SDF_RADIUS } from './GlyphAtlas';
|
|
5
|
+
import type { LayoutOptions } from './LayoutOptions';
|
|
2
6
|
import type { TextStyleOptions } from './TextStyle';
|
|
3
7
|
import { TextStyle } from './TextStyle';
|
|
8
|
+
import type { TextPageQuads, TextSize } from './types';
|
|
9
|
+
export type { TextPageQuads };
|
|
4
10
|
/**
|
|
5
11
|
* GPU-accelerated text node that rasterizes individual glyphs into a shared
|
|
6
|
-
*
|
|
7
|
-
*
|
|
12
|
+
* per-font-variant {@link GlyphAtlas} using the SDF (Signed Distance Field)
|
|
13
|
+
* technique and renders them through the `text-sdf` shader.
|
|
8
14
|
*
|
|
9
|
-
*
|
|
10
|
-
* `
|
|
11
|
-
*
|
|
15
|
+
* Style mutations are applied automatically before the next draw — no manual
|
|
16
|
+
* `update()` call required. Mutating `text.style` any number of times in the
|
|
17
|
+
* same frame is cheap; the geometry is rebuilt at most once, on demand.
|
|
12
18
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
19
|
+
* ```ts
|
|
20
|
+
* const label = new Text('Hello', { fontSize: 24 });
|
|
21
|
+
* scene.addChild(label);
|
|
22
|
+
*
|
|
23
|
+
* label.style.fillColor = new Color(255, 0, 0); // cheap — no atlas work
|
|
24
|
+
* label.style.outlineWidth = 0.08; // cheap — only shader uniforms
|
|
25
|
+
* // changes are picked up automatically on the next render pass
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* **FontFace-first:** load fonts via {@link FontFactory} before constructing
|
|
29
|
+
* the node, then pass the loaded `FontFace` via the `font` style option. The
|
|
30
|
+
* label renders immediately with the correct glyphs — no async waiting needed.
|
|
31
|
+
*
|
|
32
|
+
* ```ts
|
|
33
|
+
* const face = await loader.load(FontFactory, 'roboto.woff2', { family: 'Roboto' });
|
|
34
|
+
* const label = new Text('Score: 0', { font: face, fontSize: 24 });
|
|
35
|
+
* scene.addChild(label); // renders immediately with Roboto
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* Enable colour-glyph (emoji) mode via `colorGlyphs: true` in the constructor
|
|
39
|
+
* options. Colour-glyph nodes use the `text-color` shader instead of `text-sdf`.
|
|
40
|
+
* @stable
|
|
16
41
|
*/
|
|
17
|
-
export declare class Text extends
|
|
18
|
-
private _text;
|
|
42
|
+
export declare class Text extends AbstractText {
|
|
19
43
|
private _style;
|
|
20
|
-
private
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
44
|
+
private _layout;
|
|
45
|
+
private _colorGlyphs;
|
|
46
|
+
private _sdfRadius;
|
|
47
|
+
private _atlas;
|
|
48
|
+
private _destroyed;
|
|
49
|
+
private _faceLoadVersion;
|
|
50
|
+
/** Resolves when an in-flight FontFace load finishes. Null when no face load is pending. */
|
|
51
|
+
private _faceLoadPromise;
|
|
52
|
+
/** Per-page quad geometry built by `_rebuild()`. */
|
|
53
|
+
private _pageQuads;
|
|
54
|
+
private _textBounds;
|
|
55
|
+
constructor(text: string, style?: TextStyle | TextStyleOptions, layout?: LayoutOptions, options?: {
|
|
56
|
+
colorGlyphs?: boolean;
|
|
57
|
+
sdfRadius?: number;
|
|
58
|
+
});
|
|
24
59
|
get style(): TextStyle;
|
|
25
|
-
set style(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
60
|
+
set style(v: TextStyle | TextStyleOptions);
|
|
61
|
+
get text(): string;
|
|
62
|
+
set text(v: string);
|
|
63
|
+
get layout(): LayoutOptions;
|
|
64
|
+
set layout(v: LayoutOptions);
|
|
65
|
+
/**
|
|
66
|
+
* `true` if this node was constructed with `colorGlyphs: true`.
|
|
67
|
+
* Colour-glyph nodes use a RGBA atlas (emoji / colour fonts) and
|
|
68
|
+
* the `text-color` shader instead of `text-sdf`.
|
|
69
|
+
*/
|
|
70
|
+
get colorGlyphs(): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* SDF buffer radius (pixels) used when rasterizing glyphs for this node.
|
|
73
|
+
* Determines the maximum usable outline/shadow reach.
|
|
74
|
+
* Nodes with different radii use separate atlas instances.
|
|
75
|
+
*/
|
|
76
|
+
get sdfRadius(): number;
|
|
77
|
+
/**
|
|
78
|
+
* The atlas mode used by this node: `'color'` for colour glyphs,
|
|
79
|
+
* `'sdf'` for standard text.
|
|
80
|
+
*/
|
|
81
|
+
get atlasMode(): AtlasMode;
|
|
82
|
+
/** Per-page quad data consumed by the text renderer. */
|
|
83
|
+
get pageQuads(): readonly TextPageQuads[];
|
|
84
|
+
get textBounds(): TextSize;
|
|
85
|
+
/** The {@link GlyphAtlas} this node currently draws from. */
|
|
86
|
+
get atlas(): GlyphAtlas | null;
|
|
87
|
+
syncDirty(): void;
|
|
30
88
|
destroy(): void;
|
|
89
|
+
/** Extract a {@link FontFace} from raw style options, or return null. */
|
|
90
|
+
private _extractFace;
|
|
91
|
+
/**
|
|
92
|
+
* Register `face` with `document.fonts` if needed, await its load, then
|
|
93
|
+
* clear the relevant atlas slice and rebuild geometry.
|
|
94
|
+
*
|
|
95
|
+
* Uses a version counter to discard stale loads when the style is replaced
|
|
96
|
+
* before the previous face finishes loading.
|
|
97
|
+
*/
|
|
98
|
+
private _loadFace;
|
|
31
99
|
private _rebuild;
|
|
32
100
|
}
|
|
101
|
+
export { SDF_RADIUS };
|
|
@@ -1,132 +1,207 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { layoutText } from './TextLayout.js';
|
|
1
|
+
import { AbstractText } from './AbstractText.js';
|
|
2
|
+
import { SDF_RADIUS } from './GlyphAtlas.js';
|
|
3
|
+
import { getDefaultGlyphAtlasPool } from './GlyphAtlasPool.js';
|
|
4
|
+
import { layoutText, buildTextPageQuads } from './TextLayout.js';
|
|
5
5
|
import { TextStyle } from './TextStyle.js';
|
|
6
6
|
|
|
7
|
-
function buildMesh(placements, style) {
|
|
8
|
-
const n = placements.length;
|
|
9
|
-
const vertices = new Float32Array(n * 4 * 2);
|
|
10
|
-
const uvs = new Float32Array(n * 4 * 2);
|
|
11
|
-
const indices = new Uint16Array(n * 6);
|
|
12
|
-
for (let i = 0; i < n; i++) {
|
|
13
|
-
const p = placements[i];
|
|
14
|
-
const v = i * 8;
|
|
15
|
-
const u = i * 8;
|
|
16
|
-
const indexBase = i * 6;
|
|
17
|
-
const baseV = i * 4;
|
|
18
|
-
// Vertices: TL, TR, BR, BL
|
|
19
|
-
vertices[v + 0] = p.x;
|
|
20
|
-
vertices[v + 1] = p.y;
|
|
21
|
-
vertices[v + 2] = p.x + p.width;
|
|
22
|
-
vertices[v + 3] = p.y;
|
|
23
|
-
vertices[v + 4] = p.x + p.width;
|
|
24
|
-
vertices[v + 5] = p.y + p.height;
|
|
25
|
-
vertices[v + 6] = p.x;
|
|
26
|
-
vertices[v + 7] = p.y + p.height;
|
|
27
|
-
// UVs: TL, TR, BR, BL
|
|
28
|
-
uvs[u + 0] = p.uvLeft;
|
|
29
|
-
uvs[u + 1] = p.uvTop;
|
|
30
|
-
uvs[u + 2] = p.uvRight;
|
|
31
|
-
uvs[u + 3] = p.uvTop;
|
|
32
|
-
uvs[u + 4] = p.uvRight;
|
|
33
|
-
uvs[u + 5] = p.uvBottom;
|
|
34
|
-
uvs[u + 6] = p.uvLeft;
|
|
35
|
-
uvs[u + 7] = p.uvBottom;
|
|
36
|
-
// Indices: [TL, TR, BR, TL, BR, BL]
|
|
37
|
-
indices[indexBase + 0] = baseV + 0;
|
|
38
|
-
indices[indexBase + 1] = baseV + 1;
|
|
39
|
-
indices[indexBase + 2] = baseV + 2;
|
|
40
|
-
indices[indexBase + 3] = baseV + 0;
|
|
41
|
-
indices[indexBase + 4] = baseV + 2;
|
|
42
|
-
indices[indexBase + 5] = baseV + 3;
|
|
43
|
-
}
|
|
44
|
-
const atlas = getDefaultGlyphAtlas();
|
|
45
|
-
const mesh = new Mesh({
|
|
46
|
-
vertices,
|
|
47
|
-
uvs,
|
|
48
|
-
indices,
|
|
49
|
-
texture: atlas.texture,
|
|
50
|
-
});
|
|
51
|
-
mesh.tint = style.fillColor;
|
|
52
|
-
return mesh;
|
|
53
|
-
}
|
|
54
7
|
/**
|
|
55
8
|
* GPU-accelerated text node that rasterizes individual glyphs into a shared
|
|
56
|
-
*
|
|
57
|
-
*
|
|
9
|
+
* per-font-variant {@link GlyphAtlas} using the SDF (Signed Distance Field)
|
|
10
|
+
* technique and renders them through the `text-sdf` shader.
|
|
11
|
+
*
|
|
12
|
+
* Style mutations are applied automatically before the next draw — no manual
|
|
13
|
+
* `update()` call required. Mutating `text.style` any number of times in the
|
|
14
|
+
* same frame is cheap; the geometry is rebuilt at most once, on demand.
|
|
15
|
+
*
|
|
16
|
+
* ```ts
|
|
17
|
+
* const label = new Text('Hello', { fontSize: 24 });
|
|
18
|
+
* scene.addChild(label);
|
|
19
|
+
*
|
|
20
|
+
* label.style.fillColor = new Color(255, 0, 0); // cheap — no atlas work
|
|
21
|
+
* label.style.outlineWidth = 0.08; // cheap — only shader uniforms
|
|
22
|
+
* // changes are picked up automatically on the next render pass
|
|
23
|
+
* ```
|
|
58
24
|
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
* no
|
|
25
|
+
* **FontFace-first:** load fonts via {@link FontFactory} before constructing
|
|
26
|
+
* the node, then pass the loaded `FontFace` via the `font` style option. The
|
|
27
|
+
* label renders immediately with the correct glyphs — no async waiting needed.
|
|
62
28
|
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
29
|
+
* ```ts
|
|
30
|
+
* const face = await loader.load(FontFactory, 'roboto.woff2', { family: 'Roboto' });
|
|
31
|
+
* const label = new Text('Score: 0', { font: face, fontSize: 24 });
|
|
32
|
+
* scene.addChild(label); // renders immediately with Roboto
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* Enable colour-glyph (emoji) mode via `colorGlyphs: true` in the constructor
|
|
36
|
+
* options. Colour-glyph nodes use the `text-color` shader instead of `text-sdf`.
|
|
37
|
+
* @stable
|
|
66
38
|
*/
|
|
67
|
-
class Text extends
|
|
68
|
-
_text;
|
|
39
|
+
class Text extends AbstractText {
|
|
69
40
|
_style;
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
41
|
+
_layout;
|
|
42
|
+
_colorGlyphs;
|
|
43
|
+
_sdfRadius;
|
|
44
|
+
_atlas = null;
|
|
45
|
+
_destroyed = false;
|
|
46
|
+
_faceLoadVersion = 0;
|
|
47
|
+
/** Resolves when an in-flight FontFace load finishes. Null when no face load is pending. */
|
|
48
|
+
_faceLoadPromise = null;
|
|
49
|
+
/** Per-page quad geometry built by `_rebuild()`. */
|
|
50
|
+
_pageQuads = [];
|
|
51
|
+
_textBounds = { width: 0, height: 0 };
|
|
52
|
+
constructor(text, style, layout, options = {}) {
|
|
53
|
+
super(text);
|
|
54
|
+
this._style = style instanceof TextStyle ? style : new TextStyle(style);
|
|
55
|
+
this._layout = layout ?? {};
|
|
56
|
+
this._colorGlyphs = options.colorGlyphs ?? false;
|
|
57
|
+
this._sdfRadius = options.sdfRadius ?? SDF_RADIUS;
|
|
58
|
+
if (!(style instanceof TextStyle) && style !== undefined) {
|
|
59
|
+
const face = this._extractFace(style);
|
|
60
|
+
if (face !== null)
|
|
61
|
+
this._faceLoadPromise = this._loadFace(face);
|
|
62
|
+
}
|
|
63
|
+
this._rebuild('font');
|
|
64
|
+
}
|
|
65
|
+
get style() {
|
|
66
|
+
return this._style;
|
|
67
|
+
}
|
|
68
|
+
set style(v) {
|
|
69
|
+
this._style = v instanceof TextStyle ? v : new TextStyle(v);
|
|
70
|
+
if (!(v instanceof TextStyle)) {
|
|
71
|
+
const face = this._extractFace(v);
|
|
72
|
+
if (face !== null)
|
|
73
|
+
this._faceLoadPromise = this._loadFace(face);
|
|
74
|
+
}
|
|
75
|
+
this._rebuild('font');
|
|
76
76
|
}
|
|
77
77
|
get text() {
|
|
78
78
|
return this._text;
|
|
79
79
|
}
|
|
80
|
-
set text(
|
|
81
|
-
this.
|
|
80
|
+
set text(v) {
|
|
81
|
+
if (this._text === v)
|
|
82
|
+
return;
|
|
83
|
+
this._text = v;
|
|
84
|
+
this._rebuild('layout');
|
|
82
85
|
}
|
|
83
|
-
get
|
|
84
|
-
return this.
|
|
86
|
+
get layout() {
|
|
87
|
+
return this._layout;
|
|
85
88
|
}
|
|
86
|
-
set
|
|
87
|
-
this.
|
|
89
|
+
set layout(v) {
|
|
90
|
+
this._layout = v;
|
|
91
|
+
this._rebuild('layout');
|
|
88
92
|
}
|
|
89
|
-
/**
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
return this;
|
|
93
|
+
/**
|
|
94
|
+
* `true` if this node was constructed with `colorGlyphs: true`.
|
|
95
|
+
* Colour-glyph nodes use a RGBA atlas (emoji / colour fonts) and
|
|
96
|
+
* the `text-color` shader instead of `text-sdf`.
|
|
97
|
+
*/
|
|
98
|
+
get colorGlyphs() {
|
|
99
|
+
return this._colorGlyphs;
|
|
96
100
|
}
|
|
97
|
-
/**
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
101
|
+
/**
|
|
102
|
+
* SDF buffer radius (pixels) used when rasterizing glyphs for this node.
|
|
103
|
+
* Determines the maximum usable outline/shadow reach.
|
|
104
|
+
* Nodes with different radii use separate atlas instances.
|
|
105
|
+
*/
|
|
106
|
+
get sdfRadius() {
|
|
107
|
+
return this._sdfRadius;
|
|
102
108
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
109
|
+
/**
|
|
110
|
+
* The atlas mode used by this node: `'color'` for colour glyphs,
|
|
111
|
+
* `'sdf'` for standard text.
|
|
112
|
+
*/
|
|
113
|
+
get atlasMode() {
|
|
114
|
+
return this._colorGlyphs ? 'color' : 'sdf';
|
|
115
|
+
}
|
|
116
|
+
/** Per-page quad data consumed by the text renderer. */
|
|
117
|
+
get pageQuads() {
|
|
118
|
+
return this._pageQuads;
|
|
119
|
+
}
|
|
120
|
+
get textBounds() {
|
|
121
|
+
return this._textBounds;
|
|
122
|
+
}
|
|
123
|
+
/** The {@link GlyphAtlas} this node currently draws from. */
|
|
124
|
+
get atlas() {
|
|
125
|
+
return this._atlas;
|
|
126
|
+
}
|
|
127
|
+
syncDirty() {
|
|
128
|
+
const hint = this._style.consumeDirty();
|
|
129
|
+
if (hint !== null && hint !== 'tint') {
|
|
130
|
+
this._rebuild(hint);
|
|
107
131
|
}
|
|
132
|
+
}
|
|
133
|
+
destroy() {
|
|
134
|
+
this._destroyed = true;
|
|
135
|
+
this._faceLoadVersion++;
|
|
136
|
+
this._faceLoadPromise = null;
|
|
137
|
+
this._pageQuads = [];
|
|
138
|
+
this._atlas = null;
|
|
108
139
|
super.destroy();
|
|
109
140
|
}
|
|
110
|
-
//
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
if (
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
141
|
+
// ── Private ──────────────────────────────────────────────────────────────
|
|
142
|
+
/** Extract a {@link FontFace} from raw style options, or return null. */
|
|
143
|
+
_extractFace(opts) {
|
|
144
|
+
if (typeof FontFace === 'undefined')
|
|
145
|
+
return null;
|
|
146
|
+
if (opts.font instanceof FontFace)
|
|
147
|
+
return opts.font;
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Register `face` with `document.fonts` if needed, await its load, then
|
|
152
|
+
* clear the relevant atlas slice and rebuild geometry.
|
|
153
|
+
*
|
|
154
|
+
* Uses a version counter to discard stale loads when the style is replaced
|
|
155
|
+
* before the previous face finishes loading.
|
|
156
|
+
*/
|
|
157
|
+
async _loadFace(face) {
|
|
158
|
+
if (typeof document === 'undefined' || !document.fonts)
|
|
159
|
+
return;
|
|
160
|
+
const version = ++this._faceLoadVersion;
|
|
161
|
+
if (!document.fonts.has(face)) {
|
|
162
|
+
document.fonts.add(face);
|
|
163
|
+
}
|
|
164
|
+
try {
|
|
165
|
+
await face.load();
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return;
|
|
117
169
|
}
|
|
170
|
+
if (this._destroyed || version !== this._faceLoadVersion)
|
|
171
|
+
return;
|
|
172
|
+
const pool = getDefaultGlyphAtlasPool();
|
|
173
|
+
pool.getAtlas(this._style.fontFamily, this._style.fontStyle, this._style.fontWeight, this.atlasMode, this._sdfRadius).clear();
|
|
174
|
+
this._rebuild('font');
|
|
175
|
+
}
|
|
176
|
+
_rebuild(_hint) {
|
|
177
|
+
this._pageQuads = [];
|
|
178
|
+
this._textBounds = { width: 0, height: 0 };
|
|
118
179
|
if (this._text.length === 0) {
|
|
180
|
+
this._style.consumeDirty();
|
|
119
181
|
return;
|
|
120
182
|
}
|
|
121
|
-
const
|
|
122
|
-
const
|
|
183
|
+
const pool = getDefaultGlyphAtlasPool();
|
|
184
|
+
const atlas = pool.getAtlas(this._style.fontFamily, this._style.fontStyle, this._style.fontWeight, this.atlasMode, this._sdfRadius);
|
|
185
|
+
this._atlas = atlas;
|
|
186
|
+
const placements = layoutText(this._text, this._style, this._layout, atlas);
|
|
123
187
|
if (placements.length === 0) {
|
|
188
|
+
this._style.consumeDirty();
|
|
124
189
|
return;
|
|
125
190
|
}
|
|
126
|
-
|
|
127
|
-
|
|
191
|
+
let maxX = 0, maxY = 0;
|
|
192
|
+
for (const p of placements) {
|
|
193
|
+
const px = p.x + p.width;
|
|
194
|
+
const py = p.y + p.height;
|
|
195
|
+
if (px > maxX)
|
|
196
|
+
maxX = px;
|
|
197
|
+
if (py > maxY)
|
|
198
|
+
maxY = py;
|
|
199
|
+
}
|
|
200
|
+
this._textBounds = { width: maxX, height: maxY };
|
|
201
|
+
this._pageQuads = buildTextPageQuads(placements);
|
|
202
|
+
this._style.consumeDirty();
|
|
128
203
|
}
|
|
129
204
|
}
|
|
130
205
|
|
|
131
|
-
export { Text };
|
|
206
|
+
export { SDF_RADIUS, Text };
|
|
132
207
|
//# sourceMappingURL=Text.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Text.js","sources":["../../../../../src/rendering/text/Text.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"Text.js","sources":["../../../../../src/rendering/text/Text.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,25 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
import type { GlyphPlacement } from './types';
|
|
1
|
+
import type { LayoutOptions } from './LayoutOptions';
|
|
2
|
+
import type { GlyphPlacement, GlyphProvider, TextLayoutStyle, TextPageQuads, TextSize } from './types';
|
|
4
3
|
/**
|
|
5
|
-
*
|
|
4
|
+
* Compute the bounding pixel dimensions of `text` without allocating quad
|
|
5
|
+
* placements. Returns `{ width: 0, height: 0 }` for empty text.
|
|
6
|
+
*/
|
|
7
|
+
export declare function measureText(text: string, style: TextLayoutStyle, provider: GlyphProvider): TextSize;
|
|
8
|
+
/**
|
|
9
|
+
* Computes per-glyph quad placements for the given text, style, and layout
|
|
10
|
+
* options.
|
|
6
11
|
*
|
|
7
|
-
* Handles `\n` line breaks
|
|
8
|
-
*
|
|
9
|
-
*
|
|
12
|
+
* Handles `\n` line breaks, left/center/right/justify alignment, `letterSpacing`,
|
|
13
|
+
* `leading`, `breakWords`, `whiteSpace` preprocessing, and optional kerning
|
|
14
|
+
* (if the provider implements `getKerning`). RTL and ligature shaping are out
|
|
15
|
+
* of scope; Unicode/diacritics are delegated to the browser's canvas engine.
|
|
10
16
|
*
|
|
11
17
|
* Returns an empty array for empty text.
|
|
12
18
|
*/
|
|
13
|
-
export declare function layoutText(text: string, style:
|
|
19
|
+
export declare function layoutText(text: string, style: TextLayoutStyle, layout: LayoutOptions, provider: GlyphProvider): readonly GlyphPlacement[];
|
|
20
|
+
/**
|
|
21
|
+
* Convert {@link GlyphPlacement} arrays into per-atlas-page quad geometry
|
|
22
|
+
* ready for GPU upload. Zero-size placements (e.g. whitespace glyphs that
|
|
23
|
+
* have no atlas entry) are skipped.
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildTextPageQuads(placements: readonly GlyphPlacement[]): TextPageQuads[];
|