@codexo/exojs 0.12.0 → 0.14.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 (759) hide show
  1. package/CHANGELOG.md +258 -6
  2. package/README.md +80 -63
  3. package/dist/esm/animation/Tween.js +1 -1
  4. package/dist/esm/animation/Tween.js.map +1 -1
  5. package/dist/esm/animation/TweenManager.d.ts +9 -5
  6. package/dist/esm/animation/TweenManager.d.ts.map +1 -1
  7. package/dist/esm/animation/TweenManager.js +14 -8
  8. package/dist/esm/animation/TweenManager.js.map +1 -1
  9. package/dist/esm/animation/index.d.ts +6 -4
  10. package/dist/esm/animation/index.d.ts.map +1 -1
  11. package/dist/esm/audio/AudioBus.d.ts +12 -12
  12. package/dist/esm/audio/AudioBus.js +29 -29
  13. package/dist/esm/audio/AudioEffect.d.ts +18 -0
  14. package/dist/esm/audio/AudioEffect.d.ts.map +1 -0
  15. package/dist/esm/audio/AudioEffect.js +16 -0
  16. package/dist/esm/audio/AudioEffect.js.map +1 -0
  17. package/dist/esm/audio/AudioGenerator.d.ts +91 -0
  18. package/dist/esm/audio/AudioGenerator.d.ts.map +1 -0
  19. package/dist/esm/audio/AudioGenerator.js +165 -0
  20. package/dist/esm/audio/AudioGenerator.js.map +1 -0
  21. package/dist/esm/audio/AudioGeneratorVoice.d.ts +52 -0
  22. package/dist/esm/audio/AudioGeneratorVoice.d.ts.map +1 -0
  23. package/dist/esm/audio/AudioGeneratorVoice.js +141 -0
  24. package/dist/esm/audio/AudioGeneratorVoice.js.map +1 -0
  25. package/dist/esm/audio/AudioInput.d.ts +39 -0
  26. package/dist/esm/audio/AudioInput.d.ts.map +1 -0
  27. package/dist/esm/audio/AudioInput.js +53 -0
  28. package/dist/esm/audio/AudioInput.js.map +1 -0
  29. package/dist/esm/audio/AudioManager.d.ts +72 -34
  30. package/dist/esm/audio/AudioManager.d.ts.map +1 -1
  31. package/dist/esm/audio/AudioManager.js +97 -51
  32. package/dist/esm/audio/AudioManager.js.map +1 -1
  33. package/dist/esm/audio/AudioStream.d.ts +49 -0
  34. package/dist/esm/audio/AudioStream.d.ts.map +1 -0
  35. package/dist/esm/audio/AudioStream.js +109 -0
  36. package/dist/esm/audio/AudioStream.js.map +1 -0
  37. package/dist/esm/audio/AudioStreamVoice.d.ts +61 -0
  38. package/dist/esm/audio/AudioStreamVoice.d.ts.map +1 -0
  39. package/dist/esm/audio/AudioStreamVoice.js +137 -0
  40. package/dist/esm/audio/AudioStreamVoice.js.map +1 -0
  41. package/dist/esm/audio/BaseVoice.d.ts +111 -0
  42. package/dist/esm/audio/BaseVoice.d.ts.map +1 -0
  43. package/dist/esm/audio/BaseVoice.js +298 -0
  44. package/dist/esm/audio/BaseVoice.js.map +1 -0
  45. package/dist/esm/audio/BiquadEffect.d.ts +53 -0
  46. package/dist/esm/audio/BiquadEffect.d.ts.map +1 -0
  47. package/dist/esm/audio/BiquadEffect.js +110 -0
  48. package/dist/esm/audio/BiquadEffect.js.map +1 -0
  49. package/dist/esm/audio/InputVoice.d.ts +41 -0
  50. package/dist/esm/audio/InputVoice.d.ts.map +1 -0
  51. package/dist/esm/audio/InputVoice.js +85 -0
  52. package/dist/esm/audio/InputVoice.js.map +1 -0
  53. package/dist/esm/audio/NoopVoice.d.ts +29 -0
  54. package/dist/esm/audio/NoopVoice.d.ts.map +1 -0
  55. package/dist/esm/audio/NoopVoice.js +52 -0
  56. package/dist/esm/audio/NoopVoice.js.map +1 -0
  57. package/dist/esm/audio/Playable.d.ts +135 -0
  58. package/dist/esm/audio/Playable.d.ts.map +1 -0
  59. package/dist/esm/audio/Sound.d.ts +64 -69
  60. package/dist/esm/audio/Sound.d.ts.map +1 -1
  61. package/dist/esm/audio/Sound.js +176 -377
  62. package/dist/esm/audio/Sound.js.map +1 -1
  63. package/dist/esm/audio/SoundVoice.d.ts +63 -0
  64. package/dist/esm/audio/SoundVoice.d.ts.map +1 -0
  65. package/dist/esm/audio/SoundVoice.js +168 -0
  66. package/dist/esm/audio/SoundVoice.js.map +1 -0
  67. package/dist/esm/audio/{filters/WorkletFilter.d.ts → WorkletEffect.d.ts} +3 -3
  68. package/dist/esm/audio/WorkletEffect.d.ts.map +1 -0
  69. package/dist/esm/audio/{filters/WorkletFilter.js → WorkletEffect.js} +6 -6
  70. package/dist/esm/audio/WorkletEffect.js.map +1 -0
  71. package/dist/esm/audio/audio-context.js +1 -1
  72. package/dist/esm/audio/audio-context.js.map +1 -1
  73. package/dist/esm/audio/crossFade.d.ts +22 -13
  74. package/dist/esm/audio/crossFade.d.ts.map +1 -1
  75. package/dist/esm/audio/crossFade.js +21 -13
  76. package/dist/esm/audio/crossFade.js.map +1 -1
  77. package/dist/esm/audio/filters/HighpassFilter.d.ts +2 -2
  78. package/dist/esm/audio/filters/HighpassFilter.js +2 -2
  79. package/dist/esm/audio/filters/LowpassFilter.d.ts +2 -2
  80. package/dist/esm/audio/filters/LowpassFilter.js +2 -2
  81. package/dist/esm/audio/filters/index.d.ts +0 -10
  82. package/dist/esm/audio/filters/index.d.ts.map +1 -1
  83. package/dist/esm/audio/index.d.ts +13 -15
  84. package/dist/esm/audio/index.d.ts.map +1 -1
  85. package/dist/esm/core/Application.d.ts +127 -10
  86. package/dist/esm/core/Application.d.ts.map +1 -1
  87. package/dist/esm/core/Application.js +226 -25
  88. package/dist/esm/core/Application.js.map +1 -1
  89. package/dist/esm/core/BuildInfo.js +2 -2
  90. package/dist/esm/core/Color.d.ts +6 -4
  91. package/dist/esm/core/Color.d.ts.map +1 -1
  92. package/dist/esm/core/Color.js +19 -15
  93. package/dist/esm/core/Color.js.map +1 -1
  94. package/dist/esm/core/DisposalScope.d.ts +50 -0
  95. package/dist/esm/core/DisposalScope.d.ts.map +1 -0
  96. package/dist/esm/core/DisposalScope.js +86 -0
  97. package/dist/esm/core/DisposalScope.js.map +1 -0
  98. package/dist/esm/core/Perf.d.ts +10 -22
  99. package/dist/esm/core/Perf.d.ts.map +1 -1
  100. package/dist/esm/core/Perf.js +15 -8
  101. package/dist/esm/core/Perf.js.map +1 -1
  102. package/dist/esm/core/Registry.d.ts +64 -0
  103. package/dist/esm/core/Registry.d.ts.map +1 -0
  104. package/dist/esm/core/Registry.js +79 -0
  105. package/dist/esm/core/Registry.js.map +1 -0
  106. package/dist/esm/core/Scene.d.ts +69 -21
  107. package/dist/esm/core/Scene.d.ts.map +1 -1
  108. package/dist/esm/core/Scene.js +109 -16
  109. package/dist/esm/core/Scene.js.map +1 -1
  110. package/dist/esm/core/SceneManager.d.ts +22 -60
  111. package/dist/esm/core/SceneManager.d.ts.map +1 -1
  112. package/dist/esm/core/SceneManager.js +68 -153
  113. package/dist/esm/core/SceneManager.js.map +1 -1
  114. package/dist/esm/core/SceneNode.d.ts +43 -2
  115. package/dist/esm/core/SceneNode.d.ts.map +1 -1
  116. package/dist/esm/core/SceneNode.js +101 -12
  117. package/dist/esm/core/SceneNode.js.map +1 -1
  118. package/dist/esm/core/Signal.js.map +1 -1
  119. package/dist/esm/core/Stage.d.ts +42 -0
  120. package/dist/esm/core/Stage.d.ts.map +1 -0
  121. package/dist/esm/core/System.d.ts +22 -0
  122. package/dist/esm/core/System.d.ts.map +1 -0
  123. package/dist/esm/core/SystemRegistry.d.ts +35 -0
  124. package/dist/esm/core/SystemRegistry.d.ts.map +1 -0
  125. package/dist/esm/core/SystemRegistry.js +104 -0
  126. package/dist/esm/core/SystemRegistry.js.map +1 -0
  127. package/dist/esm/core/Time.d.ts +15 -0
  128. package/dist/esm/core/Time.d.ts.map +1 -1
  129. package/dist/esm/core/Time.js +25 -0
  130. package/dist/esm/core/Time.js.map +1 -1
  131. package/dist/esm/core/dev.d.ts +9 -4
  132. package/dist/esm/core/dev.d.ts.map +1 -1
  133. package/dist/esm/core/dev.js +5 -0
  134. package/dist/esm/core/dev.js.map +1 -1
  135. package/dist/esm/core/index.d.ts +26 -15
  136. package/dist/esm/core/index.d.ts.map +1 -1
  137. package/dist/esm/core/letterbox.d.ts +25 -0
  138. package/dist/esm/core/letterbox.d.ts.map +1 -0
  139. package/dist/esm/core/letterbox.js +26 -0
  140. package/dist/esm/core/letterbox.js.map +1 -0
  141. package/dist/esm/core/serialization/NodeSerializer.d.ts +71 -0
  142. package/dist/esm/core/serialization/NodeSerializer.d.ts.map +1 -0
  143. package/dist/esm/core/serialization/Prefab.d.ts +49 -0
  144. package/dist/esm/core/serialization/Prefab.d.ts.map +1 -0
  145. package/dist/esm/core/serialization/Prefab.js +61 -0
  146. package/dist/esm/core/serialization/Prefab.js.map +1 -0
  147. package/dist/esm/core/serialization/SerializationRegistry.d.ts +95 -0
  148. package/dist/esm/core/serialization/SerializationRegistry.d.ts.map +1 -0
  149. package/dist/esm/core/serialization/SerializationRegistry.js +108 -0
  150. package/dist/esm/core/serialization/SerializationRegistry.js.map +1 -0
  151. package/dist/esm/core/serialization/commonFields.d.ts +20 -0
  152. package/dist/esm/core/serialization/commonFields.d.ts.map +1 -0
  153. package/dist/esm/core/serialization/commonFields.js +149 -0
  154. package/dist/esm/core/serialization/commonFields.js.map +1 -0
  155. package/dist/esm/core/serialization/coreSerializers.d.ts +9 -0
  156. package/dist/esm/core/serialization/coreSerializers.d.ts.map +1 -0
  157. package/dist/esm/core/serialization/coreSerializers.js +101 -0
  158. package/dist/esm/core/serialization/coreSerializers.js.map +1 -0
  159. package/dist/esm/core/serialization/index.d.ts +6 -0
  160. package/dist/esm/core/serialization/index.d.ts.map +1 -0
  161. package/dist/esm/core/serialization/read.d.ts +65 -0
  162. package/dist/esm/core/serialization/read.d.ts.map +1 -0
  163. package/dist/esm/core/serialization/read.js +48 -0
  164. package/dist/esm/core/serialization/read.js.map +1 -0
  165. package/dist/esm/core/serialization/renderingSerializers.d.ts +7 -0
  166. package/dist/esm/core/serialization/renderingSerializers.d.ts.map +1 -0
  167. package/dist/esm/core/serialization/renderingSerializers.js +311 -0
  168. package/dist/esm/core/serialization/renderingSerializers.js.map +1 -0
  169. package/dist/esm/core/serialization/serialize.d.ts +56 -0
  170. package/dist/esm/core/serialization/serialize.d.ts.map +1 -0
  171. package/dist/esm/core/serialization/serialize.js +144 -0
  172. package/dist/esm/core/serialization/serialize.js.map +1 -0
  173. package/dist/esm/core/serialization/serializerHelpers.d.ts +46 -0
  174. package/dist/esm/core/serialization/serializerHelpers.d.ts.map +1 -0
  175. package/dist/esm/core/serialization/serializerHelpers.js +161 -0
  176. package/dist/esm/core/serialization/serializerHelpers.js.map +1 -0
  177. package/dist/esm/core/serialization/types.d.ts +49 -0
  178. package/dist/esm/core/serialization/types.d.ts.map +1 -0
  179. package/dist/esm/core/serialization/types.js +9 -0
  180. package/dist/esm/core/serialization/types.js.map +1 -0
  181. package/dist/esm/core/serialization/uiSerializers.d.ts +7 -0
  182. package/dist/esm/core/serialization/uiSerializers.d.ts.map +1 -0
  183. package/dist/esm/core/serialization/uiSerializers.js +206 -0
  184. package/dist/esm/core/serialization/uiSerializers.js.map +1 -0
  185. package/dist/esm/core/types.d.ts +1 -1
  186. package/dist/esm/core/types.d.ts.map +1 -1
  187. package/dist/esm/core/utils.d.ts +1 -16
  188. package/dist/esm/core/utils.d.ts.map +1 -1
  189. package/dist/esm/core/utils.js +2 -100
  190. package/dist/esm/core/utils.js.map +1 -1
  191. package/dist/esm/debug/PerformanceLayer.js +8 -9
  192. package/dist/esm/debug/PerformanceLayer.js.map +1 -1
  193. package/dist/esm/debug/PointerStackLayer.d.ts.map +1 -1
  194. package/dist/esm/debug/PointerStackLayer.js +9 -6
  195. package/dist/esm/debug/PointerStackLayer.js.map +1 -1
  196. package/dist/esm/debug/RenderPassInspectorLayer.d.ts.map +1 -1
  197. package/dist/esm/debug/RenderPassInspectorLayer.js +19 -12
  198. package/dist/esm/debug/RenderPassInspectorLayer.js.map +1 -1
  199. package/dist/esm/extensions/Extension.d.ts +78 -11
  200. package/dist/esm/extensions/Extension.d.ts.map +1 -1
  201. package/dist/esm/extensions/ExtensionRegistry.d.ts.map +1 -1
  202. package/dist/esm/extensions/ExtensionRegistry.js.map +1 -1
  203. package/dist/esm/extensions/materialize.d.ts +9 -1
  204. package/dist/esm/extensions/materialize.d.ts.map +1 -1
  205. package/dist/esm/extensions/materialize.js +17 -2
  206. package/dist/esm/extensions/materialize.js.map +1 -1
  207. package/dist/esm/extensions/snapshot.d.ts +14 -3
  208. package/dist/esm/extensions/snapshot.d.ts.map +1 -1
  209. package/dist/esm/extensions/snapshot.js +51 -14
  210. package/dist/esm/extensions/snapshot.js.map +1 -1
  211. package/dist/esm/index.d.ts +2 -1
  212. package/dist/esm/index.d.ts.map +1 -1
  213. package/dist/esm/index.js +37 -54
  214. package/dist/esm/index.js.map +1 -1
  215. package/dist/esm/input/FocusManager.d.ts +59 -0
  216. package/dist/esm/input/FocusManager.d.ts.map +1 -0
  217. package/dist/esm/input/FocusManager.js +175 -0
  218. package/dist/esm/input/FocusManager.js.map +1 -0
  219. package/dist/esm/input/Gamepad.d.ts.map +1 -1
  220. package/dist/esm/input/Gamepad.js +8 -4
  221. package/dist/esm/input/Gamepad.js.map +1 -1
  222. package/dist/esm/input/GamepadAxis.js +2 -2
  223. package/dist/esm/input/GamepadDefinitions.d.ts.map +1 -1
  224. package/dist/esm/input/GamepadDefinitions.js +6 -2
  225. package/dist/esm/input/GamepadDefinitions.js.map +1 -1
  226. package/dist/esm/input/GestureRecognizer.d.ts +1 -2
  227. package/dist/esm/input/GestureRecognizer.d.ts.map +1 -1
  228. package/dist/esm/input/GestureRecognizer.js +1 -3
  229. package/dist/esm/input/GestureRecognizer.js.map +1 -1
  230. package/dist/esm/input/InputBinding.js +3 -3
  231. package/dist/esm/input/InputBinding.js.map +1 -1
  232. package/dist/esm/input/InputManager.d.ts +7 -2
  233. package/dist/esm/input/InputManager.d.ts.map +1 -1
  234. package/dist/esm/input/InputManager.js +35 -21
  235. package/dist/esm/input/InputManager.js.map +1 -1
  236. package/dist/esm/input/InteractionManager.d.ts +67 -2
  237. package/dist/esm/input/InteractionManager.d.ts.map +1 -1
  238. package/dist/esm/input/InteractionManager.js +165 -41
  239. package/dist/esm/input/InteractionManager.js.map +1 -1
  240. package/dist/esm/input/KeyEvent.d.ts +25 -0
  241. package/dist/esm/input/KeyEvent.d.ts.map +1 -0
  242. package/dist/esm/input/KeyEvent.js +32 -0
  243. package/dist/esm/input/KeyEvent.js.map +1 -0
  244. package/dist/esm/input/Pointer.d.ts +21 -4
  245. package/dist/esm/input/Pointer.d.ts.map +1 -1
  246. package/dist/esm/input/Pointer.js +54 -15
  247. package/dist/esm/input/Pointer.js.map +1 -1
  248. package/dist/esm/input/index.d.ts +3 -1
  249. package/dist/esm/input/index.d.ts.map +1 -1
  250. package/dist/esm/math/AbstractVector.d.ts.map +1 -1
  251. package/dist/esm/math/AbstractVector.js +7 -2
  252. package/dist/esm/math/AbstractVector.js.map +1 -1
  253. package/dist/esm/math/Circle.d.ts.map +1 -1
  254. package/dist/esm/math/Circle.js +5 -1
  255. package/dist/esm/math/Circle.js.map +1 -1
  256. package/dist/esm/math/Line.d.ts +1 -1
  257. package/dist/esm/math/Line.d.ts.map +1 -1
  258. package/dist/esm/math/Line.js +1 -1
  259. package/dist/esm/math/Line.js.map +1 -1
  260. package/dist/esm/math/Matrix.d.ts.map +1 -1
  261. package/dist/esm/math/Matrix.js +6 -1
  262. package/dist/esm/math/Matrix.js.map +1 -1
  263. package/dist/esm/math/ObservableVector.d.ts +26 -8
  264. package/dist/esm/math/ObservableVector.d.ts.map +1 -1
  265. package/dist/esm/math/ObservableVector.js +24 -16
  266. package/dist/esm/math/ObservableVector.js.map +1 -1
  267. package/dist/esm/math/Polygon.d.ts +5 -0
  268. package/dist/esm/math/Polygon.d.ts.map +1 -1
  269. package/dist/esm/math/Polygon.js +27 -3
  270. package/dist/esm/math/Polygon.js.map +1 -1
  271. package/dist/esm/math/Random.d.ts +9 -9
  272. package/dist/esm/math/Random.d.ts.map +1 -1
  273. package/dist/esm/math/Random.js +46 -46
  274. package/dist/esm/math/Random.js.map +1 -1
  275. package/dist/esm/math/Rectangle.d.ts +11 -4
  276. package/dist/esm/math/Rectangle.d.ts.map +1 -1
  277. package/dist/esm/math/Rectangle.js +12 -6
  278. package/dist/esm/math/Rectangle.js.map +1 -1
  279. package/dist/esm/math/Vector.d.ts +1 -1
  280. package/dist/esm/math/Vector.d.ts.map +1 -1
  281. package/dist/esm/math/Vector.js +1 -1
  282. package/dist/esm/math/Vector.js.map +1 -1
  283. package/dist/esm/math/collision-detection.d.ts +42 -0
  284. package/dist/esm/math/collision-detection.d.ts.map +1 -1
  285. package/dist/esm/math/collision-detection.js +54 -4
  286. package/dist/esm/math/collision-detection.js.map +1 -1
  287. package/dist/esm/math/collision-primitives.d.ts.map +1 -1
  288. package/dist/esm/math/collision-primitives.js +4 -0
  289. package/dist/esm/math/collision-primitives.js.map +1 -1
  290. package/dist/esm/math/geometry.d.ts +26 -0
  291. package/dist/esm/math/geometry.d.ts.map +1 -1
  292. package/dist/esm/math/geometry.js +89 -2
  293. package/dist/esm/math/geometry.js.map +1 -1
  294. package/dist/esm/math/index.d.ts +7 -5
  295. package/dist/esm/math/index.d.ts.map +1 -1
  296. package/dist/esm/math/swept-collision.d.ts +13 -0
  297. package/dist/esm/math/swept-collision.d.ts.map +1 -1
  298. package/dist/esm/math/swept-collision.js +15 -1
  299. package/dist/esm/math/swept-collision.js.map +1 -1
  300. package/dist/esm/math/triangulate.d.ts.map +1 -1
  301. package/dist/esm/math/triangulate.js +9 -1
  302. package/dist/esm/math/triangulate.js.map +1 -1
  303. package/dist/esm/math/utils.d.ts +20 -0
  304. package/dist/esm/math/utils.d.ts.map +1 -1
  305. package/dist/esm/math/utils.js +18 -15
  306. package/dist/esm/math/utils.js.map +1 -1
  307. package/dist/esm/renderer-sdk.d.ts +2 -0
  308. package/dist/esm/renderer-sdk.d.ts.map +1 -1
  309. package/dist/esm/{rendering.js → renderer-sdk.js} +1 -1
  310. package/dist/esm/renderer-sdk.js.map +1 -0
  311. package/dist/esm/rendering/CallbackRenderPass.js +1 -1
  312. package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
  313. package/dist/esm/rendering/Container.d.ts +3 -0
  314. package/dist/esm/rendering/Container.d.ts.map +1 -1
  315. package/dist/esm/rendering/Container.js +28 -5
  316. package/dist/esm/rendering/Container.js.map +1 -1
  317. package/dist/esm/rendering/Drawable.d.ts +47 -0
  318. package/dist/esm/rendering/Drawable.d.ts.map +1 -1
  319. package/dist/esm/rendering/Drawable.js +88 -0
  320. package/dist/esm/rendering/Drawable.js.map +1 -1
  321. package/dist/esm/rendering/GpuResourceAccountant.d.ts +65 -0
  322. package/dist/esm/rendering/GpuResourceAccountant.d.ts.map +1 -0
  323. package/dist/esm/rendering/GpuResourceAccountant.js +130 -0
  324. package/dist/esm/rendering/GpuResourceAccountant.js.map +1 -0
  325. package/dist/esm/rendering/RenderBackend.d.ts +15 -1
  326. package/dist/esm/rendering/RenderBackend.d.ts.map +1 -1
  327. package/dist/esm/rendering/RenderBatch.d.ts +55 -0
  328. package/dist/esm/rendering/RenderBatch.d.ts.map +1 -0
  329. package/dist/esm/rendering/RenderBatch.js +107 -0
  330. package/dist/esm/rendering/RenderBatch.js.map +1 -0
  331. package/dist/esm/rendering/RenderNode.d.ts +50 -10
  332. package/dist/esm/rendering/RenderNode.d.ts.map +1 -1
  333. package/dist/esm/rendering/RenderNode.js +113 -20
  334. package/dist/esm/rendering/RenderNode.js.map +1 -1
  335. package/dist/esm/rendering/RenderNodePass.js +2 -2
  336. package/dist/esm/rendering/RenderNodePass.js.map +1 -1
  337. package/dist/esm/rendering/RenderStats.d.ts +39 -0
  338. package/dist/esm/rendering/RenderStats.d.ts.map +1 -1
  339. package/dist/esm/rendering/RenderStats.js +14 -0
  340. package/dist/esm/rendering/RenderStats.js.map +1 -1
  341. package/dist/esm/rendering/RendererRegistry.d.ts.map +1 -1
  342. package/dist/esm/rendering/RendererRegistry.js +20 -23
  343. package/dist/esm/rendering/RendererRegistry.js.map +1 -1
  344. package/dist/esm/rendering/RenderingContext.d.ts +88 -4
  345. package/dist/esm/rendering/RenderingContext.d.ts.map +1 -1
  346. package/dist/esm/rendering/RenderingContext.js +107 -5
  347. package/dist/esm/rendering/RenderingContext.js.map +1 -1
  348. package/dist/esm/rendering/TransformBuffer.d.ts.map +1 -1
  349. package/dist/esm/rendering/TransformBuffer.js +2 -0
  350. package/dist/esm/rendering/TransformBuffer.js.map +1 -1
  351. package/dist/esm/rendering/View.d.ts +47 -15
  352. package/dist/esm/rendering/View.d.ts.map +1 -1
  353. package/dist/esm/rendering/View.js +44 -27
  354. package/dist/esm/rendering/View.js.map +1 -1
  355. package/dist/esm/rendering/coreRendererBindings.d.ts.map +1 -1
  356. package/dist/esm/rendering/coreRendererBindings.js +22 -0
  357. package/dist/esm/rendering/coreRendererBindings.js.map +1 -1
  358. package/dist/esm/rendering/filters/WebGpuShaderFilter.d.ts.map +1 -1
  359. package/dist/esm/rendering/filters/WebGpuShaderFilter.js +3 -1
  360. package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -1
  361. package/dist/esm/rendering/geometry/Geometry.d.ts.map +1 -1
  362. package/dist/esm/rendering/geometry/Geometry.js +4 -2
  363. package/dist/esm/rendering/geometry/Geometry.js.map +1 -1
  364. package/dist/esm/rendering/gradient/Gradient.d.ts.map +1 -1
  365. package/dist/esm/rendering/gradient/Gradient.js +7 -2
  366. package/dist/esm/rendering/gradient/Gradient.js.map +1 -1
  367. package/dist/esm/rendering/material/MaterialKey.d.ts.map +1 -1
  368. package/dist/esm/rendering/material/MaterialKey.js +2 -0
  369. package/dist/esm/rendering/material/MaterialKey.js.map +1 -1
  370. package/dist/esm/rendering/material/ShaderSource.js +6 -0
  371. package/dist/esm/rendering/material/ShaderSource.js.map +1 -1
  372. package/dist/esm/rendering/mesh/ImmediateMesh.d.ts +48 -0
  373. package/dist/esm/rendering/mesh/ImmediateMesh.d.ts.map +1 -0
  374. package/dist/esm/rendering/mesh/ImmediateMesh.js +85 -0
  375. package/dist/esm/rendering/mesh/ImmediateMesh.js.map +1 -0
  376. package/dist/esm/rendering/mesh/Mesh.d.ts +29 -6
  377. package/dist/esm/rendering/mesh/Mesh.d.ts.map +1 -1
  378. package/dist/esm/rendering/mesh/Mesh.js +40 -13
  379. package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
  380. package/dist/esm/rendering/pixelSnap.d.ts +219 -0
  381. package/dist/esm/rendering/pixelSnap.d.ts.map +1 -0
  382. package/dist/esm/rendering/pixelSnap.js +187 -0
  383. package/dist/esm/rendering/pixelSnap.js.map +1 -0
  384. package/dist/esm/rendering/plan/RenderCommand.d.ts +31 -9
  385. package/dist/esm/rendering/plan/RenderCommand.d.ts.map +1 -1
  386. package/dist/esm/rendering/plan/RenderCommand.js +23 -21
  387. package/dist/esm/rendering/plan/RenderCommand.js.map +1 -1
  388. package/dist/esm/rendering/plan/RenderEffectExecutor.d.ts.map +1 -1
  389. package/dist/esm/rendering/plan/RenderEffectExecutor.js +1 -0
  390. package/dist/esm/rendering/plan/RenderEffectExecutor.js.map +1 -1
  391. package/dist/esm/rendering/plan/RenderInstruction.d.ts +7 -37
  392. package/dist/esm/rendering/plan/RenderInstruction.d.ts.map +1 -1
  393. package/dist/esm/rendering/plan/RenderPlanBuilder.d.ts +17 -2
  394. package/dist/esm/rendering/plan/RenderPlanBuilder.d.ts.map +1 -1
  395. package/dist/esm/rendering/plan/RenderPlanBuilder.js +132 -46
  396. package/dist/esm/rendering/plan/RenderPlanBuilder.js.map +1 -1
  397. package/dist/esm/rendering/plan/RenderPlanOptimizer.d.ts.map +1 -1
  398. package/dist/esm/rendering/plan/RenderPlanOptimizer.js +31 -4
  399. package/dist/esm/rendering/plan/RenderPlanOptimizer.js.map +1 -1
  400. package/dist/esm/rendering/plan/RenderPlanPlayer.d.ts.map +1 -1
  401. package/dist/esm/rendering/plan/RenderPlanPlayer.js +70 -13
  402. package/dist/esm/rendering/plan/RenderPlanPlayer.js.map +1 -1
  403. package/dist/esm/rendering/plan/RenderScope.d.ts +16 -10
  404. package/dist/esm/rendering/plan/RenderScope.d.ts.map +1 -1
  405. package/dist/esm/rendering/primitives/Graphics.d.ts +6 -0
  406. package/dist/esm/rendering/primitives/Graphics.d.ts.map +1 -1
  407. package/dist/esm/rendering/primitives/Graphics.js +17 -1
  408. package/dist/esm/rendering/primitives/Graphics.js.map +1 -1
  409. package/dist/esm/rendering/{index.d.ts → public.d.ts} +13 -30
  410. package/dist/esm/rendering/public.d.ts.map +1 -0
  411. package/dist/esm/rendering/shader/ShaderAttribute.d.ts.map +1 -1
  412. package/dist/esm/rendering/shader/ShaderAttribute.js +2 -0
  413. package/dist/esm/rendering/shader/ShaderAttribute.js.map +1 -1
  414. package/dist/esm/rendering/sprite/AnimatedSprite.d.ts +11 -0
  415. package/dist/esm/rendering/sprite/AnimatedSprite.d.ts.map +1 -1
  416. package/dist/esm/rendering/sprite/AnimatedSprite.js +24 -2
  417. package/dist/esm/rendering/sprite/AnimatedSprite.js.map +1 -1
  418. package/dist/esm/rendering/sprite/NineSliceSprite.d.ts +69 -0
  419. package/dist/esm/rendering/sprite/NineSliceSprite.d.ts.map +1 -0
  420. package/dist/esm/rendering/sprite/NineSliceSprite.js +206 -0
  421. package/dist/esm/rendering/sprite/NineSliceSprite.js.map +1 -0
  422. package/dist/esm/rendering/sprite/RepeatingSprite.d.ts +120 -0
  423. package/dist/esm/rendering/sprite/RepeatingSprite.d.ts.map +1 -0
  424. package/dist/esm/rendering/sprite/RepeatingSprite.js +277 -0
  425. package/dist/esm/rendering/sprite/RepeatingSprite.js.map +1 -0
  426. package/dist/esm/rendering/sprite/Sprite.d.ts +13 -0
  427. package/dist/esm/rendering/sprite/Sprite.d.ts.map +1 -1
  428. package/dist/esm/rendering/sprite/Sprite.js +53 -3
  429. package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
  430. package/dist/esm/rendering/sprite/nineSlice.d.ts +53 -0
  431. package/dist/esm/rendering/sprite/nineSlice.d.ts.map +1 -0
  432. package/dist/esm/rendering/sprite/nineSlice.js +334 -0
  433. package/dist/esm/rendering/sprite/nineSlice.js.map +1 -0
  434. package/dist/esm/rendering/sprite/repeatingSpritePlan.d.ts +57 -0
  435. package/dist/esm/rendering/sprite/repeatingSpritePlan.d.ts.map +1 -0
  436. package/dist/esm/rendering/sprite/repeatingSpritePlan.js +156 -0
  437. package/dist/esm/rendering/sprite/repeatingSpritePlan.js.map +1 -0
  438. package/dist/esm/rendering/text/BitmapText.d.ts +2 -0
  439. package/dist/esm/rendering/text/BitmapText.d.ts.map +1 -1
  440. package/dist/esm/rendering/text/BitmapText.js +4 -0
  441. package/dist/esm/rendering/text/BitmapText.js.map +1 -1
  442. package/dist/esm/rendering/text/GlyphAtlas.d.ts.map +1 -1
  443. package/dist/esm/rendering/text/GlyphAtlas.js +2 -1
  444. package/dist/esm/rendering/text/GlyphAtlas.js.map +1 -1
  445. package/dist/esm/rendering/text/GlyphAtlasPool.d.ts +8 -1
  446. package/dist/esm/rendering/text/GlyphAtlasPool.d.ts.map +1 -1
  447. package/dist/esm/rendering/text/GlyphAtlasPool.js +9 -12
  448. package/dist/esm/rendering/text/GlyphAtlasPool.js.map +1 -1
  449. package/dist/esm/rendering/text/GlyphSdf.d.ts.map +1 -1
  450. package/dist/esm/rendering/text/GlyphSdf.js +5 -1
  451. package/dist/esm/rendering/text/GlyphSdf.js.map +1 -1
  452. package/dist/esm/rendering/text/HTMLText.d.ts.map +1 -1
  453. package/dist/esm/rendering/text/HTMLText.js +1 -0
  454. package/dist/esm/rendering/text/HTMLText.js.map +1 -1
  455. package/dist/esm/rendering/text/Text.d.ts +17 -6
  456. package/dist/esm/rendering/text/Text.d.ts.map +1 -1
  457. package/dist/esm/rendering/text/Text.js +7 -12
  458. package/dist/esm/rendering/text/Text.js.map +1 -1
  459. package/dist/esm/rendering/text/TextLayout.d.ts.map +1 -1
  460. package/dist/esm/rendering/text/TextLayout.js +4 -18
  461. package/dist/esm/rendering/text/TextLayout.js.map +1 -1
  462. package/dist/esm/rendering/texture/DataTexture.js +2 -2
  463. package/dist/esm/rendering/texture/DataTexture.js.map +1 -1
  464. package/dist/esm/rendering/texture/Texture.d.ts +6 -0
  465. package/dist/esm/rendering/texture/Texture.d.ts.map +1 -1
  466. package/dist/esm/rendering/texture/Texture.js +8 -0
  467. package/dist/esm/rendering/texture/Texture.js.map +1 -1
  468. package/dist/esm/rendering/texture/TextureRegion.d.ts +100 -0
  469. package/dist/esm/rendering/texture/TextureRegion.d.ts.map +1 -0
  470. package/dist/esm/rendering/texture/TextureRegion.js +144 -0
  471. package/dist/esm/rendering/texture/TextureRegion.js.map +1 -0
  472. package/dist/esm/rendering/texture/repeat.d.ts +96 -0
  473. package/dist/esm/rendering/texture/repeat.d.ts.map +1 -0
  474. package/dist/esm/rendering/texture/repeat.js +158 -0
  475. package/dist/esm/rendering/texture/repeat.js.map +1 -0
  476. package/dist/esm/rendering/types.d.ts +11 -0
  477. package/dist/esm/rendering/types.d.ts.map +1 -1
  478. package/dist/esm/rendering/types.js +11 -0
  479. package/dist/esm/rendering/types.js.map +1 -1
  480. package/dist/esm/rendering/video/Video.d.ts +7 -3
  481. package/dist/esm/rendering/video/Video.d.ts.map +1 -1
  482. package/dist/esm/rendering/video/Video.js +7 -3
  483. package/dist/esm/rendering/video/Video.js.map +1 -1
  484. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.d.ts.map +1 -1
  485. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js +2 -2
  486. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js.map +1 -1
  487. package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +41 -2
  488. package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts.map +1 -1
  489. package/dist/esm/rendering/webgl2/WebGl2Backend.js +137 -8
  490. package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
  491. package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.d.ts.map +1 -1
  492. package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.js +2 -2
  493. package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.js.map +1 -1
  494. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.d.ts +17 -0
  495. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.d.ts.map +1 -1
  496. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +122 -38
  497. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -1
  498. package/dist/esm/rendering/webgl2/WebGl2NineSliceSpriteRenderer.d.ts +32 -0
  499. package/dist/esm/rendering/webgl2/WebGl2NineSliceSpriteRenderer.d.ts.map +1 -0
  500. package/dist/esm/rendering/webgl2/WebGl2NineSliceSpriteRenderer.js +309 -0
  501. package/dist/esm/rendering/webgl2/WebGl2NineSliceSpriteRenderer.js.map +1 -0
  502. package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.d.ts +16 -1
  503. package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.d.ts.map +1 -1
  504. package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.js +32 -1
  505. package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.js.map +1 -1
  506. package/dist/esm/rendering/webgl2/WebGl2RepeatingSpriteRenderer.d.ts +49 -0
  507. package/dist/esm/rendering/webgl2/WebGl2RepeatingSpriteRenderer.d.ts.map +1 -0
  508. package/dist/esm/rendering/webgl2/WebGl2RepeatingSpriteRenderer.js +539 -0
  509. package/dist/esm/rendering/webgl2/WebGl2RepeatingSpriteRenderer.js.map +1 -0
  510. package/dist/esm/rendering/webgl2/WebGl2ShaderBlock.d.ts.map +1 -1
  511. package/dist/esm/rendering/webgl2/WebGl2ShaderBlock.js +14 -3
  512. package/dist/esm/rendering/webgl2/WebGl2ShaderBlock.js.map +1 -1
  513. package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js +3 -3
  514. package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js.map +1 -1
  515. package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.d.ts.map +1 -1
  516. package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.js +11 -2
  517. package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.js.map +1 -1
  518. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +9 -0
  519. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts.map +1 -1
  520. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +29 -4
  521. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
  522. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.d.ts.map +1 -1
  523. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js +3 -2
  524. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js.map +1 -1
  525. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.d.ts.map +1 -1
  526. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js +10 -4
  527. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js.map +1 -1
  528. package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +39 -3
  529. package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts.map +1 -1
  530. package/dist/esm/rendering/webgpu/WebGpuBackend.js +120 -12
  531. package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
  532. package/dist/esm/rendering/webgpu/WebGpuBlendState.d.ts.map +1 -1
  533. package/dist/esm/rendering/webgpu/WebGpuBlendState.js +3 -0
  534. package/dist/esm/rendering/webgpu/WebGpuBlendState.js.map +1 -1
  535. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +13 -0
  536. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts.map +1 -1
  537. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +102 -24
  538. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
  539. package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.d.ts +36 -0
  540. package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.d.ts.map +1 -0
  541. package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.js +363 -0
  542. package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.js.map +1 -0
  543. package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.d.ts +52 -0
  544. package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.d.ts.map +1 -0
  545. package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.js +566 -0
  546. package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.js.map +1 -0
  547. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +9 -0
  548. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts.map +1 -1
  549. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +30 -6
  550. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
  551. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.d.ts.map +1 -1
  552. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js +1 -0
  553. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js.map +1 -1
  554. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.d.ts.map +1 -1
  555. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js +19 -7
  556. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js.map +1 -1
  557. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts +16 -4
  558. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts.map +1 -1
  559. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js +26 -6
  560. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js.map +1 -1
  561. package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js +1 -1
  562. package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js.map +1 -1
  563. package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.d.ts +7 -0
  564. package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.d.ts.map +1 -1
  565. package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js +8 -0
  566. package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js.map +1 -1
  567. package/dist/esm/resources/Asset.d.ts +1 -1
  568. package/dist/esm/resources/Asset.d.ts.map +1 -1
  569. package/dist/esm/resources/Asset.js +0 -2
  570. package/dist/esm/resources/Asset.js.map +1 -1
  571. package/dist/esm/resources/AssetContainer.d.ts +75 -0
  572. package/dist/esm/resources/AssetContainer.d.ts.map +1 -0
  573. package/dist/esm/resources/AssetContainer.js +100 -0
  574. package/dist/esm/resources/AssetContainer.js.map +1 -0
  575. package/dist/esm/resources/AssetDefinitions.d.ts +3 -3
  576. package/dist/esm/resources/AssetDefinitions.d.ts.map +1 -1
  577. package/dist/esm/resources/Assets.d.ts.map +1 -1
  578. package/dist/esm/resources/Assets.js +0 -1
  579. package/dist/esm/resources/Assets.js.map +1 -1
  580. package/dist/esm/resources/FactoryRegistry.d.ts.map +1 -1
  581. package/dist/esm/resources/FactoryRegistry.js +14 -23
  582. package/dist/esm/resources/FactoryRegistry.js.map +1 -1
  583. package/dist/esm/resources/IndexedDbDatabase.d.ts.map +1 -1
  584. package/dist/esm/resources/IndexedDbDatabase.js +8 -1
  585. package/dist/esm/resources/IndexedDbDatabase.js.map +1 -1
  586. package/dist/esm/resources/IndexedDbKeyValueStore.d.ts +37 -0
  587. package/dist/esm/resources/IndexedDbKeyValueStore.d.ts.map +1 -0
  588. package/dist/esm/resources/IndexedDbKeyValueStore.js +58 -0
  589. package/dist/esm/resources/IndexedDbKeyValueStore.js.map +1 -0
  590. package/dist/esm/resources/KeyValueStore.d.ts +31 -0
  591. package/dist/esm/resources/KeyValueStore.d.ts.map +1 -0
  592. package/dist/esm/resources/Loader.d.ts +78 -10
  593. package/dist/esm/resources/Loader.d.ts.map +1 -1
  594. package/dist/esm/resources/Loader.js +119 -15
  595. package/dist/esm/resources/Loader.js.map +1 -1
  596. package/dist/esm/resources/MemoryStore.d.ts +17 -0
  597. package/dist/esm/resources/MemoryStore.d.ts.map +1 -0
  598. package/dist/esm/resources/MemoryStore.js +30 -0
  599. package/dist/esm/resources/MemoryStore.js.map +1 -0
  600. package/dist/esm/resources/WebStorageStore.d.ts +40 -0
  601. package/dist/esm/resources/WebStorageStore.d.ts.map +1 -0
  602. package/dist/esm/resources/WebStorageStore.js +84 -0
  603. package/dist/esm/resources/WebStorageStore.js.map +1 -0
  604. package/dist/esm/resources/coreAssetBindings.d.ts.map +1 -1
  605. package/dist/esm/resources/coreAssetBindings.js +16 -5
  606. package/dist/esm/resources/coreAssetBindings.js.map +1 -1
  607. package/dist/esm/resources/factories/BmFontFactory.js +4 -4
  608. package/dist/esm/resources/factories/BmFontFactory.js.map +1 -1
  609. package/dist/esm/resources/factories/MusicFactory.d.ts +9 -9
  610. package/dist/esm/resources/factories/MusicFactory.d.ts.map +1 -1
  611. package/dist/esm/resources/factories/MusicFactory.js +7 -7
  612. package/dist/esm/resources/factories/MusicFactory.js.map +1 -1
  613. package/dist/esm/resources/factories/SoundFactory.js +2 -2
  614. package/dist/esm/resources/factories/SoundFactory.js.map +1 -1
  615. package/dist/esm/resources/factories/SubtitleFactory.d.ts +11 -1
  616. package/dist/esm/resources/factories/SubtitleFactory.d.ts.map +1 -1
  617. package/dist/esm/resources/factories/SubtitleFactory.js +13 -9
  618. package/dist/esm/resources/factories/SubtitleFactory.js.map +1 -1
  619. package/dist/esm/resources/index.d.ts +51 -34
  620. package/dist/esm/resources/index.d.ts.map +1 -1
  621. package/dist/esm/resources/utils.js +4 -4
  622. package/dist/esm/resources/utils.js.map +1 -1
  623. package/dist/esm/ui/Button.d.ts +54 -0
  624. package/dist/esm/ui/Button.d.ts.map +1 -0
  625. package/dist/esm/ui/Button.js +139 -0
  626. package/dist/esm/ui/Button.js.map +1 -0
  627. package/dist/esm/ui/Label.d.ts +17 -0
  628. package/dist/esm/ui/Label.d.ts.map +1 -0
  629. package/dist/esm/ui/Label.js +37 -0
  630. package/dist/esm/ui/Label.js.map +1 -0
  631. package/dist/esm/ui/Panel.d.ts +38 -0
  632. package/dist/esm/ui/Panel.d.ts.map +1 -0
  633. package/dist/esm/ui/Panel.js +61 -0
  634. package/dist/esm/ui/Panel.js.map +1 -0
  635. package/dist/esm/ui/ProgressBar.d.ts +37 -0
  636. package/dist/esm/ui/ProgressBar.d.ts.map +1 -0
  637. package/dist/esm/ui/ProgressBar.js +76 -0
  638. package/dist/esm/ui/ProgressBar.js.map +1 -0
  639. package/dist/esm/ui/Stack.d.ts +34 -0
  640. package/dist/esm/ui/Stack.d.ts.map +1 -0
  641. package/dist/esm/ui/Stack.js +69 -0
  642. package/dist/esm/ui/Stack.js.map +1 -0
  643. package/dist/esm/ui/UIRoot.d.ts +31 -0
  644. package/dist/esm/ui/UIRoot.d.ts.map +1 -0
  645. package/dist/esm/ui/UIRoot.js +49 -0
  646. package/dist/esm/ui/UIRoot.js.map +1 -0
  647. package/dist/esm/ui/Widget.d.ts +45 -0
  648. package/dist/esm/ui/Widget.d.ts.map +1 -0
  649. package/dist/esm/ui/Widget.js +113 -0
  650. package/dist/esm/ui/Widget.js.map +1 -0
  651. package/dist/esm/ui/index.d.ts +13 -0
  652. package/dist/esm/ui/index.d.ts.map +1 -0
  653. package/dist/exo.debug.esm.js +1 -948
  654. package/dist/exo.debug.esm.js.map +1 -1
  655. package/dist/exo.esm.js +1 -37555
  656. package/dist/exo.esm.js.map +1 -1
  657. package/package.json +31 -13
  658. package/dist/esm/audio/AbstractMedia.d.ts +0 -75
  659. package/dist/esm/audio/AbstractMedia.d.ts.map +0 -1
  660. package/dist/esm/audio/AbstractMedia.js +0 -179
  661. package/dist/esm/audio/AbstractMedia.js.map +0 -1
  662. package/dist/esm/audio/AudioAnalyser.d.ts +0 -128
  663. package/dist/esm/audio/AudioAnalyser.d.ts.map +0 -1
  664. package/dist/esm/audio/AudioAnalyser.js +0 -473
  665. package/dist/esm/audio/AudioAnalyser.js.map +0 -1
  666. package/dist/esm/audio/AudioFilter.d.ts +0 -17
  667. package/dist/esm/audio/AudioFilter.d.ts.map +0 -1
  668. package/dist/esm/audio/AudioFilter.js +0 -15
  669. package/dist/esm/audio/AudioFilter.js.map +0 -1
  670. package/dist/esm/audio/BeatDetector.d.ts +0 -207
  671. package/dist/esm/audio/BeatDetector.d.ts.map +0 -1
  672. package/dist/esm/audio/BeatDetector.js +0 -424
  673. package/dist/esm/audio/BeatDetector.js.map +0 -1
  674. package/dist/esm/audio/Media.d.ts +0 -37
  675. package/dist/esm/audio/Media.d.ts.map +0 -1
  676. package/dist/esm/audio/Music.d.ts +0 -42
  677. package/dist/esm/audio/Music.d.ts.map +0 -1
  678. package/dist/esm/audio/Music.js +0 -164
  679. package/dist/esm/audio/Music.js.map +0 -1
  680. package/dist/esm/audio/OscillatorSound.d.ts +0 -100
  681. package/dist/esm/audio/OscillatorSound.d.ts.map +0 -1
  682. package/dist/esm/audio/OscillatorSound.js +0 -346
  683. package/dist/esm/audio/OscillatorSound.js.map +0 -1
  684. package/dist/esm/audio/dsp/fft.d.ts +0 -23
  685. package/dist/esm/audio/dsp/fft.d.ts.map +0 -1
  686. package/dist/esm/audio/dsp/mel.d.ts +0 -44
  687. package/dist/esm/audio/dsp/mel.d.ts.map +0 -1
  688. package/dist/esm/audio/dsp/mel.js +0 -70
  689. package/dist/esm/audio/dsp/mel.js.map +0 -1
  690. package/dist/esm/audio/dsp/tempogram.d.ts +0 -52
  691. package/dist/esm/audio/dsp/tempogram.d.ts.map +0 -1
  692. package/dist/esm/audio/filters/ChorusFilter.d.ts +0 -54
  693. package/dist/esm/audio/filters/ChorusFilter.d.ts.map +0 -1
  694. package/dist/esm/audio/filters/ChorusFilter.js +0 -155
  695. package/dist/esm/audio/filters/ChorusFilter.js.map +0 -1
  696. package/dist/esm/audio/filters/CompressorFilter.d.ts +0 -54
  697. package/dist/esm/audio/filters/CompressorFilter.d.ts.map +0 -1
  698. package/dist/esm/audio/filters/CompressorFilter.js +0 -123
  699. package/dist/esm/audio/filters/CompressorFilter.js.map +0 -1
  700. package/dist/esm/audio/filters/DelayFilter.d.ts +0 -36
  701. package/dist/esm/audio/filters/DelayFilter.d.ts.map +0 -1
  702. package/dist/esm/audio/filters/DelayFilter.js +0 -114
  703. package/dist/esm/audio/filters/DelayFilter.js.map +0 -1
  704. package/dist/esm/audio/filters/DuckingFilter.d.ts +0 -45
  705. package/dist/esm/audio/filters/DuckingFilter.d.ts.map +0 -1
  706. package/dist/esm/audio/filters/DuckingFilter.js +0 -172
  707. package/dist/esm/audio/filters/DuckingFilter.js.map +0 -1
  708. package/dist/esm/audio/filters/EqualizerFilter.d.ts +0 -51
  709. package/dist/esm/audio/filters/EqualizerFilter.d.ts.map +0 -1
  710. package/dist/esm/audio/filters/EqualizerFilter.js +0 -138
  711. package/dist/esm/audio/filters/EqualizerFilter.js.map +0 -1
  712. package/dist/esm/audio/filters/GranularFilter.d.ts +0 -63
  713. package/dist/esm/audio/filters/GranularFilter.d.ts.map +0 -1
  714. package/dist/esm/audio/filters/GranularFilter.js +0 -107
  715. package/dist/esm/audio/filters/GranularFilter.js.map +0 -1
  716. package/dist/esm/audio/filters/PitchShiftFilter.d.ts +0 -45
  717. package/dist/esm/audio/filters/PitchShiftFilter.d.ts.map +0 -1
  718. package/dist/esm/audio/filters/PitchShiftFilter.js +0 -66
  719. package/dist/esm/audio/filters/PitchShiftFilter.js.map +0 -1
  720. package/dist/esm/audio/filters/ReverbFilter.d.ts +0 -38
  721. package/dist/esm/audio/filters/ReverbFilter.d.ts.map +0 -1
  722. package/dist/esm/audio/filters/ReverbFilter.js +0 -122
  723. package/dist/esm/audio/filters/ReverbFilter.js.map +0 -1
  724. package/dist/esm/audio/filters/VocoderFilter.d.ts +0 -50
  725. package/dist/esm/audio/filters/VocoderFilter.d.ts.map +0 -1
  726. package/dist/esm/audio/filters/VocoderFilter.js +0 -94
  727. package/dist/esm/audio/filters/VocoderFilter.js.map +0 -1
  728. package/dist/esm/audio/filters/WorkletFilter.d.ts.map +0 -1
  729. package/dist/esm/audio/filters/WorkletFilter.js.map +0 -1
  730. package/dist/esm/audio/worklets/beat-detector.worklet.d.ts +0 -2
  731. package/dist/esm/audio/worklets/beat-detector.worklet.d.ts.map +0 -1
  732. package/dist/esm/audio/worklets/beat-detector.worklet.js +0 -647
  733. package/dist/esm/audio/worklets/beat-detector.worklet.js.map +0 -1
  734. package/dist/esm/audio/worklets/granular.worklet.d.ts +0 -2
  735. package/dist/esm/audio/worklets/granular.worklet.d.ts.map +0 -1
  736. package/dist/esm/audio/worklets/granular.worklet.js +0 -89
  737. package/dist/esm/audio/worklets/granular.worklet.js.map +0 -1
  738. package/dist/esm/audio/worklets/pitch-shift.worklet.d.ts +0 -2
  739. package/dist/esm/audio/worklets/pitch-shift.worklet.d.ts.map +0 -1
  740. package/dist/esm/audio/worklets/pitch-shift.worklet.js +0 -74
  741. package/dist/esm/audio/worklets/pitch-shift.worklet.js.map +0 -1
  742. package/dist/esm/audio/worklets/vocoder.worklet.d.ts +0 -2
  743. package/dist/esm/audio/worklets/vocoder.worklet.d.ts.map +0 -1
  744. package/dist/esm/audio/worklets/vocoder.worklet.js +0 -92
  745. package/dist/esm/audio/worklets/vocoder.worklet.js.map +0 -1
  746. package/dist/esm/input/internal/interactionManagerRegistry.d.ts +0 -10
  747. package/dist/esm/input/internal/interactionManagerRegistry.d.ts.map +0 -1
  748. package/dist/esm/input/internal/interactionManagerRegistry.js +0 -10
  749. package/dist/esm/input/internal/interactionManagerRegistry.js.map +0 -1
  750. package/dist/esm/rendering/index.d.ts.map +0 -1
  751. package/dist/esm/rendering/plan/RenderInstruction.js +0 -45
  752. package/dist/esm/rendering/plan/RenderInstruction.js.map +0 -1
  753. package/dist/esm/rendering.d.ts +0 -28
  754. package/dist/esm/rendering.d.ts.map +0 -1
  755. package/dist/esm/rendering.js.map +0 -1
  756. package/dist/esm/resources/JsonStore.d.ts +0 -19
  757. package/dist/esm/resources/JsonStore.d.ts.map +0 -1
  758. package/dist/esm/resources/JsonStore.js +0 -62
  759. package/dist/esm/resources/JsonStore.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  import { clamp } from '../math/utils.js';
