@codexo/exojs 0.8.4 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) hide show
  1. package/CHANGELOG.md +99 -0
  2. package/README.md +34 -13
  3. package/dist/esm/animation/Tween.d.ts +20 -3
  4. package/dist/esm/animation/Tween.js +16 -8
  5. package/dist/esm/animation/Tween.js.map +1 -1
  6. package/dist/esm/animation/TweenManager.d.ts +16 -1
  7. package/dist/esm/animation/TweenManager.js +27 -2
  8. package/dist/esm/animation/TweenManager.js.map +1 -1
  9. package/dist/esm/audio/AudioAnalyser.d.ts +2 -0
  10. package/dist/esm/audio/AudioAnalyser.js +24 -9
  11. package/dist/esm/audio/AudioAnalyser.js.map +1 -1
  12. package/dist/esm/audio/AudioBus.d.ts +1 -0
  13. package/dist/esm/audio/AudioBus.js +8 -4
  14. package/dist/esm/audio/AudioBus.js.map +1 -1
  15. package/dist/esm/audio/AudioListener.d.ts +1 -0
  16. package/dist/esm/audio/AudioListener.js +7 -5
  17. package/dist/esm/audio/AudioListener.js.map +1 -1
  18. package/dist/esm/audio/AudioManager.d.ts +8 -2
  19. package/dist/esm/audio/AudioManager.js +14 -1
  20. package/dist/esm/audio/AudioManager.js.map +1 -1
  21. package/dist/esm/audio/BeatDetector.d.ts +2 -0
  22. package/dist/esm/audio/BeatDetector.js +27 -661
  23. package/dist/esm/audio/BeatDetector.js.map +1 -1
  24. package/dist/esm/audio/Music.d.ts +1 -0
  25. package/dist/esm/audio/Music.js +7 -3
  26. package/dist/esm/audio/Music.js.map +1 -1
  27. package/dist/esm/audio/OscillatorSound.d.ts +1 -0
  28. package/dist/esm/audio/OscillatorSound.js +7 -3
  29. package/dist/esm/audio/OscillatorSound.js.map +1 -1
  30. package/dist/esm/audio/Sound.d.ts +1 -0
  31. package/dist/esm/audio/Sound.js +7 -3
  32. package/dist/esm/audio/Sound.js.map +1 -1
  33. package/dist/esm/audio/audio-context.d.ts +2 -2
  34. package/dist/esm/audio/audio-context.js +4 -4
  35. package/dist/esm/audio/audio-context.js.map +1 -1
  36. package/dist/esm/audio/filters/ChorusFilter.d.ts +1 -0
  37. package/dist/esm/audio/filters/ChorusFilter.js +7 -3
  38. package/dist/esm/audio/filters/ChorusFilter.js.map +1 -1
  39. package/dist/esm/audio/filters/CompressorFilter.d.ts +1 -0
  40. package/dist/esm/audio/filters/CompressorFilter.js +7 -3
  41. package/dist/esm/audio/filters/CompressorFilter.js.map +1 -1
  42. package/dist/esm/audio/filters/DelayFilter.d.ts +1 -0
  43. package/dist/esm/audio/filters/DelayFilter.js +7 -3
  44. package/dist/esm/audio/filters/DelayFilter.js.map +1 -1
  45. package/dist/esm/audio/filters/EqualizerFilter.d.ts +1 -0
  46. package/dist/esm/audio/filters/EqualizerFilter.js +7 -3
  47. package/dist/esm/audio/filters/EqualizerFilter.js.map +1 -1
  48. package/dist/esm/audio/filters/GranularFilter.js +1 -86
  49. package/dist/esm/audio/filters/GranularFilter.js.map +1 -1
  50. package/dist/esm/audio/filters/HighpassFilter.d.ts +1 -0
  51. package/dist/esm/audio/filters/HighpassFilter.js +7 -3
  52. package/dist/esm/audio/filters/HighpassFilter.js.map +1 -1
  53. package/dist/esm/audio/filters/LowpassFilter.d.ts +1 -0
  54. package/dist/esm/audio/filters/LowpassFilter.js +7 -3
  55. package/dist/esm/audio/filters/LowpassFilter.js.map +1 -1
  56. package/dist/esm/audio/filters/PitchShiftFilter.js +1 -71
  57. package/dist/esm/audio/filters/PitchShiftFilter.js.map +1 -1
  58. package/dist/esm/audio/filters/ReverbFilter.d.ts +1 -0
  59. package/dist/esm/audio/filters/ReverbFilter.js +7 -3
  60. package/dist/esm/audio/filters/ReverbFilter.js.map +1 -1
  61. package/dist/esm/audio/filters/VocoderFilter.js +1 -89
  62. package/dist/esm/audio/filters/VocoderFilter.js.map +1 -1
  63. package/dist/esm/audio/filters/WorkletFilter.d.ts +2 -0
  64. package/dist/esm/audio/filters/WorkletFilter.js +10 -5
  65. package/dist/esm/audio/filters/WorkletFilter.js.map +1 -1
  66. package/dist/esm/audio/index.d.ts +15 -10
  67. package/dist/esm/audio/worklet/registerWorklet.d.ts +1 -1
  68. package/dist/esm/audio/worklet/registerWorklet.js +2 -2
  69. package/dist/esm/audio/worklet/registerWorklet.js.map +1 -1
  70. package/dist/esm/audio/worklets/beat-detector.worklet.d.ts +1 -0
  71. package/dist/esm/audio/worklets/beat-detector.worklet.js +647 -0
  72. package/dist/esm/audio/worklets/beat-detector.worklet.js.map +1 -0
  73. package/dist/esm/audio/worklets/granular.worklet.d.ts +1 -0
  74. package/dist/esm/audio/worklets/granular.worklet.js +89 -0
  75. package/dist/esm/audio/worklets/granular.worklet.js.map +1 -0
  76. package/dist/esm/audio/worklets/pitch-shift.worklet.d.ts +1 -0
  77. package/dist/esm/audio/worklets/pitch-shift.worklet.js +74 -0
  78. package/dist/esm/audio/worklets/pitch-shift.worklet.js.map +1 -0
  79. package/dist/esm/audio/worklets/vocoder.worklet.d.ts +1 -0
  80. package/dist/esm/audio/worklets/vocoder.worklet.js +92 -0
  81. package/dist/esm/audio/worklets/vocoder.worklet.js.map +1 -0
  82. package/dist/esm/core/Application.d.ts +86 -29
  83. package/dist/esm/core/Application.js +157 -47
  84. package/dist/esm/core/Application.js.map +1 -1
  85. package/dist/esm/core/Color.d.ts +0 -8
  86. package/dist/esm/core/Color.js +0 -24
  87. package/dist/esm/core/Color.js.map +1 -1
  88. package/dist/esm/core/Perf.d.ts +23 -0
  89. package/dist/esm/core/Perf.js +49 -0
  90. package/dist/esm/core/Perf.js.map +1 -0
  91. package/dist/esm/core/Scene.d.ts +40 -80
  92. package/dist/esm/core/Scene.js +63 -43
  93. package/dist/esm/core/Scene.js.map +1 -1
  94. package/dist/esm/core/SceneManager.d.ts +11 -25
  95. package/dist/esm/core/SceneManager.js +37 -100
  96. package/dist/esm/core/SceneManager.js.map +1 -1
  97. package/dist/esm/core/SceneNode.d.ts +28 -17
  98. package/dist/esm/core/SceneNode.js +66 -42
  99. package/dist/esm/core/SceneNode.js.map +1 -1
  100. package/dist/esm/core/Signal.d.ts +24 -28
  101. package/dist/esm/core/Signal.js +64 -50
  102. package/dist/esm/core/Signal.js.map +1 -1
  103. package/dist/esm/core/Timer.d.ts +1 -0
  104. package/dist/esm/core/Timer.js +3 -0
  105. package/dist/esm/core/Timer.js.map +1 -1
  106. package/dist/esm/core/capabilities.d.ts +2 -0
  107. package/dist/esm/core/capabilities.js +15 -0
  108. package/dist/esm/core/capabilities.js.map +1 -1
  109. package/dist/esm/core/index.d.ts +1 -0
  110. package/dist/esm/core/types.d.ts +1 -1
  111. package/dist/esm/core/utils.d.ts +12 -0
  112. package/dist/esm/core/utils.js +18 -1
  113. package/dist/esm/core/utils.js.map +1 -1
  114. package/dist/esm/debug/BoundingBoxesLayer.js +1 -1
  115. package/dist/esm/debug/BoundingBoxesLayer.js.map +1 -1
  116. package/dist/esm/debug/HitTestLayer.js +1 -1
  117. package/dist/esm/debug/HitTestLayer.js.map +1 -1
  118. package/dist/esm/debug/PerformanceLayer.js +1 -2
  119. package/dist/esm/debug/PerformanceLayer.js.map +1 -1
  120. package/dist/esm/debug/PointerStackLayer.js +1 -2
  121. package/dist/esm/debug/PointerStackLayer.js.map +1 -1
  122. package/dist/esm/debug/RenderPassInspectorLayer.js +1 -2
  123. package/dist/esm/debug/RenderPassInspectorLayer.js.map +1 -1
  124. package/dist/esm/index.js +37 -10
  125. package/dist/esm/index.js.map +1 -1
  126. package/dist/esm/input/InputManager.d.ts +1 -0
  127. package/dist/esm/input/InputManager.js +30 -3
  128. package/dist/esm/input/InputManager.js.map +1 -1
  129. package/dist/esm/input/InteractionManager.d.ts +5 -2
  130. package/dist/esm/input/InteractionManager.js +29 -18
  131. package/dist/esm/input/InteractionManager.js.map +1 -1
  132. package/dist/esm/input/Pointer.js +3 -2
  133. package/dist/esm/input/Pointer.js.map +1 -1
  134. package/dist/esm/input/internal/interactionManagerRegistry.d.ts +9 -0
  135. package/dist/esm/input/internal/interactionManagerRegistry.js +10 -0
  136. package/dist/esm/input/internal/interactionManagerRegistry.js.map +1 -0
  137. package/dist/esm/math/AbstractVector.d.ts +1 -7
  138. package/dist/esm/math/AbstractVector.js +6 -20
  139. package/dist/esm/math/AbstractVector.js.map +1 -1
  140. package/dist/esm/math/Circle.js +0 -2
  141. package/dist/esm/math/Circle.js.map +1 -1
  142. package/dist/esm/math/Collision.d.ts +9 -3
  143. package/dist/esm/math/Ellipse.d.ts +2 -5
  144. package/dist/esm/math/Ellipse.js +10 -7
  145. package/dist/esm/math/Ellipse.js.map +1 -1
  146. package/dist/esm/math/ObservableVector.d.ts +1 -1
  147. package/dist/esm/math/ObservableVector.js +3 -3
  148. package/dist/esm/math/ObservableVector.js.map +1 -1
  149. package/dist/esm/math/Polygon.d.ts +0 -2
  150. package/dist/esm/math/Polygon.js +1 -9
  151. package/dist/esm/math/Polygon.js.map +1 -1
  152. package/dist/esm/math/Rectangle.js +0 -2
  153. package/dist/esm/math/Rectangle.js.map +1 -1
  154. package/dist/esm/math/collision-detection.d.ts +19 -4
  155. package/dist/esm/math/collision-detection.js +61 -4
  156. package/dist/esm/math/collision-detection.js.map +1 -1
  157. package/dist/esm/math/swept-collision.d.ts +16 -12
  158. package/dist/esm/math/swept-collision.js +109 -19
  159. package/dist/esm/math/swept-collision.js.map +1 -1
  160. package/dist/esm/particles/ParticleSystem.d.ts +8 -5
  161. package/dist/esm/particles/ParticleSystem.js +10 -6
  162. package/dist/esm/particles/ParticleSystem.js.map +1 -1
  163. package/dist/esm/particles/distributions/{Gradient.d.ts → ColorGradient.d.ts} +5 -5
  164. package/dist/esm/particles/distributions/{Gradient.js → ColorGradient.js} +5 -5
  165. package/dist/esm/particles/distributions/ColorGradient.js.map +1 -0
  166. package/dist/esm/particles/distributions/Distribution.d.ts +2 -2
  167. package/dist/esm/particles/distributions/index.d.ts +2 -2
  168. package/dist/esm/particles/gpu/ParticleGpuState.js +1 -1
  169. package/dist/esm/particles/index.d.ts +1 -0
  170. package/dist/esm/particles/modules/ColorOverLifetime.d.ts +3 -3
  171. package/dist/esm/particles/modules/ColorOverLifetime.js.map +1 -1
  172. package/dist/esm/particles/modules/ColorOverSpeed.d.ts +3 -3
  173. package/dist/esm/particles/modules/ColorOverSpeed.js.map +1 -1
  174. package/dist/esm/particles/modules/UpdateModule.d.ts +2 -2
  175. package/dist/esm/particles/modules/UpdateModule.js +1 -1
  176. package/dist/esm/particles/modules/WgslContribution.d.ts +2 -2
  177. package/dist/esm/rendering/CallbackRenderPass.d.ts +1 -0
  178. package/dist/esm/rendering/CallbackRenderPass.js +1 -0
  179. package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
  180. package/dist/esm/rendering/Camera.d.ts +33 -0
  181. package/dist/esm/rendering/Camera.js +38 -0
  182. package/dist/esm/rendering/Camera.js.map +1 -0
  183. package/dist/esm/rendering/Container.d.ts +7 -25
  184. package/dist/esm/rendering/Container.js +25 -87
  185. package/dist/esm/rendering/Container.js.map +1 -1
  186. package/dist/esm/rendering/Drawable.d.ts +8 -10
  187. package/dist/esm/rendering/Drawable.js +12 -20
  188. package/dist/esm/rendering/Drawable.js.map +1 -1
  189. package/dist/esm/rendering/RenderBackend.d.ts +19 -0
  190. package/dist/esm/rendering/RenderNode.d.ts +82 -11
  191. package/dist/esm/rendering/RenderNode.js +133 -163
  192. package/dist/esm/rendering/RenderNode.js.map +1 -1
  193. package/dist/esm/rendering/RenderPass.d.ts +1 -0
  194. package/dist/esm/rendering/RenderStats.d.ts +9 -0
  195. package/dist/esm/rendering/RenderStats.js +2 -0
  196. package/dist/esm/rendering/RenderStats.js.map +1 -1
  197. package/dist/esm/rendering/RenderTarget.d.ts +13 -0
  198. package/dist/esm/rendering/RenderTarget.js +13 -0
  199. package/dist/esm/rendering/RenderTarget.js.map +1 -1
  200. package/dist/esm/rendering/RenderTargetPass.js +17 -0
  201. package/dist/esm/rendering/RenderTargetPass.js.map +1 -1
  202. package/dist/esm/rendering/RendererRegistry.d.ts +1 -0
  203. package/dist/esm/rendering/RendererRegistry.js +1 -0
  204. package/dist/esm/rendering/RendererRegistry.js.map +1 -1
  205. package/dist/esm/rendering/RenderingContext.d.ts +87 -0
  206. package/dist/esm/rendering/RenderingContext.js +157 -0
  207. package/dist/esm/rendering/RenderingContext.js.map +1 -0
  208. package/dist/esm/rendering/TransformBuffer.d.ts +38 -0
  209. package/dist/esm/rendering/TransformBuffer.js +116 -0
  210. package/dist/esm/rendering/TransformBuffer.js.map +1 -0
  211. package/dist/esm/rendering/View.d.ts +23 -0
  212. package/dist/esm/rendering/View.js +42 -0
  213. package/dist/esm/rendering/View.js.map +1 -1
  214. package/dist/esm/rendering/filters/WebGpuShaderFilter.js +5 -12
  215. package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -1
  216. package/dist/esm/rendering/geometry/Geometry.d.ts +40 -0
  217. package/dist/esm/rendering/geometry/Geometry.js +228 -0
  218. package/dist/esm/rendering/geometry/Geometry.js.map +1 -0
  219. package/dist/esm/rendering/geometry/GeometryAttribute.d.ts +32 -0
  220. package/dist/esm/rendering/geometry/QuadGeometry.d.ts +5 -0
  221. package/dist/esm/rendering/gradient/Gradient.d.ts +34 -0
  222. package/dist/esm/rendering/gradient/Gradient.js +114 -0
  223. package/dist/esm/rendering/gradient/Gradient.js.map +1 -0
  224. package/dist/esm/rendering/gradient/LinearGradient.d.ts +10 -0
  225. package/dist/esm/rendering/gradient/LinearGradient.js +26 -0
  226. package/dist/esm/rendering/gradient/LinearGradient.js.map +1 -0
  227. package/dist/esm/rendering/gradient/RadialGradient.d.ts +10 -0
  228. package/dist/esm/rendering/gradient/RadialGradient.js +25 -0
  229. package/dist/esm/rendering/gradient/RadialGradient.js.map +1 -0
  230. package/dist/esm/rendering/index.d.ts +103 -59
  231. package/dist/esm/rendering/material/Material.d.ts +114 -0
  232. package/dist/esm/rendering/material/Material.js +111 -0
  233. package/dist/esm/rendering/material/Material.js.map +1 -0
  234. package/dist/esm/rendering/material/MaterialKey.d.ts +18 -0
  235. package/dist/esm/rendering/material/MaterialKey.js +82 -0
  236. package/dist/esm/rendering/material/MaterialKey.js.map +1 -0
  237. package/dist/esm/rendering/material/MeshMaterial.d.ts +16 -0
  238. package/dist/esm/rendering/material/MeshMaterial.js +21 -0
  239. package/dist/esm/rendering/material/MeshMaterial.js.map +1 -0
  240. package/dist/esm/rendering/{mesh/MeshShader.d.ts → material/ShaderSource.d.ts} +30 -62
  241. package/dist/esm/rendering/{mesh/MeshShader.js → material/ShaderSource.js} +36 -62
  242. package/dist/esm/rendering/material/ShaderSource.js.map +1 -0
  243. package/dist/esm/rendering/material/SpriteMaterial.d.ts +15 -0
  244. package/dist/esm/rendering/material/SpriteMaterial.js +20 -0
  245. package/dist/esm/rendering/material/SpriteMaterial.js.map +1 -0
  246. package/dist/esm/rendering/mesh/Mesh.d.ts +29 -12
  247. package/dist/esm/rendering/mesh/Mesh.js +123 -4
  248. package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
  249. package/dist/esm/rendering/pass/RenderPassCoordinator.d.ts +63 -0
  250. package/dist/esm/rendering/pass/RenderPassDescriptor.d.ts +48 -0
  251. package/dist/esm/rendering/pass/RenderPassDescriptor.js +16 -0
  252. package/dist/esm/rendering/pass/RenderPassDescriptor.js.map +1 -0
  253. package/dist/esm/rendering/plan/RenderCommand.d.ts +67 -0
  254. package/dist/esm/rendering/plan/RenderCommand.js +94 -0
  255. package/dist/esm/rendering/plan/RenderCommand.js.map +1 -0
  256. package/dist/esm/rendering/plan/RenderEffectExecutor.d.ts +10 -0
  257. package/dist/esm/rendering/plan/RenderEffectExecutor.js +159 -0
  258. package/dist/esm/rendering/plan/RenderEffectExecutor.js.map +1 -0
  259. package/dist/esm/rendering/plan/RenderPlan.d.ts +23 -0
  260. package/dist/esm/rendering/plan/RenderPlan.js +12 -0
  261. package/dist/esm/rendering/plan/RenderPlan.js.map +1 -0
  262. package/dist/esm/rendering/plan/RenderPlanBuilder.d.ts +31 -0
  263. package/dist/esm/rendering/plan/RenderPlanBuilder.js +242 -0
  264. package/dist/esm/rendering/plan/RenderPlanBuilder.js.map +1 -0
  265. package/dist/esm/rendering/plan/RenderPlanOptimizer.d.ts +10 -0
  266. package/dist/esm/rendering/plan/RenderPlanOptimizer.js +180 -0
  267. package/dist/esm/rendering/plan/RenderPlanOptimizer.js.map +1 -0
  268. package/dist/esm/rendering/plan/RenderPlanPlayer.d.ts +9 -0
  269. package/dist/esm/rendering/plan/RenderPlanPlayer.js +56 -0
  270. package/dist/esm/rendering/plan/RenderPlanPlayer.js.map +1 -0
  271. package/dist/esm/rendering/plan/RenderScope.d.ts +70 -0
  272. package/dist/esm/rendering/plan/RenderScope.js +16 -0
  273. package/dist/esm/rendering/plan/RenderScope.js.map +1 -0
  274. package/dist/esm/rendering/plan/playRenderTree.d.ts +4 -0
  275. package/dist/esm/rendering/plan/playRenderTree.js +19 -0
  276. package/dist/esm/rendering/plan/playRenderTree.js.map +1 -0
  277. package/dist/esm/rendering/shader/Shader.d.ts +1 -0
  278. package/dist/esm/rendering/shader/Shader.js +1 -0
  279. package/dist/esm/rendering/shader/Shader.js.map +1 -1
  280. package/dist/esm/rendering/shader/ShaderUniform.d.ts +1 -0
  281. package/dist/esm/rendering/shader/ShaderUniform.js +1 -0
  282. package/dist/esm/rendering/shader/ShaderUniform.js.map +1 -1
  283. package/dist/esm/rendering/sprite/Sprite.d.ts +25 -3
  284. package/dist/esm/rendering/sprite/Sprite.js +48 -15
  285. package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
  286. package/dist/esm/rendering/sprite/spriteMaterialSources.d.ts +36 -0
  287. package/dist/esm/rendering/sprite/spriteMaterialSources.js +128 -0
  288. package/dist/esm/rendering/sprite/spriteMaterialSources.js.map +1 -0
  289. package/dist/esm/rendering/text/AbstractText.d.ts +36 -0
  290. package/dist/esm/rendering/text/AbstractText.js +49 -0
  291. package/dist/esm/rendering/text/AbstractText.js.map +1 -0
  292. package/dist/esm/rendering/text/BitmapText.d.ts +97 -0
  293. package/dist/esm/rendering/text/BitmapText.js +220 -0
  294. package/dist/esm/rendering/text/BitmapText.js.map +1 -0
  295. package/dist/esm/rendering/text/BmFont.d.ts +50 -0
  296. package/dist/esm/rendering/text/BmFont.js +24 -0
  297. package/dist/esm/rendering/text/BmFont.js.map +1 -0
  298. package/dist/esm/rendering/text/GlyphAtlas.d.ts +104 -0
  299. package/dist/esm/rendering/text/GlyphAtlas.js +347 -0
  300. package/dist/esm/rendering/text/GlyphAtlas.js.map +1 -0
  301. package/dist/esm/rendering/text/GlyphAtlasPool.d.ts +40 -0
  302. package/dist/esm/rendering/text/GlyphAtlasPool.js +67 -0
  303. package/dist/esm/rendering/text/GlyphAtlasPool.js.map +1 -0
  304. package/dist/esm/rendering/text/GlyphSdf.d.ts +92 -0
  305. package/dist/esm/rendering/text/GlyphSdf.js +220 -0
  306. package/dist/esm/rendering/text/GlyphSdf.js.map +1 -0
  307. package/dist/esm/rendering/text/HTMLText.d.ts +107 -0
  308. package/dist/esm/rendering/text/HTMLText.js +284 -0
  309. package/dist/esm/rendering/text/HTMLText.js.map +1 -0
  310. package/dist/esm/rendering/text/LayoutOptions.d.ts +30 -0
  311. package/dist/esm/rendering/text/Text.d.ts +89 -20
  312. package/dist/esm/rendering/text/Text.js +176 -101
  313. package/dist/esm/rendering/text/Text.js.map +1 -1
  314. package/dist/esm/rendering/text/TextLayout.d.ts +20 -8
  315. package/dist/esm/rendering/text/TextLayout.js +234 -25
  316. package/dist/esm/rendering/text/TextLayout.js.map +1 -1
  317. package/dist/esm/rendering/text/TextStyle.d.ts +154 -87
  318. package/dist/esm/rendering/text/TextStyle.js +257 -203
  319. package/dist/esm/rendering/text/TextStyle.js.map +1 -1
  320. package/dist/esm/rendering/text/types.d.ts +73 -13
  321. package/dist/esm/rendering/texture/DataTexture.d.ts +5 -0
  322. package/dist/esm/rendering/texture/DataTexture.js +7 -0
  323. package/dist/esm/rendering/texture/DataTexture.js.map +1 -1
  324. package/dist/esm/rendering/texture/Texture.d.ts +1 -0
  325. package/dist/esm/rendering/texture/Texture.js +1 -0
  326. package/dist/esm/rendering/texture/Texture.js.map +1 -1
  327. package/dist/esm/rendering/types.d.ts +3 -1
  328. package/dist/esm/rendering/types.js +2 -0
  329. package/dist/esm/rendering/types.js.map +1 -1
  330. package/dist/esm/rendering/video/Video.d.ts +5 -8
  331. package/dist/esm/rendering/video/Video.js +12 -13
  332. package/dist/esm/rendering/video/Video.js.map +1 -1
  333. package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +40 -0
  334. package/dist/esm/rendering/webgl2/WebGl2Backend.js +344 -27
  335. package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
  336. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.d.ts +22 -2
  337. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +404 -112
  338. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -1
  339. package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.d.ts +57 -0
  340. package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js +79 -0
  341. package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js.map +1 -0
  342. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +12 -0
  343. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +214 -58
  344. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
  345. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.d.ts +34 -0
  346. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js +169 -0
  347. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js.map +1 -0
  348. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.d.ts +56 -0
  349. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js +486 -0
  350. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js.map +1 -0
  351. package/dist/esm/rendering/webgl2/glsl/mesh.frag.js +1 -1
  352. package/dist/esm/rendering/webgl2/glsl/mesh.vert.js +1 -1
  353. package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js +4 -0
  354. package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js.map +1 -0
  355. package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js +4 -0
  356. package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js.map +1 -0
  357. package/dist/esm/rendering/webgl2/glsl/text-color.frag.js +4 -0
  358. package/dist/esm/rendering/webgl2/glsl/text-color.frag.js.map +1 -0
  359. package/dist/esm/rendering/webgl2/glsl/text-msdf.frag.js +4 -0
  360. package/dist/esm/rendering/webgl2/glsl/text-msdf.frag.js.map +1 -0
  361. package/dist/esm/rendering/webgl2/glsl/text-sdf.frag.js +4 -0
  362. package/dist/esm/rendering/webgl2/glsl/text-sdf.frag.js.map +1 -0
  363. package/dist/esm/rendering/webgl2/glsl/text.vert.js +4 -0
  364. package/dist/esm/rendering/webgl2/glsl/text.vert.js.map +1 -0
  365. package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +50 -0
  366. package/dist/esm/rendering/webgpu/WebGpuBackend.js +151 -27
  367. package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
  368. package/dist/esm/rendering/webgpu/WebGpuBlendState.js +26 -0
  369. package/dist/esm/rendering/webgpu/WebGpuBlendState.js.map +1 -1
  370. package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js +22 -17
  371. package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js.map +1 -1
  372. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +26 -2
  373. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +511 -89
  374. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
  375. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +13 -17
  376. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js.map +1 -1
  377. package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.d.ts +141 -0
  378. package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js +270 -0
  379. package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js.map +1 -0
  380. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +16 -0
  381. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +344 -27
  382. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
  383. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.d.ts +57 -0
  384. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js +257 -0
  385. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js.map +1 -0
  386. package/dist/esm/rendering/webgpu/WebGpuStencilState.d.ts +14 -0
  387. package/dist/esm/rendering/webgpu/WebGpuStencilState.js +36 -0
  388. package/dist/esm/rendering/webgpu/WebGpuStencilState.js.map +1 -0
  389. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.d.ts +70 -0
  390. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js +775 -0
  391. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js.map +1 -0
  392. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts +16 -0
  393. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js +57 -0
  394. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js.map +1 -0
  395. package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js +96 -0
  396. package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js.map +1 -0
  397. package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js +68 -0
  398. package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js.map +1 -0
  399. package/dist/esm/resources/Asset.d.ts +23 -0
  400. package/dist/esm/resources/Asset.js +23 -0
  401. package/dist/esm/resources/Asset.js.map +1 -0
  402. package/dist/esm/resources/AssetDefinitions.d.ts +137 -0
  403. package/dist/esm/resources/Assets.d.ts +35 -0
  404. package/dist/esm/resources/Assets.js +32 -0
  405. package/dist/esm/resources/Assets.js.map +1 -0
  406. package/dist/esm/resources/IndexedDbDatabase.js +17 -1
  407. package/dist/esm/resources/IndexedDbDatabase.js.map +1 -1
  408. package/dist/esm/resources/IndexedDbStore.js +17 -1
  409. package/dist/esm/resources/IndexedDbStore.js.map +1 -1
  410. package/dist/esm/resources/JsonStore.d.ts +18 -0
  411. package/dist/esm/resources/JsonStore.js +62 -0
  412. package/dist/esm/resources/JsonStore.js.map +1 -0
  413. package/dist/esm/resources/Loader.d.ts +244 -18
  414. package/dist/esm/resources/Loader.js +456 -50
  415. package/dist/esm/resources/Loader.js.map +1 -1
  416. package/dist/esm/resources/LoadingQueue.d.ts +28 -0
  417. package/dist/esm/resources/LoadingQueue.js +59 -0
  418. package/dist/esm/resources/LoadingQueue.js.map +1 -0
  419. package/dist/esm/resources/factories/BmFontFactory.d.ts +25 -0
  420. package/dist/esm/resources/factories/BmFontFactory.js +96 -0
  421. package/dist/esm/resources/factories/BmFontFactory.js.map +1 -0
  422. package/dist/esm/resources/factories/CsvFactory.d.ts +35 -0
  423. package/dist/esm/resources/factories/CsvFactory.js +87 -0
  424. package/dist/esm/resources/factories/CsvFactory.js.map +1 -0
  425. package/dist/esm/resources/factories/ImageFactory.d.ts +14 -8
  426. package/dist/esm/resources/factories/ImageFactory.js +13 -6
  427. package/dist/esm/resources/factories/ImageFactory.js.map +1 -1
  428. package/dist/esm/resources/factories/MusicFactory.d.ts +8 -2
  429. package/dist/esm/resources/factories/MusicFactory.js +25 -14
  430. package/dist/esm/resources/factories/MusicFactory.js.map +1 -1
  431. package/dist/esm/resources/factories/SoundFactory.d.ts +2 -2
  432. package/dist/esm/resources/factories/SoundFactory.js.map +1 -1
  433. package/dist/esm/resources/factories/SubtitleFactory.d.ts +28 -0
  434. package/dist/esm/resources/factories/SubtitleFactory.js +203 -0
  435. package/dist/esm/resources/factories/SubtitleFactory.js.map +1 -0
  436. package/dist/esm/resources/factories/SvgFactory.d.ts +18 -1
  437. package/dist/esm/resources/factories/SvgFactory.js +21 -2
  438. package/dist/esm/resources/factories/SvgFactory.js.map +1 -1
  439. package/dist/esm/resources/factories/TextureFactory.d.ts +4 -4
  440. package/dist/esm/resources/factories/TextureFactory.js +8 -4
  441. package/dist/esm/resources/factories/TextureFactory.js.map +1 -1
  442. package/dist/esm/resources/factories/VideoFactory.d.ts +8 -2
  443. package/dist/esm/resources/factories/VideoFactory.js +27 -20
  444. package/dist/esm/resources/factories/VideoFactory.js.map +1 -1
  445. package/dist/esm/resources/factories/XmlFactory.d.ts +24 -0
  446. package/dist/esm/resources/factories/XmlFactory.js +37 -0
  447. package/dist/esm/resources/factories/XmlFactory.js.map +1 -0
  448. package/dist/esm/resources/index.d.ts +9 -1
  449. package/dist/esm/resources/tokens.d.ts +49 -3
  450. package/dist/esm/resources/tokens.js +50 -4
  451. package/dist/esm/resources/tokens.js.map +1 -1
  452. package/dist/exo.esm.js +15382 -8078
  453. package/dist/exo.esm.js.map +1 -1
  454. package/package.json +34 -16
  455. package/dist/esm/input/interaction-hooks.d.ts +0 -34
  456. package/dist/esm/input/interaction-hooks.js +0 -35
  457. package/dist/esm/input/interaction-hooks.js.map +0 -1
  458. package/dist/esm/particles/distributions/Gradient.js.map +0 -1
  459. package/dist/esm/rendering/mesh/MeshShader.js.map +0 -1
  460. package/dist/esm/rendering/text/DynamicGlyphAtlas.d.ts +0 -33
  461. package/dist/esm/rendering/text/DynamicGlyphAtlas.js +0 -134
  462. package/dist/esm/rendering/text/DynamicGlyphAtlas.js.map +0 -1
  463. package/dist/esm/rendering/text/atlas-singleton.d.ts +0 -7
  464. package/dist/esm/rendering/text/atlas-singleton.js +0 -17
  465. package/dist/esm/rendering/text/atlas-singleton.js.map +0 -1
  466. package/dist/esm/resources/factories/VttFactory.d.ts +0 -24
  467. package/dist/esm/resources/factories/VttFactory.js +0 -158
  468. package/dist/esm/resources/factories/VttFactory.js.map +0 -1
  469. package/dist/esm/vendor/webgl-debug.js +0 -1160
  470. package/dist/esm/vendor/webgl-debug.js.map +0 -1
