@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
@@ -32,27 +32,38 @@ class MusicFactory extends AbstractAssetFactory {
32
32
  * load event is received.
33
33
  */
34
34
  async create(source, options = {}) {
35
- const { mimeType, loadEvent, playbackOptions } = options;
35
+ const { mimeType, loadEvent, playbackOptions, stallTimeout } = options;
36
36
  const blob = new Blob([source], { type: mimeType ?? determineMimeType(source) });
37
37
  const objectUrl = this.createObjectUrl(blob);
38
38
  return new Promise((resolve, reject) => {
39
39
  const audio = document.createElement('audio');
40
40
  this._audioElements.push(audio);
41
- const finalize = () => {
41
+ let stallTimer;
42
+ let settled = false;
43
+ const settle = (fn) => {
44
+ if (settled)
45
+ return;
46
+ settled = true;
47
+ if (stallTimer !== undefined) {
48
+ clearTimeout(stallTimer);
49
+ stallTimer = undefined;
50
+ }
42
51
  this.revokeObjectUrl(objectUrl);
52
+ fn();
43
53
  };
44
- audio.addEventListener('error', () => {
45
- finalize();
46
- reject(new Error('Error loading audio source.'));
47
- }, onceListenerOption);
48
- audio.addEventListener('abort', () => {
49
- finalize();
50
- reject(new Error('Audio loading was canceled.'));
51
- }, onceListenerOption);
52
- audio.addEventListener(loadEvent ?? 'canplaythrough', () => {
53
- finalize();
54
- resolve(new Music(audio, playbackOptions));
55
- }, onceListenerOption);
54
+ audio.addEventListener('error', () => settle(() => reject(new Error('Error loading audio source.'))), onceListenerOption);
55
+ audio.addEventListener('abort', () => settle(() => reject(new Error('Audio loading was canceled.'))), onceListenerOption);
56
+ audio.addEventListener('emptied', () => settle(() => reject(new Error('Audio loading was emptied.'))), onceListenerOption);
57
+ audio.addEventListener(loadEvent ?? 'canplaythrough', () => settle(() => resolve(new Music(audio, playbackOptions))), onceListenerOption);
58
+ if (stallTimeout !== undefined) {
59
+ audio.addEventListener('stalled', () => {
60
+ if (settled)
61
+ return;
62
+ if (stallTimer !== undefined)
63
+ clearTimeout(stallTimer);
64
+ stallTimer = setTimeout(() => settle(() => reject(new Error('Audio loading stalled.'))), stallTimeout);
65
+ });
66
+ }
56
67
  audio.preload = 'auto';
57
68
  audio.src = objectUrl;
58
69
  });
@@ -1 +1 @@
1
- {"version":3,"file":"MusicFactory.js","sources":["../../../../../src/resources/factories/MusicFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAKA,MAAM,kBAAkB,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;AAiBzC;;;;;;;;;;AAUG;AACG,MAAO,YAAa,SAAQ,oBAA2B,CAAA;IAC3C,WAAW,GAAG,OAAO;IAEpB,cAAc,GAAuB,EAAE;AAExD;;;AAGG;IACI,MAAM,OAAO,CAAC,QAAkB,EAAA;AACrC,QAAA,OAAO,QAAQ,CAAC,WAAW,EAAE;IAC/B;AAEA;;;;;;AAMG;AACI,IAAA,MAAM,MAAM,CAAC,MAAmB,EAAE,UAA+B,EAAE,EAAA;QACxE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,OAAO;QACxD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;QAChF,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAE5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;YAE/B,MAAM,QAAQ,GAAG,MAAW;AAC1B,gBAAA,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;AACjC,YAAA,CAAC;AAED,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAClD,CAAC,EACD,kBAAkB,CACnB;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAClD,CAAC,EACD,kBAAkB,CACnB;YACD,KAAK,CAAC,gBAAgB,CACpB,SAAS,IAAI,gBAAgB,EAC7B,MAAK;AACH,gBAAA,QAAQ,EAAE;gBACV,OAAO,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;YAC5C,CAAC,EACD,kBAAkB,CACnB;AAED,YAAA,KAAK,CAAC,OAAO,GAAG,MAAM;AACtB,YAAA,KAAK,CAAC,GAAG,GAAG,SAAS;AACvB,QAAA,CAAC,CAAC;IACJ;AAEA;;;;AAIG;IACa,OAAO,GAAA;AACrB,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE;YACvC,KAAK,CAAC,KAAK,EAAE;AACb,YAAA,KAAK,CAAC,GAAG,GAAG,EAAE;YACd,KAAK,CAAC,IAAI,EAAE;QACd;AACA,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;QAC9B,KAAK,CAAC,OAAO,EAAE;IACjB;AACD;;;;"}
1
+ {"version":3,"file":"MusicFactory.js","sources":["../../../../../src/resources/factories/MusicFactory.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import { type AudioSpriteClip, Sound } from '@/audio/Sound';
2
2
  import type { PlaybackOptions } from '@/core/types';
3
3
  import { AbstractAssetFactory } from '@/resources/AbstractAssetFactory';
4
- interface SoundFactoryOptions {
4
+ /** Construction options for {@link SoundFactory.create}. */
5
+ export interface SoundFactoryOptions {
5
6
  /** Initial playback settings forwarded to the {@link Sound} instance. */
6
7
  playbackOptions?: Partial<PlaybackOptions>;
7
8
  /**
@@ -40,4 +41,3 @@ export declare class SoundFactory extends AbstractAssetFactory<Sound> {
40
41
  */
41
42
  create(source: ArrayBuffer, options?: SoundFactoryOptions): Promise<Sound>;
42
43
  }
43
- export {};
@@ -1 +1 @@
1
- {"version":3,"file":"SoundFactory.js","sources":["../../../../../src/resources/factories/SoundFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAsBA;;;;;;;;;AASG;AACG,MAAO,YAAa,SAAQ,oBAA2B,CAAA;IAC3C,WAAW,GAAG,OAAO;AAErC;;;AAGG;IACI,MAAM,OAAO,CAAC,QAAkB,EAAA;AACrC,QAAA,OAAO,QAAQ,CAAC,WAAW,EAAE;IAC/B;AAEA;;;AAGG;AACI,IAAA,MAAM,MAAM,CAAC,MAAmB,EAAE,UAA+B,EAAE,EAAA;AACxE,QAAA,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC;AAEjD,QAAA,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE;YACnC,GAAG,OAAO,CAAC,eAAe;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;AACzB,SAAA,CAAC;AAEF,QAAA,OAAO,KAAK;IACd;AACD;;;;"}
1
+ {"version":3,"file":"SoundFactory.js","sources":["../../../../../src/resources/factories/SoundFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAuBA;;;;;;;;;AASG;AACG,MAAO,YAAa,SAAQ,oBAA2B,CAAA;IAC3C,WAAW,GAAG,OAAO;AAErC;;;AAGG;IACI,MAAM,OAAO,CAAC,QAAkB,EAAA;AACrC,QAAA,OAAO,QAAQ,CAAC,WAAW,EAAE;IAC/B;AAEA;;;AAGG;AACI,IAAA,MAAM,MAAM,CAAC,MAAmB,EAAE,UAA+B,EAAE,EAAA;AACxE,QAAA,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC;AAEjD,QAAA,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE;YACnC,GAAG,OAAO,CAAC,eAAe;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;AACzB,SAAA,CAAC;AAEF,QAAA,OAAO,KAAK;IACd;AACD;;;;"}
@@ -0,0 +1,28 @@
1
+ import { AbstractAssetFactory } from '@/resources/AbstractAssetFactory';
2
+ type SubtitleFormat = 'vtt' | 'srt';
3
+ interface SubtitleIntermediate {
4
+ fmt: SubtitleFormat;
5
+ text: string;
6
+ }
7
+ /**
8
+ * {@link AssetFactory} implementation that parses WebVTT (`.vtt`) and SubRip
9
+ * (`.srt`) subtitle files and produces an array of {@link VTTCue} instances.
10
+ *
11
+ * Format is detected from the file extension of the response URL; unknown
12
+ * extensions default to VTT parsing. VTT cue settings (`align`, `line`,
13
+ * `position`, `size`, `vertical`) are applied; SRT cues retain default
14
+ * positional properties.
15
+ */
16
+ export declare class SubtitleFactory extends AbstractAssetFactory<VTTCue[]> {
17
+ readonly storageName = "subtitle";
18
+ /**
19
+ * Reads the response body as UTF-8 text and records the subtitle format
20
+ * derived from the response URL's file extension.
21
+ */
22
+ process(response: Response): Promise<SubtitleIntermediate>;
23
+ /**
24
+ * Parses the subtitle text into an ordered array of {@link VTTCue} instances.
25
+ */
26
+ create(source: SubtitleIntermediate): Promise<VTTCue[]>;
27
+ }
28
+ export {};
@@ -0,0 +1,203 @@
1
+ import { AbstractAssetFactory } from '../AbstractAssetFactory.js';
2
+
3
+ // ---------------------------------------------------------------------------
4
+ // VTT helpers
5
+ // ---------------------------------------------------------------------------
6
+ /**
7
+ * Converts a WebVTT timestamp string (`HH:MM:SS.mmm`, `MM:SS.mmm`, or
8
+ * `SS.mmm`) into a floating-point number of seconds.
9
+ *
10
+ * @internal
11
+ */
12
+ const parseVttTimestamp = (value) => {
13
+ const parts = value.split(':');
14
+ let seconds;
15
+ if (parts.length === 3) {
16
+ seconds = Number(parts[0]) * 3600 + Number(parts[1]) * 60 + Number(parts[2]);
17
+ }
18
+ else if (parts.length === 2) {
19
+ seconds = Number(parts[0]) * 60 + Number(parts[1]);
20
+ }
21
+ else {
22
+ seconds = Number(parts[0]);
23
+ }
24
+ return seconds;
25
+ };
26
+ const validAlignValues = new Set(['start', 'center', 'end', 'left', 'right']);
27
+ const validLineAlignValues = new Set(['start', 'center', 'end']);
28
+ const validPositionAlignValues = new Set(['auto', 'line-left', 'center', 'line-right']);
29
+ /**
30
+ * Parses the WebVTT cue-settings tail (`align:center line:80% position:50%`)
31
+ * and applies each recognized setting to the supplied {@link VTTCue}.
32
+ *
33
+ * Unknown keys, malformed values, and unknown enum members are silently
34
+ * skipped so that one bad token does not invalidate an otherwise valid cue.
35
+ * Percent signs on numeric values are tolerated and stripped.
36
+ *
37
+ * @internal
38
+ */
39
+ const applyCueSettings = (cue, settings) => {
40
+ if (!settings) {
41
+ return;
42
+ }
43
+ for (const token of settings.split(/\s+/)) {
44
+ const colonIndex = token.indexOf(':');
45
+ if (colonIndex === -1) {
46
+ continue;
47
+ }
48
+ const name = token.slice(0, colonIndex);
49
+ const value = token.slice(colonIndex + 1);
50
+ switch (name) {
51
+ case 'vertical':
52
+ if (value === 'rl' || value === 'lr' || value === '') {
53
+ cue.vertical = value;
54
+ }
55
+ break;
56
+ case 'line': {
57
+ if (value === 'auto') {
58
+ cue.line = 'auto';
59
+ }
60
+ else {
61
+ const [linePart, alignPart] = value.split(',');
62
+ const num = parseFloat(linePart);
63
+ if (!Number.isNaN(num)) {
64
+ cue.line = num;
65
+ }
66
+ if (alignPart !== undefined && validLineAlignValues.has(alignPart)) {
67
+ cue.lineAlign = alignPart;
68
+ }
69
+ }
70
+ break;
71
+ }
72
+ case 'position': {
73
+ const [posPart, alignPart] = value.split(',');
74
+ const num = parseFloat(posPart);
75
+ if (!Number.isNaN(num)) {
76
+ cue.position = num;
77
+ }
78
+ if (alignPart !== undefined && validPositionAlignValues.has(alignPart)) {
79
+ cue.positionAlign = alignPart;
80
+ }
81
+ break;
82
+ }
83
+ case 'size': {
84
+ const num = parseFloat(value);
85
+ if (!Number.isNaN(num)) {
86
+ cue.size = num;
87
+ }
88
+ break;
89
+ }
90
+ case 'align':
91
+ if (validAlignValues.has(value)) {
92
+ cue.align = value;
93
+ }
94
+ break;
95
+ }
96
+ }
97
+ };
98
+ const parseVtt = (source) => {
99
+ const cues = [];
100
+ const lines = source.replaceAll('\r\n', '\n').replaceAll('\r', '\n').split('\n');
101
+ let i = 0;
102
+ // Skip header and any blank lines/metadata before first cue
103
+ while (i < lines.length && !lines[i].includes('-->')) {
104
+ i++;
105
+ }
106
+ while (i < lines.length) {
107
+ const line = lines[i].trim();
108
+ if (line.includes('-->')) {
109
+ const arrowIndex = line.indexOf('-->');
110
+ const startString = line.slice(0, arrowIndex).trim();
111
+ const rest = line.slice(arrowIndex + 3).trim();
112
+ const restTokens = rest.split(/\s+/);
113
+ const endString = restTokens[0];
114
+ const settingsString = restTokens.slice(1).join(' ');
115
+ const start = parseVttTimestamp(startString);
116
+ const end = parseVttTimestamp(endString);
117
+ i++;
118
+ const textLines = [];
119
+ while (i < lines.length && lines[i].trim() !== '') {
120
+ textLines.push(lines[i]);
121
+ i++;
122
+ }
123
+ const cue = new VTTCue(start, end, textLines.join('\n'));
124
+ applyCueSettings(cue, settingsString);
125
+ cues.push(cue);
126
+ }
127
+ else {
128
+ i++;
129
+ }
130
+ }
131
+ return cues;
132
+ };
133
+ // ---------------------------------------------------------------------------
134
+ // SRT helpers
135
+ // ---------------------------------------------------------------------------
136
+ /**
137
+ * Converts an SRT timestamp string (`HH:MM:SS,mmm`) into a floating-point
138
+ * number of seconds.
139
+ *
140
+ * @internal
141
+ */
142
+ const parseSrtTimestamp = (value) => {
143
+ const normalized = value.trim().replace(',', '.');
144
+ const parts = normalized.split(':');
145
+ return Number(parts[0]) * 3600 + Number(parts[1]) * 60 + Number(parts[2]);
146
+ };
147
+ const parseSrt = (source) => {
148
+ const cues = [];
149
+ const normalized = source.replaceAll('\r\n', '\n').replaceAll('\r', '\n');
150
+ const blocks = normalized.split(/\n[ \t]*\n/);
151
+ for (const block of blocks) {
152
+ const lines = block.trim().split('\n');
153
+ if (lines.length < 2)
154
+ continue;
155
+ let timingIndex = 0;
156
+ if (/^\d+$/.test(lines[0].trim())) {
157
+ timingIndex = 1;
158
+ }
159
+ const timingLine = lines[timingIndex];
160
+ if (!timingLine?.includes('-->'))
161
+ continue;
162
+ const arrowIndex = timingLine.indexOf('-->');
163
+ const start = parseSrtTimestamp(timingLine.slice(0, arrowIndex));
164
+ const end = parseSrtTimestamp(timingLine.slice(arrowIndex + 3));
165
+ const text = lines.slice(timingIndex + 1).join('\n');
166
+ cues.push(new VTTCue(start, end, text));
167
+ }
168
+ return cues;
169
+ };
170
+ // ---------------------------------------------------------------------------
171
+ // Factory
172
+ // ---------------------------------------------------------------------------
173
+ /**
174
+ * {@link AssetFactory} implementation that parses WebVTT (`.vtt`) and SubRip
175
+ * (`.srt`) subtitle files and produces an array of {@link VTTCue} instances.
176
+ *
177
+ * Format is detected from the file extension of the response URL; unknown
178
+ * extensions default to VTT parsing. VTT cue settings (`align`, `line`,
179
+ * `position`, `size`, `vertical`) are applied; SRT cues retain default
180
+ * positional properties.
181
+ */
182
+ class SubtitleFactory extends AbstractAssetFactory {
183
+ storageName = 'subtitle';
184
+ /**
185
+ * Reads the response body as UTF-8 text and records the subtitle format
186
+ * derived from the response URL's file extension.
187
+ */
188
+ async process(response) {
189
+ const text = await response.text();
190
+ const url = response.url.split('?')[0].toLowerCase();
191
+ const fmt = url.endsWith('.srt') ? 'srt' : 'vtt';
192
+ return { fmt, text };
193
+ }
194
+ /**
195
+ * Parses the subtitle text into an ordered array of {@link VTTCue} instances.
196
+ */
197
+ async create(source) {
198
+ return source.fmt === 'srt' ? parseSrt(source.text) : parseVtt(source.text);
199
+ }
200
+ }
201
+
202
+ export { SubtitleFactory };
203
+ //# sourceMappingURL=SubtitleFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubtitleFactory.js","sources":["../../../../../src/resources/factories/SubtitleFactory.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -1,4 +1,18 @@
1
1
  import { AbstractAssetFactory } from '@/resources/AbstractAssetFactory';
2
+ /** Construction options for {@link SvgFactory.create}. */
3
+ export interface SvgFactoryOptions {
4
+ /**
5
+ * Target render width in pixels. When provided, the value is injected into
6
+ * the root `<svg>` element's `width` attribute before the browser rasterises
7
+ * the image, overriding any intrinsic width declared in the file.
8
+ *
9
+ * SVGs that carry only a `viewBox` (no `width`/`height` attributes) render
10
+ * as a 0×0 image by default; supplying `width` and `height` here fixes that.
11
+ */
12
+ width?: number;
13
+ /** Target render height in pixels. See {@link width}. */
14
+ height?: number;
15
+ }
2
16
  /**
3
17
  * {@link AssetFactory} implementation that loads SVG markup and produces a
4
18
  * rasterised {@link HTMLImageElement}.
@@ -17,9 +31,12 @@ export declare class SvgFactory extends AbstractAssetFactory<HTMLImageElement> {
17
31
  /**
18
32
  * Renders the SVG markup into a fully loaded {@link HTMLImageElement}.
19
33
  *
34
+ * When `options.width` or `options.height` are provided, the values are
35
+ * injected into the root `<svg>` element before rasterisation so the browser
36
+ * renders at the requested pixel dimensions rather than the intrinsic size.
20
37
  * Creates a temporary `image/svg+xml` object URL, assigns it to an `<img>`
21
38
  * element, and revokes the URL once loading settles. Rejects on load error
22
39
  * or abort.
23
40
  */
24
- create(source: string): Promise<HTMLImageElement>;
41
+ create(source: string, options?: SvgFactoryOptions): Promise<HTMLImageElement>;
25
42
  }
@@ -20,12 +20,31 @@ class SvgFactory extends AbstractAssetFactory {
20
20
  /**
21
21
  * Renders the SVG markup into a fully loaded {@link HTMLImageElement}.
22
22
  *
23
+ * When `options.width` or `options.height` are provided, the values are
24
+ * injected into the root `<svg>` element before rasterisation so the browser
25
+ * renders at the requested pixel dimensions rather than the intrinsic size.
23
26
  * Creates a temporary `image/svg+xml` object URL, assigns it to an `<img>`
24
27
  * element, and revokes the URL once loading settles. Rejects on load error
25
28
  * or abort.
26
29
  */
27
- async create(source) {
28
- const blob = new Blob([source], { type: 'image/svg+xml' });
30
+ async create(source, options = {}) {
31
+ const { width, height } = options;
32
+ let svgSource = source;
33
+ if (width !== undefined || height !== undefined) {
34
+ const svgStart = svgSource.indexOf('<svg');
35
+ const tagClose = svgSource.indexOf('>', svgStart);
36
+ if (svgStart !== -1 && tagClose !== -1) {
37
+ const before = svgSource.slice(0, svgStart);
38
+ const attrs = svgSource.slice(svgStart + 4, tagClose); // after '<svg', before '>'
39
+ const after = svgSource.slice(tagClose + 1);
40
+ const cleaned = String(attrs)
41
+ .replaceAll(/\s+width=(?:"[^"]*"|'[^']*')/g, '')
42
+ .replaceAll(/\s+height=(?:"[^"]*"|'[^']*')/g, '');
43
+ const additions = (width !== undefined ? ` width="${width}"` : '') + (height !== undefined ? ` height="${height}"` : '');
44
+ svgSource = `${before}<svg${cleaned}${additions}>${after}`;
45
+ }
46
+ }
47
+ const blob = new Blob([svgSource], { type: 'image/svg+xml' });
29
48
  const objectUrl = this.createObjectUrl(blob);
30
49
  return new Promise((resolve, reject) => {
31
50
  const image = new Image();
@@ -1 +1 @@
1
- {"version":3,"file":"SvgFactory.js","sources":["../../../../../src/resources/factories/SvgFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAEA;;;;;;;;AAQG;AACG,MAAO,UAAW,SAAQ,oBAAsC,CAAA;IACpD,WAAW,GAAG,KAAK;AAEnC;;AAEG;IACI,MAAM,OAAO,CAAC,QAAkB,EAAA;AACrC,QAAA,OAAO,QAAQ,CAAC,IAAI,EAAE;IACxB;AAEA;;;;;;AAMG;IACI,MAAM,MAAM,CAAC,MAAc,EAAA;AAChC,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;QAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAE5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE;YACzB,MAAM,QAAQ,GAAG,MAAW;AAC1B,gBAAA,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;AACjC,YAAA,CAAC;AAED,YAAA,KAAK,CAAC,gBAAgB,CACpB,MAAM,EACN,MAAK;AACH,gBAAA,QAAQ,EAAE;gBACV,OAAO,CAAC,KAAK,CAAC;AAChB,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAClD,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAClD,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AAED,YAAA,KAAK,CAAC,GAAG,GAAG,SAAS;AACvB,QAAA,CAAC,CAAC;IACJ;AACD;;;;"}
1
+ {"version":3,"file":"SvgFactory.js","sources":["../../../../../src/resources/factories/SvgFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAiBA;;;;;;;;AAQG;AACG,MAAO,UAAW,SAAQ,oBAAsC,CAAA;IACpD,WAAW,GAAG,KAAK;AAEnC;;AAEG;IACI,MAAM,OAAO,CAAC,QAAkB,EAAA;AACrC,QAAA,OAAO,QAAQ,CAAC,IAAI,EAAE;IACxB;AAEA;;;;;;;;;AASG;AACI,IAAA,MAAM,MAAM,CAAC,MAAc,EAAE,UAA6B,EAAE,EAAA;AACjE,QAAA,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;QACjC,IAAI,SAAS,GAAG,MAAM;QAEtB,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE;YAC/C,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;YAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC;YAEjD,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,EAAE,EAAE;gBACtC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;AAC3C,gBAAA,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACtD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;AAE3C,gBAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK;AACzB,qBAAA,UAAU,CAAC,+BAA+B,EAAE,EAAE;AAC9C,qBAAA,UAAU,CAAC,gCAAgC,EAAE,EAAE,CAAC;AACnD,gBAAA,MAAM,SAAS,GAAG,CAAC,KAAK,KAAK,SAAS,GAAG,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA,CAAG,GAAG,EAAE,KAAK,MAAM,KAAK,SAAS,GAAG,CAAA,SAAA,EAAY,MAAM,GAAG,GAAG,EAAE,CAAC;gBAExH,SAAS,GAAG,CAAA,EAAG,MAAM,CAAA,IAAA,EAAO,OAAO,GAAG,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;YAC5D;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;QAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAE5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE;YACzB,MAAM,QAAQ,GAAG,MAAW;AAC1B,gBAAA,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;AACjC,YAAA,CAAC;AAED,YAAA,KAAK,CAAC,gBAAgB,CACpB,MAAM,EACN,MAAK;AACH,gBAAA,QAAQ,EAAE;gBACV,OAAO,CAAC,KAAK,CAAC;AAChB,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAClD,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAClD,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AAED,YAAA,KAAK,CAAC,GAAG,GAAG,SAAS;AACvB,QAAA,CAAC,CAAC;IACJ;AACD;;;;"}
@@ -28,11 +28,11 @@ export declare class TextureFactory extends AbstractAssetFactory<Texture> {
28
28
  */
29
29
  process(response: Response): Promise<ArrayBuffer>;
30
30
  /**
31
- * Decodes image bytes into a fully loaded {@link HTMLImageElement} and
32
- * wraps it in a {@link Texture} with the given sampler options.
31
+ * Decodes image bytes and wraps the result in a {@link Texture}.
33
32
  *
34
- * Creates a temporary object URL, resolves when the image's `load` event
35
- * fires, and revokes the URL regardless of outcome.
33
+ * Prefers `createImageBitmap` for a zero-copy GPU-upload path. Falls back
34
+ * to a temporary object URL + `<img>` element on environments that do not
35
+ * support `createImageBitmap`.
36
36
  */
37
37
  create(source: ArrayBuffer, options?: TextureFactoryOptions): Promise<Texture>;
38
38
  }
@@ -21,15 +21,19 @@ class TextureFactory extends AbstractAssetFactory {
21
21
  return response.arrayBuffer();
22
22
  }
23
23
  /**
24
- * Decodes image bytes into a fully loaded {@link HTMLImageElement} and
25
- * wraps it in a {@link Texture} with the given sampler options.
24
+ * Decodes image bytes and wraps the result in a {@link Texture}.
26
25
  *
27
- * Creates a temporary object URL, resolves when the image's `load` event
28
- * fires, and revokes the URL regardless of outcome.
26
+ * Prefers `createImageBitmap` for a zero-copy GPU-upload path. Falls back
27
+ * to a temporary object URL + `<img>` element on environments that do not
28
+ * support `createImageBitmap`.
29
29
  */
30
30
  async create(source, options = {}) {
31
31
  const { mimeType, samplerOptions } = options;
32
32
  const blob = new Blob([source], { type: mimeType ?? determineMimeType(source) });
33
+ if (typeof createImageBitmap === 'function') {
34
+ const bitmap = await createImageBitmap(blob);
35
+ return new Texture(bitmap, samplerOptions);
36
+ }
33
37
  const objectUrl = this.createObjectUrl(blob);
34
38
  return new Promise((resolve, reject) => {
35
39
  const image = new Image();
@@ -1 +1 @@
1
- {"version":3,"file":"TextureFactory.js","sources":["../../../../../src/resources/factories/TextureFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAgBA;;;;;;;;AAQG;AACG,MAAO,cAAe,SAAQ,oBAA6B,CAAA;IAC/C,WAAW,GAAG,SAAS;AAEvC;;;AAGG;IACI,MAAM,OAAO,CAAC,QAAkB,EAAA;AACrC,QAAA,OAAO,QAAQ,CAAC,WAAW,EAAE;IAC/B;AAEA;;;;;;AAMG;AACI,IAAA,MAAM,MAAM,CAAC,MAAmB,EAAE,UAAiC,EAAE,EAAA;AAC1E,QAAA,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,OAAO;QAC5C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;QAChF,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAE5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE;YACzB,MAAM,QAAQ,GAAG,MAAW;AAC1B,gBAAA,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;AACjC,YAAA,CAAC;AAED,YAAA,KAAK,CAAC,gBAAgB,CACpB,MAAM,EACN,MAAK;AACH,gBAAA,QAAQ,EAAE;gBACV,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;AAC7C,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAClD,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAClD,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AAED,YAAA,KAAK,CAAC,GAAG,GAAG,SAAS;AACvB,QAAA,CAAC,CAAC;IACJ;AACD;;;;"}
1
+ {"version":3,"file":"TextureFactory.js","sources":["../../../../../src/resources/factories/TextureFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAgBA;;;;;;;;AAQG;AACG,MAAO,cAAe,SAAQ,oBAA6B,CAAA;IAC/C,WAAW,GAAG,SAAS;AAEvC;;;AAGG;IACI,MAAM,OAAO,CAAC,QAAkB,EAAA;AACrC,QAAA,OAAO,QAAQ,CAAC,WAAW,EAAE;IAC/B;AAEA;;;;;;AAMG;AACI,IAAA,MAAM,MAAM,CAAC,MAAmB,EAAE,UAAiC,EAAE,EAAA;AAC1E,QAAA,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,OAAO;QAC5C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;AAEhF,QAAA,IAAI,OAAO,iBAAiB,KAAK,UAAU,EAAE;AAC3C,YAAA,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC;AAC5C,YAAA,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC;QAC5C;QAEA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAE5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE;YACzB,MAAM,QAAQ,GAAG,MAAW;AAC1B,gBAAA,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;AACjC,YAAA,CAAC;AAED,YAAA,KAAK,CAAC,gBAAgB,CACpB,MAAM,EACN,MAAK;AACH,gBAAA,QAAQ,EAAE;gBACV,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;AAC7C,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAClD,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAClD,YAAA,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf;AAED,YAAA,KAAK,CAAC,GAAG,GAAG,SAAS;AACvB,QAAA,CAAC,CAAC;IACJ;AACD;;;;"}
@@ -2,7 +2,8 @@ import type { PlaybackOptions, StreamingLoadEvent } from '@/core/types';
2
2
  import type { SamplerOptions } from '@/rendering/texture/Sampler';
3
3
  import { Video } from '@/rendering/video/Video';
4
4
  import { AbstractAssetFactory } from '@/resources/AbstractAssetFactory';
5
- interface VideoFactoryOptions {
5
+ /** Construction options for {@link VideoFactory.create}. */
6
+ export interface VideoFactoryOptions {
6
7
  /**
7
8
  * MIME type for the video blob. Inferred from magic bytes when omitted.
8
9
  */
@@ -17,6 +18,12 @@ interface VideoFactoryOptions {
17
18
  playbackOptions?: Partial<PlaybackOptions>;
18
19
  /** Sampler parameters forwarded to the {@link Video} instance's texture. */
19
20
  samplerOptions?: Partial<SamplerOptions>;
21
+ /**
22
+ * Milliseconds to wait after a `stalled` event before rejecting the load
23
+ * promise. When omitted no timeout is applied and a stalled load will wait
24
+ * indefinitely. Each subsequent `stalled` event resets the timer.
25
+ */
26
+ stallTimeout?: number;
20
27
  }
21
28
  /**
22
29
  * {@link AssetFactory} implementation that loads video files (MP4, WebM, OGG,
@@ -52,4 +59,3 @@ export declare class VideoFactory extends AbstractAssetFactory<Video> {
52
59
  */
53
60
  destroy(): void;
54
61
  }
55
- export {};
@@ -32,33 +32,40 @@ class VideoFactory extends AbstractAssetFactory {
32
32
  * load event is received.
33
33
  */
34
34
  async create(source, options = {}) {
35
- const { mimeType, loadEvent, playbackOptions, samplerOptions } = options;
35
+ const { mimeType, loadEvent, playbackOptions, samplerOptions, stallTimeout } = options;
36
36
  const blob = new Blob([source], { type: mimeType ?? determineMimeType(source) });
37
37
  const objectUrl = this.createObjectUrl(blob);
38
38
  return new Promise((resolve, reject) => {
39
39
  const video = document.createElement('video');
40
40
  this._videoElements.push(video);
41
- const finalize = () => {
41
+ let stallTimer;
42
+ let settled = false;
43
+ const settle = (fn) => {
44
+ if (settled)
45
+ return;
46
+ settled = true;
47
+ if (stallTimer !== undefined) {
48
+ clearTimeout(stallTimer);
49
+ stallTimer = undefined;
50
+ }
42
51
  this.revokeObjectUrl(objectUrl);
52
+ fn();
43
53
  };
44
- video.addEventListener('error', () => {
45
- finalize();
46
- reject(new Error('Video loading error.'));
47
- }, onceListenerOption);
48
- video.addEventListener('abort', () => {
49
- finalize();
50
- reject(new Error('Video loading error: cancelled.'));
51
- }, onceListenerOption);
52
- video.addEventListener('emptied', () => {
53
- finalize();
54
- reject(new Error('Video loading error: emptied.'));
55
- }, onceListenerOption);
56
- // 'stalled' is intentionally omitted: it fires transiently during normal buffering
57
- // and would cause spurious rejections for large files on slow connections.
58
- video.addEventListener(loadEvent ?? 'canplaythrough', () => {
59
- finalize();
60
- resolve(new Video(video, playbackOptions, samplerOptions));
61
- }, onceListenerOption);
54
+ video.addEventListener('error', () => settle(() => reject(new Error('Video loading error.'))), onceListenerOption);
55
+ video.addEventListener('abort', () => settle(() => reject(new Error('Video loading error: cancelled.'))), onceListenerOption);
56
+ video.addEventListener('emptied', () => settle(() => reject(new Error('Video loading error: emptied.'))), onceListenerOption);
57
+ video.addEventListener(loadEvent ?? 'canplaythrough', () => settle(() => resolve(new Video(video, playbackOptions, samplerOptions))), onceListenerOption);
58
+ // 'stalled' fires transiently during normal buffering on slow connections and is not
59
+ // treated as an error by default. Supply stallTimeout to reject after a stall persists.
60
+ if (stallTimeout !== undefined) {
61
+ video.addEventListener('stalled', () => {
62
+ if (settled)
63
+ return;
64
+ if (stallTimer !== undefined)
65
+ clearTimeout(stallTimer);
66
+ stallTimer = setTimeout(() => settle(() => reject(new Error('Video loading stalled.'))), stallTimeout);
67
+ });
68
+ }
62
69
  video.preload = 'auto';
63
70
  video.src = objectUrl;
64
71
  });
@@ -1 +1 @@
1
- {"version":3,"file":"VideoFactory.js","sources":["../../../../../src/resources/factories/VideoFactory.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAMA,MAAM,kBAAkB,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;AAmBzC;;;;;;;;;;AAUG;AACG,MAAO,YAAa,SAAQ,oBAA2B,CAAA;IAC3C,WAAW,GAAG,OAAO;IAEpB,cAAc,GAAuB,EAAE;AAExD;;;AAGG;IACI,MAAM,OAAO,CAAC,QAAkB,EAAA;AACrC,QAAA,OAAO,QAAQ,CAAC,WAAW,EAAE;IAC/B;AAEA;;;;;;AAMG;AACI,IAAA,MAAM,MAAM,CAAC,MAAmB,EAAE,UAA+B,EAAE,EAAA;QACxE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,OAAO;QACxE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;QAChF,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAE5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;YAE/B,MAAM,QAAQ,GAAG,MAAW;AAC1B,gBAAA,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;AACjC,YAAA,CAAC;AAED,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC3C,CAAC,EACD,kBAAkB,CACnB;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,OAAO,EACP,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACtD,CAAC,EACD,kBAAkB,CACnB;AACD,YAAA,KAAK,CAAC,gBAAgB,CACpB,SAAS,EACT,MAAK;AACH,gBAAA,QAAQ,EAAE;AACV,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACpD,CAAC,EACD,kBAAkB,CACnB;;;YAGD,KAAK,CAAC,gBAAgB,CACpB,SAAS,IAAI,gBAAgB,EAC7B,MAAK;AACH,gBAAA,QAAQ,EAAE;gBACV,OAAO,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;YAC5D,CAAC,EACD,kBAAkB,CACnB;AAED,YAAA,KAAK,CAAC,OAAO,GAAG,MAAM;AACtB,YAAA,KAAK,CAAC,GAAG,GAAG,SAAS;AACvB,QAAA,CAAC,CAAC;IACJ;AAEA;;;;AAIG;IACa,OAAO,GAAA;AACrB,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE;YACvC,KAAK,CAAC,KAAK,EAAE;AACb,YAAA,KAAK,CAAC,GAAG,GAAG,EAAE;YACd,KAAK,CAAC,IAAI,EAAE;QACd;AACA,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;QAC9B,KAAK,CAAC,OAAO,EAAE;IACjB;AACD;;;;"}
1
+ {"version":3,"file":"VideoFactory.js","sources":["../../../../../src/resources/factories/VideoFactory.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { AbstractAssetFactory } from '@/resources/AbstractAssetFactory';
2
+ /**
3
+ * {@link AssetFactory} implementation that loads XML files and produces a
4
+ * parsed {@link Document} via the browser's built-in {@link DOMParser}.
5
+ *
6
+ * Throws if the response body is not well-formed XML. Use the returned
7
+ * `Document` directly with standard DOM APIs — `doc.querySelector`,
8
+ * `doc.getElementsByTagName`, etc. — or pass it to a format-specific parser
9
+ * (e.g. for Tiled TMX, BMFont, or TexturePacker XML atlas files).
10
+ */
11
+ export declare class XmlFactory extends AbstractAssetFactory<Document> {
12
+ readonly storageName = "xml";
13
+ /**
14
+ * Reads the response body as a UTF-8 string containing the raw XML markup.
15
+ */
16
+ process(response: Response): Promise<string>;
17
+ /**
18
+ * Parses the XML string into a {@link Document}.
19
+ *
20
+ * Throws if the browser's DOMParser reports a parse error (indicated by a
21
+ * `<parsererror>` element in the returned document).
22
+ */
23
+ create(source: string): Promise<Document>;
24
+ }
@@ -0,0 +1,37 @@
1
+ import { AbstractAssetFactory } from '../AbstractAssetFactory.js';
2
+
3
+ /**
4
+ * {@link AssetFactory} implementation that loads XML files and produces a
5
+ * parsed {@link Document} via the browser's built-in {@link DOMParser}.
6
+ *
7
+ * Throws if the response body is not well-formed XML. Use the returned
8
+ * `Document` directly with standard DOM APIs — `doc.querySelector`,
9
+ * `doc.getElementsByTagName`, etc. — or pass it to a format-specific parser
10
+ * (e.g. for Tiled TMX, BMFont, or TexturePacker XML atlas files).
11
+ */
12
+ class XmlFactory extends AbstractAssetFactory {
13
+ storageName = 'xml';
14
+ /**
15
+ * Reads the response body as a UTF-8 string containing the raw XML markup.
16
+ */
17
+ async process(response) {
18
+ return response.text();
19
+ }
20
+ /**
21
+ * Parses the XML string into a {@link Document}.
22
+ *
23
+ * Throws if the browser's DOMParser reports a parse error (indicated by a
24
+ * `<parsererror>` element in the returned document).
25
+ */
26
+ async create(source) {
27
+ const doc = new DOMParser().parseFromString(source, 'text/xml');
28
+ const parseError = doc.querySelector('parsererror');
29
+ if (parseError) {
30
+ throw new Error(`XML parse error: ${parseError.textContent.trim() || 'unknown error'}`);
31
+ }
32
+ return doc;
33
+ }
34
+ }
35
+
36
+ export { XmlFactory };
37
+ //# sourceMappingURL=XmlFactory.js.map