2
2
  import { Vector } from '../math/Vector.js';
3
- import { AbstractMedia } from './AbstractMedia.js';
4
- import { onAudioContextReady, isAudioContextReady, getAudioContext } from './audio-context.js';
5
- import { getAudioManager } from './AudioManager.js';
3
+ import { getAudioContext, isAudioContextReady } from './audio-context.js';
4
+ import { NoopVoice } from './NoopVoice.js';
5
+ import { SoundVoice } from './SoundVoice.js';
6
6
 
7
7
  /**
8
8
  * Eviction strategy used when the pool is full and a new play is requested.
@@ -26,62 +26,54 @@ var SoundPoolStrategy;
26
26
  SoundPoolStrategy["LowestPriority"] = "priority";
27
27
  })(SoundPoolStrategy || (SoundPoolStrategy = {}));
28
28
  /**
29
- * Pre-decoded short audio clip backed by an `AudioBuffer`. Each
30
- * {@link Sound.play} call grabs a free `AudioBufferSourceNode` from the
31
- * pool (default size 8) so the same sound can overlap itself; when the
32
- * pool is full the configured {@link SoundPoolStrategy} decides which
33
- * source to evict.
29
+ * Pre-decoded short audio clip backed by an `AudioBuffer`.
34
30
  *
35
- * Supports audio-sprite playback via {@link Sound.playSprite} name a
36
- * sub-region in the {@link AudioSpriteClip} options and trigger by name.
31
+ * Sound is a **data descriptor**it holds the decoded audio buffer, sprite
32
+ * definitions, default playback parameters, and spatial configuration but does
33
+ * NOT start playback itself. Playback is driven by
34
+ * `AudioManager.play(sound, options)` which returns a {@link Voice} handle.
37
35
  *
38
- * Routes through any {@link AudioBus}; defaults to the engine's `sound`
39
- * bus. Calling {@link Sound.makeSpatial} attaches a panner so the sound
40
- * follows a {@link SceneNode} or world-space target with distance
41
- * attenuation handled by Web Audio.
36
+ * Multiple concurrent plays of the same Sound are supported up to `poolSize`.
37
+ * When the pool is full the configured {@link SoundPoolStrategy} decides which
38
+ * active voice to evict.
42
39
  *
43
- * Use {@link Music} for long-form streaming audio (single source, decoded
40
+ * Use {@link AudioStream} for long-form streaming audio (single source, decoded
44
41
  * lazily) — `Sound` is best for short, frequently-triggered clips.
45
42
  */