@@ -0,0 +1,49 @@
1
+ import { Drawable } from '../Drawable.js';
2
+
3
+ /**
4
+ * Base class for all text rendering nodes. Provides the common `text`
5
+ * property and the on-demand dirty protocol used by the renderer.
6
+ *
7
+ * Subclasses:
8
+ * - {@link Text} — runtime Canvas 2D / SDF rasterization
9
+ * - {@link BitmapText} — offline pre-built atlas (BMFont / MSDF)
10
+ */
11
+ class AbstractText extends Drawable {
12
+ _text;
13
+ constructor(text) {
14
+ super();
15
+ this._text = text;
16
+ }
17
+ /** The string currently displayed by this node. */
18
+ get text() {
19
+ return this._text;
20
+ }
21
+ /**
22
+ * Pixel dimensions of the laid-out text block in local space.
23
+ * Used by the renderer to compute normalized gradient UVs.
24
+ */
25
+ get textBounds() {
26
+ return { width: 0, height: 0 };
27
+ }
28
+ /**
29
+ * Consume any pending style mutations and apply them synchronously.
30
+ *
31
+ * The renderer calls this automatically before each draw, so manual
32
+ * calls are only needed when you require up-to-date geometry outside
33
+ * of a render pass (e.g. to measure bounds right after a style change).
34
+ */
35
+ // eslint-disable-next-line @typescript-eslint/no-empty-function -- intentional no-op; subclasses override
36
+ syncDirty() { }
37
+ /**
38
+ * Advance the node by `dt` milliseconds.
39
+ *
40
+ * Delegates to {@link syncDirty} — kept for manual game-loop patterns,
41
+ * but no longer required; the renderer applies pending changes automatically.
42
+ */
43
+ update(_dt) {
44
+ this.syncDirty();
45
+ }
46
+ }
47
+
48
+ export { AbstractText };
49
+ //# sourceMappingURL=AbstractText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractText.js","sources":["../../../../../src/rendering/text/AbstractText.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAIA;;;;;;;AAOG;AACG,MAAgB,YAAa,SAAQ,QAAQ,CAAA;AACvC,IAAA,KAAK;AAEf,IAAA,WAAA,CAAmB,IAAY,EAAA;AAC7B,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;IACnB;;AAGA,IAAA,IAAW,IAAI,GAAA;QACb,OAAO,IAAI,CAAC,KAAK;IACnB;AAEA;;;AAGG;AACH,IAAA,IAAW,UAAU,GAAA;QACnB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;IAChC;AAEA;;;;;;AAMG;;AAEI,IAAA,SAAS,KAAU;AAE1B;;;;;AAKG;AACI,IAAA,MAAM,CAAC,GAAW,EAAA;QACvB,IAAI,CAAC,SAAS,EAAE;IAClB;AACD;;;;"}
@@ -0,0 +1,97 @@
1
+ import type { Texture } from '@/rendering/texture/Texture';
2
+ import { AbstractText } from './AbstractText';
3
+ import type { BmFontData } from './BmFont';
4
+ import { type BmFont } from './BmFont';
5
+ import type { LayoutOptions } from './LayoutOptions';
6
+ import type { TextStyleOptions } from './TextStyle';
7
+ import { TextStyle } from './TextStyle';
8
+ import type { GlyphInfo, GlyphProvider, TextPageQuads, TextSize } from './types';
9
+ export type { BmFontChar, BmFontData } from './BmFont';
10
+ export interface BitmapTextOptions extends TextStyleOptions {
11
+ /** Scale applied uniformly to all glyph metrics. Defaults to 1. */
12
+ scale?: number;
13
+ /**
14
+ * Set to `true` if the atlas was produced by `msdf-atlas-gen` (MSDF).
15
+ * Selects the `text-msdf` shader which applies the median SDF formula.
16
+ * Defaults to `false` (colour/RGBA atlas).
17
+ */
18
+ msdf?: boolean;
19
+ /** Layout options forwarded to the text layout engine. */
20
+ layout?: LayoutOptions;
21
+ }
22
+ /**
23
+ * Adapts {@link BmFontData} to the {@link GlyphProvider} interface consumed
24
+ * by {@link layoutText}.
25
+ *
26
+ * - `getGlyph()` maps BMFont metrics to {@link GlyphInfo} using bearings that
27
+ * place each glyph correctly relative to its line's Y origin.
28
+ * - `getKerning()` looks up the BMFont kerning table.
29
+ *
30
+ * @internal
31
+ */
32
+ export declare class BmFontAdapter implements GlyphProvider {
33
+ private readonly _fontData;
34
+ private readonly _textures;
35
+ private readonly _scale;
36
+ /** Fallback advance for characters not present in the font (≈ ½ line height). */
37
+ private readonly _fallbackAdvance;
38
+ constructor(fontData: BmFontData, textures: readonly Texture[], scale: number);
39
+ getGlyph(char: string, _fontSize: number): GlyphInfo;
40
+ getKerning(prev: string, next: string, _fontSize: number): number;
41
+ }
42
+ /**
43
+ * Text node that renders from an offline-generated atlas — either a BMFont
44
+ * (AngelCode .fnt + .png) or an MSDF atlas (msdf-atlas-gen + .json).
45
+ *
46
+ * The atlas is pre-built so there is no runtime Canvas 2D rasterisation.
47
+ * All layout features (alignment, word-wrap, justify, leading, breakWords,
48
+ * whiteSpace, letterSpacing) and kerning pairs from the descriptor are fully
49
+ * supported. Outline effects are handled as shader uniforms — no extra draw
50
+ * calls, no atlas rebuilds.
51
+ *
52
+ * ## Usage
53
+ *
54
+ * ```ts
55
+ * const font = await loader.load('fonts/ui.fnt'); // BmFont, no setup needed
56
+ * const label = new BitmapText('Score: 0', font, { msdf: true });
57
+ * scene.addChild(label);
58
+ *
59
+ * label.text = 'Score: 42'; // instant geometry rebuild
60
+ * label.style.align = 'center'; // immediate rebuild
61
+ * ```
62
+ * @stable
63
+ */
64
+ export declare class BitmapText extends AbstractText {
65
+ private _font;
66
+ private _fontScale;
67
+ private _msdf;
68
+ private _style;
69
+ private _layout;
70
+ /** Per-page quad geometry consumed by the text renderer. */
71
+ private _pageQuads;
72
+ private _textBounds;
73
+ private _adapter;
74
+ constructor(text: string, font: BmFont, options?: BitmapTextOptions);
75
+ get text(): string;
76
+ set text(v: string);
77
+ /** Visual style — `align`, `leading`, `fillColor`, `outlineColor` etc. */
78
+ get style(): TextStyle;
79
+ set style(v: TextStyle | TextStyleOptions);
80
+ /** Flow-control options — `maxWidth`, `letterSpacing`, `whiteSpace` etc. */
81
+ get layout(): LayoutOptions;
82
+ set layout(v: LayoutOptions);
83
+ /** Scale factor applied to all glyph metrics from the font descriptor. */
84
+ get fontScale(): number;
85
+ set fontScale(v: number);
86
+ /** `true` when the atlas was produced by `msdf-atlas-gen`. */
87
+ get msdf(): boolean;
88
+ /** Per-page quad data consumed by the text renderer. */
89
+ get pageQuads(): readonly TextPageQuads[];
90
+ get textBounds(): TextSize;
91
+ /** The page textures this node draws from. */
92
+ get textures(): readonly Texture[];
93
+ /** Replace the font and rebuild the geometry. */
94
+ setFont(font: BmFont): void;
95
+ destroy(): void;
96
+ private _rebuild;
97
+ }
@@ -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
+ }