46
- class Sound extends AbstractMedia {
43
+ class Sound {
47
44
  _audioBuffer;
48
- _pooledSources = [];
49
- _queuedPooledPlays = [];
50
45
  _sprites = new Map();
51
- _audioSetup = null;
52
- _paused = true;
53
- _poolSize = 8;
54
- _poolStrategy = SoundPoolStrategy.FirstInFirstOut;
55
- _priority = 0;
46
+ // Playable buffer window (seconds). Full buffer by default; narrowed by clip().
47
+ _clipStart = 0;
48
+ _clipEnd = 0;
49
+ /** Default volume applied to new voices. */
50
+ volume;
51
+ /** Default loop flag applied to new voices. */
52
+ loop;
53
+ /** Default playback rate applied to new voices. */
54
+ playbackRate;
55
+ /** Default muted flag applied to new voices. */
56
+ muted;
57
+ _poolSize;
58
+ _poolStrategy;
59
+ _priority;
60
+ // Spatial descriptor params — read by _createVoice to configure the PannerNode.
56
61
  _position = null;
57
62
  _velocity = null;
58
- _pannerNode = null;
59
63
  _distanceModel = 'linear';
60
64
  _refDistance = 50;
61
65
  _maxDistance = 1000;
62
66
  _rolloffFactor = 1;
63
- _onAudioContextReady = (ctx) => {
64
- onAudioContextReady.remove(this._onAudioContextReady);
65
- this.setupWithAudioContext(ctx);
66
- };
67
- get paused() {
68
- return this._paused;
69
- }
70
- set paused(paused) {
71
- if (paused) {
72
- this.pause();
73
- }
74
- else {
75
- this.play();
76
- }
77
- }
78
- get analyserTarget() {
79
- return this._audioSetup?.gainNode ?? null;
80
- }
67
+ // Active voice pool — tracks concurrent voices for eviction logic.
68
+ _activeVoices = [];
81
69
  /** The underlying decoded audio data. Useful for sharing a single decoded buffer across multiple `Sound` instances. */
82
70
  get audioBuffer() {
83
71
  return this._audioBuffer;
84
72
  }
73
+ /** Playable duration in seconds — the full buffer, or the clip span for a {@link Sound.clip}. */
74
+ get duration() {
75
+ return this._clipEnd - this._clipStart;
76
+ }
85
77
  get poolSize() {
86
78
  return this._poolSize;
87
79
  }
@@ -117,16 +109,11 @@ class Sound extends AbstractMedia {
117
109
  if (this._position !== null) {
118
110
  this._position.destroy();
119
111
  this._position = null;
120
- this._teardownSpatial();
121
- getAudioManager()._unregisterSpatialSound(this);
122
112
  }
123
113
  return;
124
114
  }
125
115
  if (this._position === null) {
126
- // Becoming spatial
127
116
  this._position = new Vector(value.x, value.y);
128
- this._setupSpatial();
129
- getAudioManager()._registerSpatialSound(this);
130
117
  }
131
118
  else {
132
119
  this._position.set(value.x, value.y);
@@ -151,15 +138,12 @@ class Sound extends AbstractMedia {
151
138
  }
152
139
  }
153
140
  }
154
- /** Distance-attenuation model. Applied immediately if a panner is already attached. */
141
+ /** Distance-attenuation model. */
155
142
  get distanceModel() {
156
143
  return this._distanceModel;
157
144
  }
158
145
  set distanceModel(value) {
159
146
  this._distanceModel = value;
160
- if (this._pannerNode !== null) {
161
- this._pannerNode.distanceModel = value;
162
- }
163
147
  }
164
148
  /** Reference distance — volume is at full strength at and below this distance. */
165
149
  get refDistance() {
@@ -167,9 +151,6 @@ class Sound extends AbstractMedia {
167
151
  }
168
152
  set refDistance(value) {
169
153
  this._refDistance = Math.max(0, value);
170
- if (this._pannerNode !== null) {
171
- this._pannerNode.refDistance = this._refDistance;
172
- }
173
154
  }
174
155
  /** Maximum distance for the `'linear'` model — volume reaches zero here. */
175
156
  get maxDistance() {
@@ -177,9 +158,6 @@ class Sound extends AbstractMedia {
177
158
  }
178
159
  set maxDistance(value) {
179
160
  this._maxDistance = Math.max(0, value);
180
- if (this._pannerNode !== null) {
181
- this._pannerNode.maxDistance = this._maxDistance;
182
- }
183
161
  }
184
162
  /** Falloff steepness. Higher values attenuate faster with distance. */
185
163
  get rolloffFactor() {
@@ -187,27 +165,18 @@ class Sound extends AbstractMedia {
187
165
  }
188
166
  set rolloffFactor(value) {
189
167
  this._rolloffFactor = Math.max(0, value);
190
- if (this._pannerNode !== null) {
191
- this._pannerNode.rolloffFactor = this._rolloffFactor;
192
- }
193
168
  }
194
169
  constructor(audioBuffer, options = {}) {
195
- super({
196
- duration: audioBuffer.duration,
197
- volume: 1,
198
- playbackRate: 1,
199
- loop: false,
200
- muted: false,
201
- });
202
170
  this._audioBuffer = audioBuffer;
203
- const { poolSize, poolStrategy, priority, sprites, distanceModel, refDistance, maxDistance, rolloffFactor, ...playbackOptions } = options;
171
+ this._clipEnd = audioBuffer.duration;
172
+ const { poolSize, poolStrategy, priority, sprites, volume, loop, playbackRate, muted, distanceModel, refDistance, maxDistance, rolloffFactor } = options;
173
+ this.volume = clamp(volume ?? 1, 0, 1);
174
+ this.loop = loop ?? false;
175
+ this.playbackRate = clamp(playbackRate ?? 1, 0.1, 20);
176
+ this.muted = muted ?? false;
204
177
  this._poolSize = Math.max(1, Math.floor(poolSize ?? 8));
205
- if (poolStrategy !== undefined) {
206
- this._poolStrategy = poolStrategy;
207
- }
208
- if (priority !== undefined) {
209
- this._priority = priority;
210
- }
178
+ this._poolStrategy = poolStrategy ?? SoundPoolStrategy.FirstInFirstOut;
179
+ this._priority = priority ?? 0;
211
180
  if (distanceModel !== undefined) {
212
181
  this._distanceModel = distanceModel;
213
182
  }
@@ -220,52 +189,9 @@ class Sound extends AbstractMedia {
220
189
  if (rolloffFactor !== undefined) {
221
190
  this._rolloffFactor = Math.max(0, rolloffFactor);
222
191
  }
223
- if (Object.keys(playbackOptions).length > 0) {
224
- this.applyOptions(playbackOptions);
225
- }
226
192
  if (sprites) {
227
193
  this.setSprites(sprites);
228
194
  }
229
- if (isAudioContextReady()) {
230
- this.setupWithAudioContext(getAudioContext());
231
- }
232
- else {
233
- onAudioContextReady.add(this._onAudioContextReady);
234
- }
235
- }
236
- setVolume(value) {
237
- const volume = clamp(value, 0, 2);
238
- if (this._volume === volume) {
239
- return this;
240
- }
241
- this._volume = volume;
242
- if (this._audioSetup) {
243
- const { gainNode, audioContext } = this._audioSetup;
244
- gainNode.gain.setTargetAtTime(this.muted ? 0 : volume, audioContext.currentTime, 0.01);
245
- }
246
- return this;
247
- }
248
- setLoop(loop) {
249
- this._loop = loop;
250
- return this;
251
- }
252
- setPlaybackRate(value) {
253
- this._playbackRate = clamp(value, 0.1, 20);
254
- return this;
255
- }
256
- getTime() {
257
- return 0;
258
- }
259
- setTime(currentTime) {
260
- return this;
261
- }
262
- setMuted(muted) {
263
- this._muted = muted;
264
- if (this._audioSetup) {
265
- const { gainNode, audioContext } = this._audioSetup;
266
- gainNode.gain.setTargetAtTime(muted ? 0 : this.volume, audioContext.currentTime, 0.01);
267
- }
268
- return this;
269
195
  }
270
196
  setPoolSize(poolSize) {
271
197
  const normalizedPoolSize = Math.max(1, Math.floor(poolSize));
@@ -273,7 +199,7 @@ class Sound extends AbstractMedia {
273
199
  return this;
274
200
  }
275
201
  this._poolSize = normalizedPoolSize;
276
- this._trimPooledSources();
202
+ this._trimActiveVoices();
277
203
  return this;
278
204
  }
279
205
  setSprites(sprites) {
@@ -313,45 +239,57 @@ class Sound extends AbstractMedia {
313
239
  return this;
314
240
  }
315
241
  /**
316
- * Play this sound. By default, creates a new pooled instance allowing
317
- * multiple concurrent plays up to `poolSize`. Pass `{ replace: true }` to
318
- * stop all prior instances of this sound before starting a new one
319
- * (singleton-replace mode useful for non-overlapping playback like UI
320
- * confirmation chimes).
242
+ * Return a new {@link Sound} that plays only the `[offset, offset + duration]`
243
+ * sub-range (seconds) of this sound's buffer an audio atlas / sprite-sheet
244
+ * clip. The clip shares the same decoded {@link AudioBuffer} (no extra memory)
245
+ * and inherits this sound's default playback + spatial settings, including its
246
+ * own independent voice pool.
321
247
  */
322
- play(options) {
323
- if (options?.bus !== undefined) {
324
- this.bus = options.bus;
325
- }
326
- const playbackRate = clamp(options?.playbackRate ?? this._playbackRate, 0.1, 20);
327
- const offset = Math.max(0, options?.time ?? 0);
328
- const loop = options?.loop ?? this._loop;
329
- if (options?.volume !== undefined) {
330
- this.setVolume(options.volume);
331
- }
332
- if (options?.muted !== undefined) {
333
- this.setMuted(options.muted);
334
- }
335
- if (options?.replace) {
336
- this._stopAllPooled();
337
- }
338
- if (offset >= this.duration) {
339
- return this;
340
- }
341
- const duration = loop ? undefined : this.duration - offset;
342
- this._enqueuePooledPlay({
343
- offset,
344
- duration,
345
- loop,
346
- loopStart: 0,
347
- loopEnd: this.duration,
348
- playbackRate,
248
+ clip(offset, duration) {
249
+ const start = clamp(offset, 0, this._audioBuffer.duration);
250
+ const end = clamp(start + duration, start, this._audioBuffer.duration);
251
+ const clip = new Sound(this._audioBuffer, {
252
+ volume: this.volume,
253
+ loop: this.loop,
254
+ playbackRate: this.playbackRate,
255
+ muted: this.muted,
256
+ poolSize: this._poolSize,
257
+ poolStrategy: this._poolStrategy,
258
+ priority: this._priority,
259
+ distanceModel: this._distanceModel,
260
+ refDistance: this._refDistance,
261
+ maxDistance: this._maxDistance,
262
+ rolloffFactor: this._rolloffFactor,
263
+ });
264
+ clip._clipStart = start;
265
+ clip._clipEnd = end;
266
+ return clip;
267
+ }
268
+ /**
269
+ * Implements {@link Playable}. Called by {@link AudioManager.play}; do not
270
+ * call directly — use `manager.play(sound, options)` instead.
271
+ *
272
+ * Creates one {@link SoundVoice} backed by a single `AudioBufferSourceNode`.
273
+ * Pool limits are enforced: if the pool is full the configured eviction
274
+ * strategy picks a victim to stop before the new voice starts.
275
+ */
276
+ _createVoice(manager, options) {
277
+ const offset = this._clipStart + Math.max(0, options.time ?? 0);
278
+ if (offset >= this._clipEnd) {
279
+ return new NoopVoice(options.bus ?? manager.sound);
280
+ }
281
+ return this._buildVoice(manager, options, offset, {
282
+ base: this._clipStart,
283
+ end: this._clipEnd,
284
+ loopStart: this._clipStart,
285
+ loopEnd: this._clipEnd,
349
286
  });
350
- this._paused = false;
351
- this.onStart.dispatch();
352
- return this;
353
287
  }
354
- playSprite(name, options = {}) {
288
+ /**
289
+ * Create a voice for a named sprite clip.
290
+ * @internal Used by managers that want sprite-level playback.
291
+ */
292
+ _createSpriteVoice(manager, name, options = {}) {
355
293
  const clip = this._sprites.get(name);
356
294
  if (!clip) {
357
295
  throw new Error(`Sound sprite "${name}" is not defined.`);
@@ -362,196 +300,99 @@ class Sound extends AbstractMedia {
362
300
  throw new Error(`Sound sprite "${name}" offset (${clipOffset}s) exceeds clip duration (${clip.end - clip.start}s).`);
363
301
  }
364
302
  const loop = options.loop ?? clip.loop;
365
- const playbackRate = clamp(options.playbackRate ?? this._playbackRate, 0.1, 20);
366
- if (options.volume !== undefined) {
367
- this.setVolume(options.volume);
368
- }
369
- if (options.muted !== undefined) {
370
- this.setMuted(options.muted);
371
- }
372
- this._enqueuePooledPlay({
373
- offset,
374
- duration: loop ? undefined : clip.end - offset,
375
- loop,
303
+ return this._buildVoice(manager, { ...options, loop }, offset, {
304
+ base: clip.start,
305
+ end: clip.end,
376
306
  loopStart: clip.start,
377
307
  loopEnd: clip.end,
378
- playbackRate,
379
308
  });
380
- this.onStart.dispatch();
381
- return this;
382
309
  }
383
- pause(options) {
384
- if (options) {
385
- this.applyOptions(options);
386
- }
387
- if (this._paused && this._pooledSources.length === 0) {
388
- return this;
389
- }
390
- const hadPooledSources = this._pooledSources.length > 0;
391
- const wasPlaying = !this._paused || hadPooledSources;
392
- this._stopAllPooled();
393
- this._queuedPooledPlays.length = 0;
394
- this._paused = true;
395
- if (wasPlaying) {
396
- this.onStop.dispatch();
310
+ /**
311
+ * Shared voice construction for full-buffer and sprite playback. Enforces the
312
+ * pool limit, builds the {@link SoundVoice}, seeds spatialization from the
313
+ * descriptor's position, and tracks the voice for eviction.
314
+ */
315
+ _buildVoice(manager, options, offset, window) {
316
+ const loop = options.loop ?? this.loop;
317
+ const playbackRate = clamp(options.playbackRate ?? this.playbackRate, 0.1, 20);
318
+ const detune = options.detune ?? 0;
319
+ const volume = clamp(options.muted ? 0 : (options.volume ?? (this.muted ? 0 : this.volume)), 0, 1);
320
+ const bus = options.bus ?? manager.sound;
321
+ // Pool eviction: stop the victim voice if we're at capacity.
322
+ this._pruneEndedVoices();
323
+ if (this._activeVoices.length >= this._poolSize) {
324
+ const victimIndex = this._pickEvictionVictim();
325
+ const victim = this._activeVoices[victimIndex];
326
+ if (victim) {
327
+ this._activeVoices.splice(victimIndex, 1);
328
+ victim.voice.stop();
329
+ }
397
330
  }
398
- return this;
399
- }
400
- _getAudioSetup() {
401
- return this._audioSetup;
402
- }
403
- _defaultBus() {
404
- return getAudioManager().sound;
405
- }
406
- _disconnectFromBus() {
407
- if (this._audioSetup) {
408
- // Disconnect the upstream node (panner if spatial, else gainNode)
409
- const upstream = this._pannerNode ?? this._audioSetup.gainNode;
410
- upstream.disconnect();
331
+ const audioContext = getAudioContext();
332
+ const output = audioContext.createGain();
333
+ const voice = new SoundVoice({
334
+ audioContext,
335
+ output,
336
+ bus,
337
+ manager,
338
+ volume,
339
+ spatial: {
340
+ distanceModel: this._distanceModel,
341
+ refDistance: this._refDistance,
342
+ maxDistance: this._maxDistance,
343
+ rolloffFactor: this._rolloffFactor,
344
+ },
345
+ buffer: this._audioBuffer,
346
+ loop,
347
+ playbackRate,
348
+ detune,
349
+ offset,
350
+ window,
351
+ });
352
+ // Seed spatialization from the descriptor's position (initial value only;
353
+ // move a live voice via `voice.position` or `voice.follow(node)`).
354
+ if (this._position !== null) {
355
+ voice.position = this._position;
411
356
  }
412
- }
413
- _connectToBus() {
414
- if (this._audioSetup) {
415
- const upstream = this._pannerNode ?? this._audioSetup.gainNode;
416
- const inputNode = this.bus._getInputNode();
417
- if (inputNode) {
418
- upstream.connect(inputNode);
419
- }
420
- else {
421
- upstream.connect(this._audioSetup.audioContext.destination);
357
+ const startedAt = audioContext.currentTime;
358
+ const effectiveDuration = loop ? Infinity : window.end - offset;
359
+ const pooledVoice = { voice, startedAt, effectiveDuration };
360
+ voice.onEnd.add(() => {
361
+ const index = this._activeVoices.indexOf(pooledVoice);
362
+ if (index !== -1) {
363
+ this._activeVoices.splice(index, 1);
422
364
  }
365
+ });
366
+ this._activeVoices.push(pooledVoice);
367
+ return voice;
368
+ }
369
+ /** Stop all currently active voices (e.g. for replace mode). */
370
+ _stopAllVoices() {
371
+ const voices = [...this._activeVoices];
372
+ this._activeVoices.length = 0;
373
+ for (const pv of voices) {
374
+ pv.voice.stop();
423
375
  }
424
376
  }
425
377
  destroy() {
426
- if (this._pannerNode !== null) {
427
- this._pannerNode.disconnect();
428
- this._pannerNode = null;
429
- }
378
+ this._stopAllVoices();
379
+ this._sprites.clear();
430
380
  if (this._position !== null) {
431
381
  this._position.destroy();
432
382
  this._position = null;
433
- getAudioManager()._unregisterSpatialSound(this);
434
383
  }
435
384
  if (this._velocity !== null) {
436
385
  this._velocity.destroy();
437
386
  this._velocity = null;
438
387
  }
439
- super.destroy();
440
- onAudioContextReady.remove(this._onAudioContextReady);
441
- this._audioSetup?.gainNode.disconnect();
442
- this._stopAllPooled();
443
- this._queuedPooledPlays.length = 0;
444
- this._sprites.clear();
445
- }
446
- /** Internal: called by AudioManager.update() once per frame for spatial sounds. */
447
- _tickSpatial() {
448
- if (this._pannerNode === null || this._position === null)
449
- return;
450
- const ctx = this._pannerNode.context;
451
- const t = ctx.currentTime;
452
- const panner = this._pannerNode;
453
- if (panner.positionX) {
454
- panner.positionX.setValueAtTime(this._position.x, t);
455
- panner.positionY.setValueAtTime(this._position.y, t);
456
- panner.positionZ.setValueAtTime(0, t);
457
- }
458
- else if (panner.setPosition) {
459
- panner.setPosition(this._position.x, this._position.y, 0);
460
- }
461
- }
462
- _setupSpatial() {
463
- if (!this._audioSetup || this._pannerNode !== null)
464
- return;
465
- const ctx = this._audioSetup.audioContext;
466
- const panner = ctx.createPanner();
467
- panner.panningModel = 'equalpower';
468
- panner.distanceModel = this._distanceModel;
469
- panner.refDistance = this._refDistance;
470
- panner.maxDistance = this._maxDistance;
471
- panner.rolloffFactor = this._rolloffFactor;
472
- this._pannerNode = panner;
473
- // Re-route: gainNode → pannerNode → bus.inputNode
474
- this._audioSetup.gainNode.disconnect();
475
- this._audioSetup.gainNode.connect(panner);
476
- const busInput = this.bus._getInputNode();
477
- if (busInput) {
478
- panner.connect(busInput);
479
- }
480
- else {
481
- panner.connect(ctx.destination);
482
- }
483
- }
484
- _teardownSpatial() {
485
- if (!this._audioSetup || this._pannerNode === null)
486
- return;
487
- this._audioSetup.gainNode.disconnect();
488
- this._pannerNode.disconnect();
489
- this._pannerNode = null;
490
- // Restore: gainNode → bus.inputNode
491
- const busInput = this.bus._getInputNode();
492
- if (busInput) {
493
- this._audioSetup.gainNode.connect(busInput);
494
- }
495
- else {
496
- this._audioSetup.gainNode.connect(this._audioSetup.audioContext.destination);
497
- }
498
388
  }
499
- setupWithAudioContext(audioContext) {
500
- const gainNode = audioContext.createGain();
501
- gainNode.gain.setTargetAtTime(this.muted ? 0 : this.volume, audioContext.currentTime, 0.01);
502
- const inputNode = this.bus._getInputNode();
503
- if (inputNode) {
504
- gainNode.connect(inputNode);
505
- }
506
- else {
507
- gainNode.connect(audioContext.destination);
508
- }
509
- this._audioSetup = { audioContext, gainNode };
510
- this._flushQueuedPooledPlays();
511
- }
512
- _enqueuePooledPlay(play) {
513
- if (!this._audioSetup) {
514
- this._queuedPooledPlays.push(play);
515
- return;
516
- }
517
- this._playPooledNow(play);
518
- }
519
- _flushQueuedPooledPlays() {
520
- if (!this._audioSetup || this._queuedPooledPlays.length === 0) {
521
- return;
522
- }
523
- const queued = [...this._queuedPooledPlays];
524
- this._queuedPooledPlays.length = 0;
525
- for (const play of queued) {
526
- this._playPooledNow(play);
527
- }
528
- }
529
- _playPooledNow(play) {
530
- if (!this._audioSetup) {
531
- return;
532
- }
533
- const { audioContext } = this._audioSetup;
534
- const sourceNode = this._createBufferSourceNode(this._audioSetup, play);
535
- const startedAt = audioContext.currentTime;
536
- const effectiveDuration = play.loop ? Infinity : (play.duration ?? Infinity);
537
- const pooledSource = { node: sourceNode, startedAt, effectiveDuration };
538
- sourceNode.onended = () => {
539
- const index = this._pooledSources.indexOf(pooledSource);
540
- if (index !== -1) {
541
- this._pooledSources.splice(index, 1);
389
+ _pruneEndedVoices() {
390
+ for (let i = this._activeVoices.length - 1; i >= 0; i--) {
391
+ if (this._activeVoices[i]?.voice.ended === true) {
392
+ this._activeVoices.splice(i, 1);
542
393
  }
543
- sourceNode.disconnect();
544
- if (this._pooledSources.length === 0 && this._queuedPooledPlays.length === 0) {
545
- this._paused = true;
546
- }
547
- };
548
- this._pooledSources.push(pooledSource);
549
- this._trimPooledSources();
394
+ }
550
395
  }
551
- /**
552
- * Pick the index within `_pooledSources` of the source to evict.
553
- * The returned index is always valid (0 .. length-1).
554
- */
555
396
  _pickEvictionVictim() {
556
397
  switch (this._poolStrategy) {
557
398
  case SoundPoolStrategy.LeastRecentlyUsed: {
@@ -566,18 +407,15 @@ class Sound extends AbstractMedia {
566
407
  return 0; // oldest
567
408
  }
568
409
  }
569
- /**
570
- * Returns the index of the source with the smallest remaining playback
571
- * time (i.e. closest to its natural end). Used for `LeastRecentlyUsed`.
572
- */
573
410
  _pickClosestToEnd() {
574
- if (!this._audioSetup)
575
- return 0;
576
- const now = this._audioSetup.audioContext.currentTime;
411
+ const now = isAudioContextReady() ? getAudioContext().currentTime : 0;
577
412
  let minRemaining = Infinity;
578
413
  let minIndex = 0;
579
- for (let i = 0; i < this._pooledSources.length; i++) {
580
- const src = this._pooledSources[i];
414
+ for (let i = 0; i < this._activeVoices.length; i++) {
415
+ const src = this._activeVoices[i];
416
+ if (src === undefined) {
417
+ continue;
418
+ }
581
419
  const elapsed = now - src.startedAt;
582
420
  const remaining = src.effectiveDuration - elapsed;
583
421
  if (remaining < minRemaining) {
@@ -587,54 +425,15 @@ class Sound extends AbstractMedia {
587
425
  }
588
426
  return minIndex;
589
427
  }
590
- _trimPooledSources() {
591
- while (this._pooledSources.length > this._poolSize) {
428
+ _trimActiveVoices() {
429
+ while (this._activeVoices.length > this._poolSize) {
592
430
  const victimIndex = this._pickEvictionVictim();
593
- const victim = this._pooledSources[victimIndex];
594
- if (!victim) {
431
+ const victim = this._activeVoices[victimIndex];
432
+ if (!victim)
595
433
  break;
596
- }
597
- this._pooledSources.splice(victimIndex, 1);
598
- victim.node.onended = null;
599
- this._stopSourceNode(victim.node);
600
- }
601
- }
602
- /** Stop all pooled sources immediately (used by `replace: true` and `pause()`). */
603
- _stopAllPooled() {
604
- for (const pooledSource of this._pooledSources) {
605
- pooledSource.node.onended = null;
606
- this._stopSourceNode(pooledSource.node);
607
- }
608
- this._pooledSources.length = 0;
609
- }
610
- _stopSourceNode(sourceNode) {
611
- try {
612
- sourceNode.stop(0);
613
- }
614
- catch {
615
- // source nodes can only be stopped once; ignore invalid state errors
616
- }
617
- sourceNode.disconnect();
618
- }
619
- _createBufferSourceNode(setup, play) {
620
- const { gainNode } = setup;
621
- const sourceNode = setup.audioContext.createBufferSource();
622
- sourceNode.buffer = this._audioBuffer;
623
- sourceNode.loop = play.loop;
624
- sourceNode.playbackRate.value = play.playbackRate;
625
- if (play.loop) {
626
- sourceNode.loopStart = play.loopStart ?? 0;
627
- sourceNode.loopEnd = play.loopEnd ?? this.duration;
628
- }
629
- sourceNode.connect(gainNode);
630
- const duration = play.duration;
631
- if (!play.loop && duration !== undefined && duration > 0) {
632
- sourceNode.start(0, play.offset, duration);
633
- }
634
- else {
635
- sourceNode.start(0, play.offset);
434
+ this._activeVoices.splice(victimIndex, 1);
435
+ victim.voice.stop();
636
436
  }
637
- return sourceNode;
638
437
  }
639
438
  }
640
439