@codexo/exojs 0.4.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 (468) hide show
  1. package/CHANGELOG.md +163 -0
  2. package/README.md +141 -0
  3. package/dist/esm/audio/AbstractMedia.d.ts +45 -0
  4. package/dist/esm/audio/AbstractMedia.js +103 -0
  5. package/dist/esm/audio/AbstractMedia.js.map +1 -0
  6. package/dist/esm/audio/AudioAnalyser.d.ts +30 -0
  7. package/dist/esm/audio/AudioAnalyser.js +92 -0
  8. package/dist/esm/audio/AudioAnalyser.js.map +1 -0
  9. package/dist/esm/audio/Media.d.ts +25 -0
  10. package/dist/esm/audio/Music.d.ts +20 -0
  11. package/dist/esm/audio/Music.js +119 -0
  12. package/dist/esm/audio/Music.js.map +1 -0
  13. package/dist/esm/audio/Sound.d.ts +56 -0
  14. package/dist/esm/audio/Sound.js +394 -0
  15. package/dist/esm/audio/Sound.js.map +1 -0
  16. package/dist/esm/audio/audio-context.d.ts +11 -0
  17. package/dist/esm/audio/audio-context.js +115 -0
  18. package/dist/esm/audio/audio-context.js.map +1 -0
  19. package/dist/esm/audio/index.d.ts +6 -0
  20. package/dist/esm/core/Application.d.ts +76 -0
  21. package/dist/esm/core/Application.js +206 -0
  22. package/dist/esm/core/Application.js.map +1 -0
  23. package/dist/esm/core/Bounds.d.ts +19 -0
  24. package/dist/esm/core/Bounds.js +59 -0
  25. package/dist/esm/core/Bounds.js.map +1 -0
  26. package/dist/esm/core/Clock.d.ts +18 -0
  27. package/dist/esm/core/Clock.js +68 -0
  28. package/dist/esm/core/Clock.js.map +1 -0
  29. package/dist/esm/core/Color.d.ts +176 -0
  30. package/dist/esm/core/Color.js +265 -0
  31. package/dist/esm/core/Color.js.map +1 -0
  32. package/dist/esm/core/Quadtree.d.ts +20 -0
  33. package/dist/esm/core/Quadtree.js +86 -0
  34. package/dist/esm/core/Quadtree.js.map +1 -0
  35. package/dist/esm/core/Scene.d.ts +83 -0
  36. package/dist/esm/core/Scene.js +81 -0
  37. package/dist/esm/core/Scene.js.map +1 -0
  38. package/dist/esm/core/SceneManager.d.ts +66 -0
  39. package/dist/esm/core/SceneManager.js +396 -0
  40. package/dist/esm/core/SceneManager.js.map +1 -0
  41. package/dist/esm/core/SceneNode.d.ts +58 -0
  42. package/dist/esm/core/SceneNode.js +174 -0
  43. package/dist/esm/core/SceneNode.js.map +1 -0
  44. package/dist/esm/core/Signal.d.ts +18 -0
  45. package/dist/esm/core/Signal.js +63 -0
  46. package/dist/esm/core/Signal.js.map +1 -0
  47. package/dist/esm/core/Time.d.ts +38 -0
  48. package/dist/esm/core/Time.js +107 -0
  49. package/dist/esm/core/Time.js.map +1 -0
  50. package/dist/esm/core/Timer.d.ts +12 -0
  51. package/dist/esm/core/Timer.js +34 -0
  52. package/dist/esm/core/Timer.js.map +1 -0
  53. package/dist/esm/core/index.d.ts +13 -0
  54. package/dist/esm/core/types.d.ts +29 -0
  55. package/dist/esm/core/utils.d.ts +22 -0
  56. package/dist/esm/core/utils.js +136 -0
  57. package/dist/esm/core/utils.js.map +1 -0
  58. package/dist/esm/index.d.ts +8 -0
  59. package/dist/esm/index.js +135 -0
  60. package/dist/esm/index.js.map +1 -0
  61. package/dist/esm/input/ArcadeStickGamepadMapping.d.ts +5 -0
  62. package/dist/esm/input/ArcadeStickGamepadMapping.js +29 -0
  63. package/dist/esm/input/ArcadeStickGamepadMapping.js.map +1 -0
  64. package/dist/esm/input/GameCubeGamepadMapping.d.ts +5 -0
  65. package/dist/esm/input/GameCubeGamepadMapping.js +9 -0
  66. package/dist/esm/input/GameCubeGamepadMapping.js.map +1 -0
  67. package/dist/esm/input/Gamepad.d.ts +45 -0
  68. package/dist/esm/input/Gamepad.js +154 -0
  69. package/dist/esm/input/Gamepad.js.map +1 -0
  70. package/dist/esm/input/GamepadChannels.d.ts +39 -0
  71. package/dist/esm/input/GamepadChannels.js +45 -0
  72. package/dist/esm/input/GamepadChannels.js.map +1 -0
  73. package/dist/esm/input/GamepadControl.d.ts +15 -0
  74. package/dist/esm/input/GamepadControl.js +29 -0
  75. package/dist/esm/input/GamepadControl.js.map +1 -0
  76. package/dist/esm/input/GamepadDefinitions.d.ts +31 -0
  77. package/dist/esm/input/GamepadDefinitions.js +175 -0
  78. package/dist/esm/input/GamepadDefinitions.js.map +1 -0
  79. package/dist/esm/input/GamepadMapping.d.ts +23 -0
  80. package/dist/esm/input/GamepadMapping.js +32 -0
  81. package/dist/esm/input/GamepadMapping.js.map +1 -0
  82. package/dist/esm/input/GamepadPromptLayouts.d.ts +9 -0
  83. package/dist/esm/input/GamepadPromptLayouts.js +140 -0
  84. package/dist/esm/input/GamepadPromptLayouts.js.map +1 -0
  85. package/dist/esm/input/GenericDualAnalogGamepadMapping.d.ts +5 -0
  86. package/dist/esm/input/GenericDualAnalogGamepadMapping.js +53 -0
  87. package/dist/esm/input/GenericDualAnalogGamepadMapping.js.map +1 -0
  88. package/dist/esm/input/Input.d.ts +28 -0
  89. package/dist/esm/input/Input.js +68 -0
  90. package/dist/esm/input/Input.js.map +1 -0
  91. package/dist/esm/input/InputManager.d.ts +76 -0
  92. package/dist/esm/input/InputManager.js +346 -0
  93. package/dist/esm/input/InputManager.js.map +1 -0
  94. package/dist/esm/input/JoyConLeftGamepadMapping.d.ts +5 -0
  95. package/dist/esm/input/JoyConLeftGamepadMapping.js +9 -0
  96. package/dist/esm/input/JoyConLeftGamepadMapping.js.map +1 -0
  97. package/dist/esm/input/JoyConRightGamepadMapping.d.ts +5 -0
  98. package/dist/esm/input/JoyConRightGamepadMapping.js +9 -0
  99. package/dist/esm/input/JoyConRightGamepadMapping.js.map +1 -0
  100. package/dist/esm/input/PlayStationGamepadMapping.d.ts +5 -0
  101. package/dist/esm/input/PlayStationGamepadMapping.js +9 -0
  102. package/dist/esm/input/PlayStationGamepadMapping.js.map +1 -0
  103. package/dist/esm/input/Pointer.d.ts +52 -0
  104. package/dist/esm/input/Pointer.js +127 -0
  105. package/dist/esm/input/Pointer.js.map +1 -0
  106. package/dist/esm/input/SteamControllerGamepadMapping.d.ts +5 -0
  107. package/dist/esm/input/SteamControllerGamepadMapping.js +9 -0
  108. package/dist/esm/input/SteamControllerGamepadMapping.js.map +1 -0
  109. package/dist/esm/input/SwitchProGamepadMapping.d.ts +5 -0
  110. package/dist/esm/input/SwitchProGamepadMapping.js +9 -0
  111. package/dist/esm/input/SwitchProGamepadMapping.js.map +1 -0
  112. package/dist/esm/input/XboxGamepadMapping.d.ts +5 -0
  113. package/dist/esm/input/XboxGamepadMapping.js +9 -0
  114. package/dist/esm/input/XboxGamepadMapping.js.map +1 -0
  115. package/dist/esm/input/index.d.ts +19 -0
  116. package/dist/esm/input/types.d.ts +111 -0
  117. package/dist/esm/input/types.js +117 -0
  118. package/dist/esm/input/types.js.map +1 -0
  119. package/dist/esm/math/AbstractVector.d.ts +33 -0
  120. package/dist/esm/math/AbstractVector.js +106 -0
  121. package/dist/esm/math/AbstractVector.js.map +1 -0
  122. package/dist/esm/math/Circle.d.ts +41 -0
  123. package/dist/esm/math/Circle.js +137 -0
  124. package/dist/esm/math/Circle.js.map +1 -0
  125. package/dist/esm/math/CircleLike.d.ts +5 -0
  126. package/dist/esm/math/Collision.d.ts +28 -0
  127. package/dist/esm/math/Collision.js +13 -0
  128. package/dist/esm/math/Collision.js.map +1 -0
  129. package/dist/esm/math/Ellipse.d.ts +37 -0
  130. package/dist/esm/math/Ellipse.js +112 -0
  131. package/dist/esm/math/Ellipse.js.map +1 -0
  132. package/dist/esm/math/EllipseLike.d.ts +6 -0
  133. package/dist/esm/math/Flags.d.ts +12 -0
  134. package/dist/esm/math/Flags.js +41 -0
  135. package/dist/esm/math/Flags.js.map +1 -0
  136. package/dist/esm/math/Interval.d.ts +16 -0
  137. package/dist/esm/math/Interval.js +45 -0
  138. package/dist/esm/math/Interval.js.map +1 -0
  139. package/dist/esm/math/Line.d.ts +36 -0
  140. package/dist/esm/math/Line.js +114 -0
  141. package/dist/esm/math/Line.js.map +1 -0
  142. package/dist/esm/math/LineLike.d.ts +6 -0
  143. package/dist/esm/math/Matrix.d.ts +32 -0
  144. package/dist/esm/math/Matrix.js +134 -0
  145. package/dist/esm/math/Matrix.js.map +1 -0
  146. package/dist/esm/math/ObservableSize.d.ts +16 -0
  147. package/dist/esm/math/ObservableSize.js +56 -0
  148. package/dist/esm/math/ObservableSize.js.map +1 -0
  149. package/dist/esm/math/ObservableVector.d.ts +21 -0
  150. package/dist/esm/math/ObservableVector.js +74 -0
  151. package/dist/esm/math/ObservableVector.js.map +1 -0
  152. package/dist/esm/math/PointLike.d.ts +4 -0
  153. package/dist/esm/math/PolarVector.d.ts +8 -0
  154. package/dist/esm/math/PolarVector.js +19 -0
  155. package/dist/esm/math/PolarVector.js.map +1 -0
  156. package/dist/esm/math/Polygon.d.ts +38 -0
  157. package/dist/esm/math/Polygon.js +163 -0
  158. package/dist/esm/math/Polygon.js.map +1 -0
  159. package/dist/esm/math/PolygonLike.d.ts +6 -0
  160. package/dist/esm/math/Random.d.ts +15 -0
  161. package/dist/esm/math/Random.js +72 -0
  162. package/dist/esm/math/Random.js.map +1 -0
  163. package/dist/esm/math/Rectangle.d.ts +48 -0
  164. package/dist/esm/math/Rectangle.js +208 -0
  165. package/dist/esm/math/Rectangle.js.map +1 -0
  166. package/dist/esm/math/RectangleLike.d.ts +6 -0
  167. package/dist/esm/math/Segment.d.ts +25 -0
  168. package/dist/esm/math/Segment.js +79 -0
  169. package/dist/esm/math/Segment.js.map +1 -0
  170. package/dist/esm/math/ShapeLike.d.ts +4 -0
  171. package/dist/esm/math/Size.d.ts +24 -0
  172. package/dist/esm/math/Size.js +71 -0
  173. package/dist/esm/math/Size.js.map +1 -0
  174. package/dist/esm/math/Transformable.d.ts +47 -0
  175. package/dist/esm/math/Transformable.js +140 -0
  176. package/dist/esm/math/Transformable.js.map +1 -0
  177. package/dist/esm/math/Vector.d.ts +28 -0
  178. package/dist/esm/math/Vector.js +80 -0
  179. package/dist/esm/math/Vector.js.map +1 -0
  180. package/dist/esm/math/collision-detection.d.ts +41 -0
  181. package/dist/esm/math/collision-detection.js +394 -0
  182. package/dist/esm/math/collision-detection.js.map +1 -0
  183. package/dist/esm/math/collision-primitives.d.ts +39 -0
  184. package/dist/esm/math/collision-primitives.js +164 -0
  185. package/dist/esm/math/collision-primitives.js.map +1 -0
  186. package/dist/esm/math/geometry.d.ts +8 -0
  187. package/dist/esm/math/geometry.js +195 -0
  188. package/dist/esm/math/geometry.js.map +1 -0
  189. package/dist/esm/math/index.d.ts +27 -0
  190. package/dist/esm/math/utils.d.ts +21 -0
  191. package/dist/esm/math/utils.js +60 -0
  192. package/dist/esm/math/utils.js.map +1 -0
  193. package/dist/esm/particles/Particle.d.ts +40 -0
  194. package/dist/esm/particles/Particle.js +106 -0
  195. package/dist/esm/particles/Particle.js.map +1 -0
  196. package/dist/esm/particles/ParticleProperties.d.ts +14 -0
  197. package/dist/esm/particles/ParticleSystem.d.ts +43 -0
  198. package/dist/esm/particles/ParticleSystem.js +186 -0
  199. package/dist/esm/particles/ParticleSystem.js.map +1 -0
  200. package/dist/esm/particles/affectors/ColorAffector.d.ts +17 -0
  201. package/dist/esm/particles/affectors/ColorAffector.js +42 -0
  202. package/dist/esm/particles/affectors/ColorAffector.js.map +1 -0
  203. package/dist/esm/particles/affectors/ForceAffector.d.ts +13 -0
  204. package/dist/esm/particles/affectors/ForceAffector.js +28 -0
  205. package/dist/esm/particles/affectors/ForceAffector.js.map +1 -0
  206. package/dist/esm/particles/affectors/ParticleAffector.d.ts +6 -0
  207. package/dist/esm/particles/affectors/ScaleAffector.d.ts +13 -0
  208. package/dist/esm/particles/affectors/ScaleAffector.js +28 -0
  209. package/dist/esm/particles/affectors/ScaleAffector.js.map +1 -0
  210. package/dist/esm/particles/affectors/TorqueAffector.d.ts +12 -0
  211. package/dist/esm/particles/affectors/TorqueAffector.js +26 -0
  212. package/dist/esm/particles/affectors/TorqueAffector.js.map +1 -0
  213. package/dist/esm/particles/emitters/ParticleEmitter.d.ts +6 -0
  214. package/dist/esm/particles/emitters/ParticleOptions.d.ts +46 -0
  215. package/dist/esm/particles/emitters/ParticleOptions.js +104 -0
  216. package/dist/esm/particles/emitters/ParticleOptions.js.map +1 -0
  217. package/dist/esm/particles/emitters/UniversalEmitter.d.ts +17 -0
  218. package/dist/esm/particles/emitters/UniversalEmitter.js +45 -0
  219. package/dist/esm/particles/emitters/UniversalEmitter.js.map +1 -0
  220. package/dist/esm/particles/index.d.ts +11 -0
  221. package/dist/esm/physics/RapierPhysicsWorld.d.ts +136 -0
  222. package/dist/esm/physics/RapierPhysicsWorld.js +475 -0
  223. package/dist/esm/physics/RapierPhysicsWorld.js.map +1 -0
  224. package/dist/esm/physics/index.d.ts +1 -0
  225. package/dist/esm/rendering/CallbackRenderPass.d.ts +7 -0
  226. package/dist/esm/rendering/CallbackRenderPass.js +12 -0
  227. package/dist/esm/rendering/CallbackRenderPass.js.map +1 -0
  228. package/dist/esm/rendering/Container.d.ts +36 -0
  229. package/dist/esm/rendering/Container.js +197 -0
  230. package/dist/esm/rendering/Container.js.map +1 -0
  231. package/dist/esm/rendering/Drawable.d.ts +16 -0
  232. package/dist/esm/rendering/Drawable.js +54 -0
  233. package/dist/esm/rendering/Drawable.js.map +1 -0
  234. package/dist/esm/rendering/RenderBackendType.d.ts +4 -0
  235. package/dist/esm/rendering/RenderBackendType.js +8 -0
  236. package/dist/esm/rendering/RenderBackendType.js.map +1 -0
  237. package/dist/esm/rendering/RenderNode.d.ts +51 -0
  238. package/dist/esm/rendering/RenderNode.js +235 -0
  239. package/dist/esm/rendering/RenderNode.js.map +1 -0
  240. package/dist/esm/rendering/RenderPass.d.ts +4 -0
  241. package/dist/esm/rendering/RenderStats.d.ts +12 -0
  242. package/dist/esm/rendering/RenderStats.js +24 -0
  243. package/dist/esm/rendering/RenderStats.js.map +1 -0
  244. package/dist/esm/rendering/RenderTarget.d.ts +34 -0
  245. package/dist/esm/rendering/RenderTarget.js +109 -0
  246. package/dist/esm/rendering/RenderTarget.js.map +1 -0
  247. package/dist/esm/rendering/RenderTargetPass.d.ts +18 -0
  248. package/dist/esm/rendering/RenderTargetPass.js +31 -0
  249. package/dist/esm/rendering/RenderTargetPass.js.map +1 -0
  250. package/dist/esm/rendering/Renderer.d.ts +15 -0
  251. package/dist/esm/rendering/RendererRegistry.d.ts +43 -0
  252. package/dist/esm/rendering/RendererRegistry.js +86 -0
  253. package/dist/esm/rendering/RendererRegistry.js.map +1 -0
  254. package/dist/esm/rendering/SceneRenderRuntime.d.ts +29 -0
  255. package/dist/esm/rendering/View.d.ts +102 -0
  256. package/dist/esm/rendering/View.js +364 -0
  257. package/dist/esm/rendering/View.js.map +1 -0
  258. package/dist/esm/rendering/filters/BlurFilter.d.ts +20 -0
  259. package/dist/esm/rendering/filters/BlurFilter.js +68 -0
  260. package/dist/esm/rendering/filters/BlurFilter.js.map +1 -0
  261. package/dist/esm/rendering/filters/ColorFilter.d.ts +12 -0
  262. package/dist/esm/rendering/filters/ColorFilter.js +42 -0
  263. package/dist/esm/rendering/filters/ColorFilter.js.map +1 -0
  264. package/dist/esm/rendering/filters/Filter.d.ts +5 -0
  265. package/dist/esm/rendering/filters/Filter.js +5 -0
  266. package/dist/esm/rendering/filters/Filter.js.map +1 -0
  267. package/dist/esm/rendering/index.d.ts +52 -0
  268. package/dist/esm/rendering/primitives/CircleGeometry.d.ts +4 -0
  269. package/dist/esm/rendering/primitives/CircleGeometry.js +21 -0
  270. package/dist/esm/rendering/primitives/CircleGeometry.js.map +1 -0
  271. package/dist/esm/rendering/primitives/DrawableShape.d.ts +11 -0
  272. package/dist/esm/rendering/primitives/DrawableShape.js +21 -0
  273. package/dist/esm/rendering/primitives/DrawableShape.js.map +1 -0
  274. package/dist/esm/rendering/primitives/Geometry.d.ts +13 -0
  275. package/dist/esm/rendering/primitives/Geometry.js +16 -0
  276. package/dist/esm/rendering/primitives/Geometry.js.map +1 -0
  277. package/dist/esm/rendering/primitives/Graphics.d.ts +36 -0
  278. package/dist/esm/rendering/primitives/Graphics.js +208 -0
  279. package/dist/esm/rendering/primitives/Graphics.js.map +1 -0
  280. package/dist/esm/rendering/shader/Shader.d.ts +27 -0
  281. package/dist/esm/rendering/shader/Shader.js +63 -0
  282. package/dist/esm/rendering/shader/Shader.js.map +1 -0
  283. package/dist/esm/rendering/shader/ShaderAttribute.d.ts +9 -0
  284. package/dist/esm/rendering/shader/ShaderAttribute.js +21 -0
  285. package/dist/esm/rendering/shader/ShaderAttribute.js.map +1 -0
  286. package/dist/esm/rendering/shader/ShaderUniform.d.ts +16 -0
  287. package/dist/esm/rendering/shader/ShaderUniform.js +38 -0
  288. package/dist/esm/rendering/shader/ShaderUniform.js.map +1 -0
  289. package/dist/esm/rendering/sprite/AnimatedSprite.d.ts +43 -0
  290. package/dist/esm/rendering/sprite/AnimatedSprite.js +177 -0
  291. package/dist/esm/rendering/sprite/AnimatedSprite.js.map +1 -0
  292. package/dist/esm/rendering/sprite/Sprite.d.ts +43 -0
  293. package/dist/esm/rendering/sprite/Sprite.js +169 -0
  294. package/dist/esm/rendering/sprite/Sprite.js.map +1 -0
  295. package/dist/esm/rendering/sprite/Spritesheet.d.ts +34 -0
  296. package/dist/esm/rendering/sprite/Spritesheet.js +88 -0
  297. package/dist/esm/rendering/sprite/Spritesheet.js.map +1 -0
  298. package/dist/esm/rendering/text/Text.d.ts +26 -0
  299. package/dist/esm/rendering/text/Text.js +130 -0
  300. package/dist/esm/rendering/text/Text.js.map +1 -0
  301. package/dist/esm/rendering/text/TextStyle.d.ts +65 -0
  302. package/dist/esm/rendering/text/TextStyle.js +192 -0
  303. package/dist/esm/rendering/text/TextStyle.js.map +1 -0
  304. package/dist/esm/rendering/texture/RenderTexture.d.ts +36 -0
  305. package/dist/esm/rendering/texture/RenderTexture.js +123 -0
  306. package/dist/esm/rendering/texture/RenderTexture.js.map +1 -0
  307. package/dist/esm/rendering/texture/Sampler.d.ts +29 -0
  308. package/dist/esm/rendering/texture/Sampler.js +76 -0
  309. package/dist/esm/rendering/texture/Sampler.js.map +1 -0
  310. package/dist/esm/rendering/texture/Texture.d.ts +52 -0
  311. package/dist/esm/rendering/texture/Texture.js +173 -0
  312. package/dist/esm/rendering/texture/Texture.js.map +1 -0
  313. package/dist/esm/rendering/types.d.ts +68 -0
  314. package/dist/esm/rendering/types.js +79 -0
  315. package/dist/esm/rendering/types.js.map +1 -0
  316. package/dist/esm/rendering/utils.d.ts +9 -0
  317. package/dist/esm/rendering/utils.js +39 -0
  318. package/dist/esm/rendering/utils.js.map +1 -0
  319. package/dist/esm/rendering/video/Video.d.ts +62 -0
  320. package/dist/esm/rendering/video/Video.js +293 -0
  321. package/dist/esm/rendering/video/Video.js.map +1 -0
  322. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.d.ts +49 -0
  323. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js +175 -0
  324. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js.map +1 -0
  325. package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.d.ts +44 -0
  326. package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.js +57 -0
  327. package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.js.map +1 -0
  328. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.d.ts +11 -0
  329. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js +110 -0
  330. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js.map +1 -0
  331. package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.d.ts +26 -0
  332. package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.js +217 -0
  333. package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.js.map +1 -0
  334. package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.d.ts +26 -0
  335. package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.js +54 -0
  336. package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.js.map +1 -0
  337. package/dist/esm/rendering/webgl2/WebGl2RenderManager.d.ts +99 -0
  338. package/dist/esm/rendering/webgl2/WebGl2RenderManager.js +600 -0
  339. package/dist/esm/rendering/webgl2/WebGl2RenderManager.js.map +1 -0
  340. package/dist/esm/rendering/webgl2/WebGl2RendererRuntime.d.ts +15 -0
  341. package/dist/esm/rendering/webgl2/WebGl2ShaderBlock.d.ts +17 -0
  342. package/dist/esm/rendering/webgl2/WebGl2ShaderBlock.js +63 -0
  343. package/dist/esm/rendering/webgl2/WebGl2ShaderBlock.js.map +1 -0
  344. package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.d.ts +3 -0
  345. package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js +59 -0
  346. package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js.map +1 -0
  347. package/dist/esm/rendering/webgl2/WebGl2ShaderRuntime.d.ts +2 -0
  348. package/dist/esm/rendering/webgl2/WebGl2ShaderRuntime.js +161 -0
  349. package/dist/esm/rendering/webgl2/WebGl2ShaderRuntime.js.map +1 -0
  350. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +11 -0
  351. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +82 -0
  352. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -0
  353. package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.d.ts +40 -0
  354. package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.js +69 -0
  355. package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.js.map +1 -0
  356. package/dist/esm/rendering/webgl2/glsl/particle.frag.js +4 -0
  357. package/dist/esm/rendering/webgl2/glsl/particle.frag.js.map +1 -0
  358. package/dist/esm/rendering/webgl2/glsl/particle.vert.js +4 -0
  359. package/dist/esm/rendering/webgl2/glsl/particle.vert.js.map +1 -0
  360. package/dist/esm/rendering/webgl2/glsl/primitive.frag.js +4 -0
  361. package/dist/esm/rendering/webgl2/glsl/primitive.frag.js.map +1 -0
  362. package/dist/esm/rendering/webgl2/glsl/primitive.vert.js +4 -0
  363. package/dist/esm/rendering/webgl2/glsl/primitive.vert.js.map +1 -0
  364. package/dist/esm/rendering/webgl2/glsl/sprite.frag.js +4 -0
  365. package/dist/esm/rendering/webgl2/glsl/sprite.frag.js.map +1 -0
  366. package/dist/esm/rendering/webgl2/glsl/sprite.vert.js +4 -0
  367. package/dist/esm/rendering/webgl2/glsl/sprite.vert.js.map +1 -0
  368. package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.d.ts +28 -0
  369. package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.js +50 -0
  370. package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.js.map +1 -0
  371. package/dist/esm/rendering/webgpu/WebGpuBlendState.d.ts +6 -0
  372. package/dist/esm/rendering/webgpu/WebGpuBlendState.js +79 -0
  373. package/dist/esm/rendering/webgpu/WebGpuBlendState.js.map +1 -0
  374. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.d.ts +33 -0
  375. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +443 -0
  376. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js.map +1 -0
  377. package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.d.ts +39 -0
  378. package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.js +489 -0
  379. package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.js.map +1 -0
  380. package/dist/esm/rendering/webgpu/WebGpuRenderManager.d.ts +111 -0
  381. package/dist/esm/rendering/webgpu/WebGpuRenderManager.js +777 -0
  382. package/dist/esm/rendering/webgpu/WebGpuRenderManager.js.map +1 -0
  383. package/dist/esm/rendering/webgpu/WebGpuRendererRuntime.d.ts +8 -0
  384. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +33 -0
  385. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +528 -0
  386. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -0
  387. package/dist/esm/resources/AbstractAssetFactory.d.ts +10 -0
  388. package/dist/esm/resources/AbstractAssetFactory.js +24 -0
  389. package/dist/esm/resources/AbstractAssetFactory.js.map +1 -0
  390. package/dist/esm/resources/AssetFactory.d.ts +6 -0
  391. package/dist/esm/resources/AssetManifest.d.ts +28 -0
  392. package/dist/esm/resources/AssetManifest.js +66 -0
  393. package/dist/esm/resources/AssetManifest.js.map +1 -0
  394. package/dist/esm/resources/CacheFirstStrategy.d.ts +5 -0
  395. package/dist/esm/resources/CacheFirstStrategy.js +34 -0
  396. package/dist/esm/resources/CacheFirstStrategy.js.map +1 -0
  397. package/dist/esm/resources/CacheStore.d.ts +7 -0
  398. package/dist/esm/resources/CacheStrategy.d.ts +12 -0
  399. package/dist/esm/resources/Database.d.ts +13 -0
  400. package/dist/esm/resources/FactoryRegistry.d.ts +9 -0
  401. package/dist/esm/resources/FactoryRegistry.js +42 -0
  402. package/dist/esm/resources/FactoryRegistry.js.map +1 -0
  403. package/dist/esm/resources/IndexedDbDatabase.d.ts +21 -0
  404. package/dist/esm/resources/IndexedDbDatabase.js +143 -0
  405. package/dist/esm/resources/IndexedDbDatabase.js.map +1 -0
  406. package/dist/esm/resources/IndexedDbStore.d.ts +16 -0
  407. package/dist/esm/resources/IndexedDbStore.js +32 -0
  408. package/dist/esm/resources/IndexedDbStore.js.map +1 -0
  409. package/dist/esm/resources/Loader.d.ts +88 -0
  410. package/dist/esm/resources/Loader.js +601 -0
  411. package/dist/esm/resources/Loader.js.map +1 -0
  412. package/dist/esm/resources/NetworkOnlyStrategy.d.ts +5 -0
  413. package/dist/esm/resources/NetworkOnlyStrategy.js +12 -0
  414. package/dist/esm/resources/NetworkOnlyStrategy.js.map +1 -0
  415. package/dist/esm/resources/factories/BinaryFactory.d.ts +6 -0
  416. package/dist/esm/resources/factories/BinaryFactory.js +14 -0
  417. package/dist/esm/resources/factories/BinaryFactory.js.map +1 -0
  418. package/dist/esm/resources/factories/FontFactory.d.ts +13 -0
  419. package/dist/esm/resources/factories/FontFactory.js +36 -0
  420. package/dist/esm/resources/factories/FontFactory.js.map +1 -0
  421. package/dist/esm/resources/factories/ImageFactory.d.ts +10 -0
  422. package/dist/esm/resources/factories/ImageFactory.js +35 -0
  423. package/dist/esm/resources/factories/ImageFactory.js.map +1 -0
  424. package/dist/esm/resources/factories/JsonFactory.d.ts +6 -0
  425. package/dist/esm/resources/factories/JsonFactory.js +14 -0
  426. package/dist/esm/resources/factories/JsonFactory.js.map +1 -0
  427. package/dist/esm/resources/factories/MusicFactory.d.ts +16 -0
  428. package/dist/esm/resources/factories/MusicFactory.js +37 -0
  429. package/dist/esm/resources/factories/MusicFactory.js.map +1 -0
  430. package/dist/esm/resources/factories/SoundFactory.d.ts +14 -0
  431. package/dist/esm/resources/factories/SoundFactory.js +22 -0
  432. package/dist/esm/resources/factories/SoundFactory.js.map +1 -0
  433. package/dist/esm/resources/factories/SvgFactory.d.ts +6 -0
  434. package/dist/esm/resources/factories/SvgFactory.js +34 -0
  435. package/dist/esm/resources/factories/SvgFactory.js.map +1 -0
  436. package/dist/esm/resources/factories/TextFactory.d.ts +6 -0
  437. package/dist/esm/resources/factories/TextFactory.js +14 -0
  438. package/dist/esm/resources/factories/TextFactory.js.map +1 -0
  439. package/dist/esm/resources/factories/TextureFactory.d.ts +13 -0
  440. package/dist/esm/resources/factories/TextureFactory.js +37 -0
  441. package/dist/esm/resources/factories/TextureFactory.js.map +1 -0
  442. package/dist/esm/resources/factories/VideoFactory.d.ts +18 -0
  443. package/dist/esm/resources/factories/VideoFactory.js +40 -0
  444. package/dist/esm/resources/factories/VideoFactory.js.map +1 -0
  445. package/dist/esm/resources/factories/VttFactory.d.ts +6 -0
  446. package/dist/esm/resources/factories/VttFactory.js +57 -0
  447. package/dist/esm/resources/factories/VttFactory.js.map +1 -0
  448. package/dist/esm/resources/factories/WasmFactory.d.ts +6 -0
  449. package/dist/esm/resources/factories/WasmFactory.js +14 -0
  450. package/dist/esm/resources/factories/WasmFactory.js.map +1 -0
  451. package/dist/esm/resources/index.d.ts +26 -0
  452. package/dist/esm/resources/tokens.d.ts +30 -0
  453. package/dist/esm/resources/tokens.js +33 -0
  454. package/dist/esm/resources/tokens.js.map +1 -0
  455. package/dist/esm/resources/utils.d.ts +1 -0
  456. package/dist/esm/resources/utils.js +129 -0
  457. package/dist/esm/resources/utils.js.map +1 -0
  458. package/dist/esm/vendor/webgl-debug.js +1160 -0
  459. package/dist/esm/vendor/webgl-debug.js.map +1 -0
  460. package/dist/exo.esm.js +17111 -0
  461. package/dist/exo.esm.js.map +1 -0
  462. package/dist/exo.esm.min.js +2 -0
  463. package/dist/exo.esm.min.js.map +1 -0
  464. package/dist/exo.global.js +17328 -0
  465. package/dist/exo.global.js.map +1 -0
  466. package/dist/exo.global.min.js +2 -0
  467. package/dist/exo.global.min.js.map +1 -0
  468. package/package.json +96 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,163 @@
1
+ # Changelog
2
+
3
+ All notable changes to ExoJS are documented in this file.
4
+
5
+ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [0.4.0] - 2026-04-26
8
+
9
+ Pre-1.0 versioning reset. The active development line moves from `2.1.2` to `0.4.0` to honestly reflect that the public API is not yet stable. No runtime behavior change relative to the previous head — this release marks a versioning policy shift, not a code rewrite.
10
+
11
+ ### Notes
12
+
13
+ - The `2.x` releases (`2.0.0`, `2.1.0`, `2.1.1`, `2.1.2`) remain published on npm as a historical line and will be deprecated with a pointer to the `0.x` line.
14
+ - New work happens on the `0.x` line. Expect breaking changes between `0.x` minors as the scene graph, renderer, and resource boundaries continue to evolve.
15
+ - `1.0.0` will mark the first stable public API contract. Until then, treat any minor version as potentially breaking and pin exact versions in downstream experiments.
16
+ - Past CHANGELOG entries for `2.x` are preserved below as the historical record of work that landed in those releases.
17
+
18
+ ## [2.1.2] - 2026-04-19
19
+
20
+ Patch release with one runtime fix, a toolchain modernization pass, and a legacy-artifact cleanup. No public API removals or renames.
21
+
22
+ ### Fixed
23
+
24
+ - **`Signal.dispatch` skipped sibling `once()` handlers.** `once()` wrappers self-remove mid-iteration, which compacts the underlying bindings array; the `for..of` iterator then advanced past the binding that shifted into the just-visited slot. `dispatch` now iterates a snapshot of bindings, so handler-driven mutation is safe. Visible symptom: the Audio Visualisation example received a set-up `Music` but an un-set-up `AudioAnalyser`, so frequency buffers stayed at zero.
25
+
26
+ ### Changed
27
+
28
+ - Removed the legacy bundled declaration file `dist/exo.d.ts` (emitted via `tsc --outFile` + `module: amd`, both deprecated in TypeScript 6). Modern consumers resolve types through `exports["."].types`, which points at the per-file tree in `dist/esm/`; `dist/exo.d.ts` was never part of the `exports` map. This also removes the `ignoreDeprecations: "6.0"` escape hatch from the build.
29
+ - Build upgraded to TypeScript 6, ESLint 10, Jest 30. Internal imports now use the `@/*` path alias (mapped to `src/*`) and `baseUrl` is no longer required.
30
+
31
+ ## [2.1.1] - 2026-04-19
32
+
33
+ Patch release fixing a cluster of WebGPU and scene-graph bugs discovered after 2.1.0 shipped. No public API removals or renames; one backward-compatible addition on `Container.addChild`.
34
+
35
+ ### Fixed
36
+
37
+ - **WebGPU adapter ordering.** `WebGpuRenderManager` now requests the GPU adapter before acquiring the canvas WebGPU context. A null adapter previously locked the canvas into WebGPU mode, preventing `Application`'s automatic WebGL2 fallback from obtaining a context on the same element.
38
+ - **WebGL2 shader program binding.** `WebGl2ShaderRuntime.sync()` now binds the program before writing uniforms. The previous draw pipeline never called `bindShader(shader)` with a non-null shader, so every `uniform*` write targeted the wrong or null program and `drawElements` reported "no valid shader program in use". Exposed by the WebGPU adapter fallback above.
39
+ - **WGSL multi-texture sprite shader** uses `textureSampleGrad` with explicit screen-space derivatives. `textureSample`'s uniformity requirement prevented the 8-slot dispatch from compiling on any sprite batch spanning more than one texture slot.
40
+ - **Sprite index buffer** allocation and lifecycle. Buffer size was 4× larger than intended (`indexData.byteLength * BYTES_PER_ELEMENT` instead of `indexData.byteLength`), and `_ensureBatchCapacity` ran inside the draw loop and could destroy a buffer the render pass had already bound. Capacity is now grown once up front.
41
+ - **Sprite multi-batch rendering.** When a flush contained multiple batches (blend-mode change, texture-slot overflow, or pipeline switch), each batch's `queue.writeBuffer(vertexBuffer, offset: 0, ...)` serialised before the single submit, leaving only the last batch's vertex data in the buffer. All batch vertex data is now packed into one CPU buffer at distinct sprite offsets and uploaded once; `drawIndexed` uses `firstIndex` to target each range.
42
+ - **Particle and primitive multi-drawcall rendering.** Same multi-write-to-offset-0 pattern, plus mid-loop `_ensureCapacity` destroying buffers still referenced by the pass. Particle renderer now submits one command buffer per system. Primitive renderer was rewritten: CPU bakes `view * globalTransform` into `vec4` clip-space positions per vertex, pipeline has no bind-group, one render pass per flush with packed vertex/index buffers.
43
+ - **Primitive combine order.** `_combinedTransform.copy(view).combine(global)` produced `global * view` (`Matrix.combine` applies the argument on the left, confirmed by `SceneNode.getGlobalTransform` which chains `local.combine(parent.global)` to yield `parent.global * local`). Swapped to `copy(global).combine(view)` = `view * global`.
44
+ - **WebGPU mipmap generation.** The full-screen downsample triangle's UVs are no longer Y-flipped relative to framebuffer orientation. Every odd mip level was being rendered upside-down, producing a visible sprite flip whenever the view zoomed far enough for the LOD selector to cross an odd/even boundary.
45
+
46
+ ### Added
47
+
48
+ - `Container.addChild` accepts multiple children via rest args (`addChild(...children)`). The previous single-argument signature silently dropped the tail of `addChild(a, b, c, d)`; callers only saw `a` in the scene graph. Single-child usage stays backward compatible.
49
+ - Doc comment on `ParticleOptions.position` clarifying it is in the owning `ParticleSystem`'s local coordinate space. The shader applies the system's global transform on top, so passing world coordinates double-translates the emitter.
50
+
51
+ ## [2.1.0] - 2026-04-18
52
+
53
+ Product-readiness release. Additive across assets, game-feel, visuals, performance, optional physics, and WebGPU parity. No public contracts were removed or renamed since v2.0.0.
54
+
55
+ ### Highlights
56
+
57
+ - Typed asset manifests and bundle loading workflow.
58
+ - `AnimatedSprite` with named clips, loop control, and frame signals.
59
+ - Scene stacking with participation policies, input routing, and fade transitions.
60
+ - View/camera polish: follow with lerp, bounds clamp, zoom, shake.
61
+ - Audio sprites and sound pooling.
62
+ - Visual capability wave: filter pipeline, masking, render passes, cache-as-bitmap, multi-texture batching on the WebGPU backend.
63
+ - Automatic off-screen culling with observable render stats.
64
+ - Optional Rapier physics integration behind an optional peer dependency.
65
+ - WebGPU parity improvements and clearer initialization failure semantics.
66
+ - Docs and examples overhaul; release verification hardening.
67
+
68
+ ### Assets / workflow
69
+
70
+ - `defineAssetManifest`, `AssetEntry`, and `loadBundle` with progress callbacks.
71
+ - `BundleLoadError` surfaces per-entry failures with the responsible loader token.
72
+ - Strict manifest validation runs at definition time.
73
+ - `CacheStore` + `IndexedDbStore` remain the persistence path; strategy classes (`CacheFirstStrategy`, `NetworkOnlyStrategy`) are exposed for custom pipelines.
74
+
75
+ ### Game-feel
76
+
77
+ - `AnimatedSprite`: `defineClip`, `setClips`, `play`, `stop`, `loop` override, `onComplete` and `onFrame` signals.
78
+ - `SceneManager` is now a real stack: `pushScene`, `popScene`, `setScene` with resolved `SceneParticipationPolicy` covering stack mode and input mode.
79
+ - `SceneInputEvent` routing honours stack participation so overlay/modal scenes can intercept input cleanly.
80
+ - Fade transitions integrated into scene switching.
81
+ - `View` camera: `follow` with lerp, `setBoundsConstraint`, `zoom`/`setZoom`, `shake` with decay and configurable frequency.
82
+ - `Sound`: `setPoolSize`, `playPooled`, `stopPooled`, `defineSprite`, `setSprites` for audio-sprite playback.
83
+
84
+ ### Rendering / visuals
85
+
86
+ - Filter pipeline: abstract `Filter` base with `BlurFilter` and `ColorFilter` implementations; per-node filter chains wired through the render runtime.
87
+ - Masking support in both render managers and on `RenderNode`.
88
+ - Render-pass composition: `RenderTargetPass`, `CallbackRenderPass`, `RenderTarget`, and the existing `RenderTexture` for off-screen work.
89
+ - `RenderNode.cacheAsBitmap` flattens expensive subtrees to a cached texture with invalidation.
90
+ - `Container.sortableChildren` + `SceneNode.zIndex` provide depth-sorted rendering with a stable fallback on insertion order.
91
+ - Multi-texture batching on the WebGPU sprite renderer (`textureSlots`, `maxBatchTextures`). See caveat below.
92
+ - WebGPU sprite, particle, and primitive renderers reached functional parity with the WebGL2 equivalents.
93
+ - Context-loss handling preserved.
94
+
95
+ ### Performance
96
+
97
+ - Automatic off-screen culling: `Drawable` checks `inView(view)` each frame and counts skipped nodes.
98
+ - `RenderStats` exposes `submittedNodes`, `culledNodes`, `drawCalls`, `batches`, `renderPasses`, and `frameTimeMs` for observability.
99
+ - Hot-path cleanup across the renderers.
100
+ - `npm run perf:benchmark` runs the rendering benchmark harness under `test/perf/`.
101
+
102
+ ### Physics
103
+
104
+ - Optional Rapier integration via `createRapierPhysicsWorld({ gravityY })`.
105
+ - `@dimforge/rapier2d-compat` is declared as an optional `peerDependency`; apps that do not import the physics entry point incur zero runtime cost.
106
+ - Collision groups/masks encoded into Rapier's 16/16 packed format; `PhysicsCollisionFilter` lets you declare membership and what each body collides with.
107
+ - Triggers vs. solid colliders distinguished via `trigger` on the descriptor; `onTriggerEnter` / `onTriggerExit` signals on the body.
108
+ - Transform sync helpers and a `createDebugGraphics`/`updateDebugGraphics` path for debug draw through the existing `Graphics` primitive.
109
+
110
+ ### WebGPU
111
+
112
+ - Sprite, particle, and primitive renderers now cover the WebGL2 feature surface used by the scene runtime.
113
+ - Explicit `backend: { type: 'webgpu' }` errors out if WebGPU is unavailable or initialization fails — failures are not silently swallowed.
114
+ - `backend: { type: 'auto' }` prefers WebGPU when `navigator.gpu` is present and falls back to WebGL2 only when the WebGPU init path throws.
115
+ - Initialization error paths are now observable through the thrown error rather than partially constructed state.
116
+
117
+ ### Docs / examples
118
+
119
+ - README rewritten to match the shipped surface.
120
+ - New docs hub under `docs/` with sections for getting-started, core-concepts, assets, scenes, rendering, audio, physics, performance, and examples.
121
+ - New class-focused API pages: `Application`, `Renderer`, `Graphics`, `AnimatedSprite`, `AssetManifests`, `Audio`, `View`, `VisualEffects`, `PhysicsRapier`, `Performance`, `GameFeel`.
122
+ - `examples/` folder contains focused source snippets (`01-quickstart.ts` … `08-physics-rapier.ts`) that are typechecked against the public API via `tsconfig.examples.json`.
123
+
124
+ ### Tooling / release quality
125
+
126
+ - `npm run typecheck:examples` typechecks the in-repo examples against `src/` to prevent example drift.
127
+ - `npm run verify:exports` validates the package entry graph (`scripts/verify-exports.mjs`).
128
+ - `npm run verify:package` runs build → example typecheck → export verification → `npm pack --dry-run`.
129
+ - `npm run verify:release` is the smallest release gate: typecheck → lint → tests → verify:package.
130
+ - CI runs lint, typecheck, tests, bundle build, declaration build, example typecheck, export verification, and pack dry-run on every PR to `master`.
131
+
132
+ ### Behaviour changes worth knowing
133
+
134
+ These are minor-level behaviour changes, not source-breaks; flagged here for transparency:
135
+
136
+ - **Automatic culling**: nodes whose `inView(view)` check is false are no longer submitted and are counted in `RenderStats.culledNodes`. Apps that were already relying on correct bounds see no observable change. If a custom drawable under-reports its bounds, it may now be skipped when it was previously drawn off-screen.
137
+ - **Scene input routing**: with the new stack, input dispatch honours the resolved `SceneInputMode` of each stack entry. Apps that only use `setScene(...)` with no `pushScene` keep single-scene v2.0.0 behaviour.
138
+ - **Explicit WebGPU failures**: `backend: { type: 'webgpu' }` now throws rather than silently picking WebGL2. Apps that want the old "try WebGPU, otherwise WebGL2" behaviour should use `backend: { type: 'auto' }`.
139
+
140
+ ### Known limitations / honest caveats
141
+
142
+ - **WebGL2 is still single-texture batched.** Multi-texture batching is implemented only in the WebGPU sprite renderer. WebGL2 sprite-heavy scenes will still flush on texture changes.
143
+ - **WebGPU is improved, not "production WebGPU".** Treat the WebGPU backend as functional parity with WebGL2 for the features this library ships, not as a general-purpose WebGPU renderer.
144
+ - **Rapier is optional.** If you never import the physics entry point, Rapier is not installed or loaded. It is not bundled with the library.
145
+ - **Tilemaps are not in scope.** There is no built-in tilemap renderer; engines targeting Tiled-centric games should continue to reach for dedicated tooling.
146
+ - **Bitmap fonts are not shipped.** `Text` renders via Canvas with stroke support; `BitmapText` is not included.
147
+ - **No tween library.** Animation curves and tween orchestration are left to consumer code or external libraries.
148
+ - **Audio remains Web Audio decoded/streaming with pooling and sprites.** Spatial audio (`PannerNode`), effects (`ConvolverNode`, `BiquadFilterNode`, `DynamicsCompressorNode`), and fade helpers are not part of this release.
149
+ - **Particles are still CPU-simulated.** The WebGPU particle renderer is a rendering path, not a GPU compute simulator.
150
+ - **Graphics: no gradients, patterns, caps/joins, or dashing.** Basic fills and strokes only.
151
+ - **Input gaps unchanged from 2.0.0**: no haptics/vibration, no rebinding capture, no gesture library, fixed gamepad dead zones.
152
+
153
+ ### Upgrading from 2.0.0
154
+
155
+ No code changes are required for typical applications. Review the behaviour-change notes above if your code:
156
+
157
+ - requests `backend: { type: 'webgpu' }` explicitly and was relying on silent fallback,
158
+ - implements a custom `Drawable` with inexact bounds,
159
+ - pushed multiple scenes via manual orchestration outside `SceneManager`.
160
+
161
+ ## [2.0.0] - previous major
162
+
163
+ Baseline for the modernized architecture wave (renderer runtime, scene runtime, class-token loader v2, math and rendering contract renames).
package/README.md ADDED
@@ -0,0 +1,141 @@
1
+ # ExoJS
2
+
3
+ ExoJS is a TypeScript-first 2D runtime for browser games and interactive apps. It is designed around explicit scene flow, practical rendering features, and predictable runtime behavior.
4
+
5
+ ## Project status
6
+
7
+ ExoJS is **pre-1.0**. The public API is still under active design — scene graph, rendering pipeline, and resource lifecycle boundaries may change between minor versions. Pin exact versions in downstream experiments. `1.0.0` will mark the first stable API contract.
8
+
9
+ ## Why ExoJS
10
+
11
+ - TypeScript-first API surface with strong runtime contracts
12
+ - Scene and asset workflows built for real game loops
13
+ - Modern rendering stack: WebGPU-first with WebGL2 fallback
14
+ - Practical visuals: filters, masks, render passes, cache-as-bitmap
15
+ - Gameplay tools: animated sprites, scene stacking, camera helpers, audio sprites
16
+ - Performance visibility with built-in render stats and benchmark harness
17
+ - Optional Rapier physics integration without forcing physics on every app
18
+
19
+ ## What Is Shipped Today
20
+
21
+ - `Application`, `Scene`, and scene-manager lifecycle
22
+ - Typed `Loader` with manifest/bundle workflow (`defineAssetManifest`, `registerManifest`, `loadBundle`)
23
+ - Drawables: `Sprite`, `AnimatedSprite`, `Graphics`, `ParticleSystem`, `Text`, `Video`
24
+ - Scene stacking (`overlay` / `modal` / `opaque`) with input routing and fade transitions
25
+ - View/camera helpers (`follow`, bounds clamp, shake, zoom)
26
+ - Rendering composition primitives (`RenderTexture`, `RenderTargetPass`, filter chains, masks, cache-as-bitmap)
27
+ - Render stats (`submittedNodes`, `culledNodes`, `drawCalls`, `batches`, `renderPasses`, ...)
28
+ - Optional Rapier adapter (`createRapierPhysicsWorld`)
29
+
30
+ ## Installation
31
+
32
+ ```bash
33
+ npm install exojs
34
+ ```
35
+
36
+ ## Quickstart
37
+
38
+ ```ts
39
+ import { Application, Scene, Graphics, Color, type SceneRenderRuntime } from 'exojs';
40
+
41
+ class HelloScene extends Scene {
42
+ private readonly box = new Graphics();
43
+
44
+ public constructor() {
45
+ super();
46
+
47
+ this.box.fillColor = Color.white;
48
+ this.box.drawRectangle(-32, -32, 64, 64);
49
+ this.box.setPosition(400, 300);
50
+
51
+ this.addChild(this.box);
52
+ }
53
+
54
+ public override update(delta: import('exojs').Time): void {
55
+ this.box.rotation += delta.seconds * 45;
56
+ }
57
+
58
+ public override draw(runtime: SceneRenderRuntime): void {
59
+ this.root.render(runtime);
60
+ }
61
+ }
62
+
63
+ const canvas = document.querySelector('canvas');
64
+
65
+ if (!canvas) {
66
+ throw new Error('Missing <canvas> element.');
67
+ }
68
+
69
+ const app = new Application({
70
+ canvas,
71
+ width: 800,
72
+ height: 600,
73
+ clearColor: Color.cornflowerBlue,
74
+ });
75
+
76
+ await app.start(new HelloScene());
77
+ ```
78
+
79
+ ## Next Steps
80
+
81
+ - Documentation hub: [docs/README.md](docs/README.md)
82
+ - Getting started: [docs/getting-started/quickstart.md](docs/getting-started/quickstart.md)
83
+ - Core concepts: [docs/core-concepts/overview.md](docs/core-concepts/overview.md)
84
+ - Assets and bundles: [docs/assets/loader-and-bundles.md](docs/assets/loader-and-bundles.md)
85
+ - Scenes and stack flow: [docs/scenes/scene-flow.md](docs/scenes/scene-flow.md)
86
+ - Rendering and visuals: [docs/rendering/visual-capabilities.md](docs/rendering/visual-capabilities.md)
87
+ - Audio workflow: [docs/audio/audio-workflow.md](docs/audio/audio-workflow.md)
88
+ - Optional physics: [docs/physics/rapier-integration.md](docs/physics/rapier-integration.md)
89
+ - Performance/debugging: [docs/performance/performance-and-debugging.md](docs/performance/performance-and-debugging.md)
90
+ - API reference: [docs/api/README.md](docs/api/README.md)
91
+ - In-repo examples: [examples/README.md](examples/README.md)
92
+
93
+ ## WebGPU and WebGL2
94
+
95
+ `Application` defaults to backend auto-selection:
96
+
97
+ - prefers WebGPU when available
98
+ - falls back to WebGL2 if WebGPU is unavailable or initialization fails
99
+
100
+ You can force backend selection when needed:
101
+
102
+ ```ts
103
+ new Application({ backend: { type: 'webgpu' } });
104
+ new Application({ backend: { type: 'webgl2' } });
105
+ new Application({ backend: { type: 'auto' } });
106
+ ```
107
+
108
+ ## Optional Rapier Physics
109
+
110
+ Rapier integration is opt-in and loaded only when you use it.
111
+
112
+ ```ts
113
+ import { createRapierPhysicsWorld } from 'exojs';
114
+
115
+ const physics = await createRapierPhysicsWorld({ gravityY: 9.81 });
116
+ ```
117
+
118
+ If Rapier is unavailable, creation fails with a clear setup error.
119
+
120
+ ## Examples
121
+
122
+ The runnable live site (Astro + Lit + Monaco preview) lives in [`examples/`](examples/README.md) and is deployed as the repository's GitHub Pages site at <https://exoridus.github.io/ExoJS/>.
123
+
124
+ ## Development
125
+
126
+ ```bash
127
+ npm run typecheck
128
+ npm run lint
129
+ npm test
130
+ npm run build
131
+ npm run verify:package
132
+ npm run perf:benchmark
133
+ ```
134
+
135
+ Internal imports use the `@/*` path alias (mapped to `src/*`) — the same convention used by Vite, Next.js, and other modern TypeScript setups. Building the library requires TypeScript 6.
136
+
137
+ ## Links
138
+
139
+ - Repository: <https://github.com/Exoridus/ExoJS>
140
+ - Issues: <https://github.com/Exoridus/ExoJS/issues>
141
+ - Changelog: [CHANGELOG.md](CHANGELOG.md)
@@ -0,0 +1,45 @@
1
+ import type { Media } from '@/audio/Media';
2
+ import { Signal } from '@/core/Signal';
3
+ import type { PlaybackOptions } from '@/core/types';
4
+ export interface AbstractMediaInitialState extends Omit<PlaybackOptions, 'time'> {
5
+ duration: number;
6
+ }
7
+ export declare abstract class AbstractMedia implements Media {
8
+ readonly onStart: Signal<[]>;
9
+ readonly onStop: Signal<[]>;
10
+ protected readonly _duration: number;
11
+ protected _volume: number;
12
+ protected _playbackRate: number;
13
+ protected _loop: boolean;
14
+ protected _muted: boolean;
15
+ abstract get paused(): boolean;
16
+ abstract set paused(paused: boolean);
17
+ abstract get analyserTarget(): AudioNode | null;
18
+ get duration(): number;
19
+ get volume(): number;
20
+ set volume(volume: number);
21
+ get loop(): boolean;
22
+ set loop(loop: boolean);
23
+ get playbackRate(): number;
24
+ set playbackRate(playbackRate: number);
25
+ get currentTime(): number;
26
+ set currentTime(currentTime: number);
27
+ get muted(): boolean;
28
+ set muted(muted: boolean);
29
+ get progress(): number;
30
+ get playing(): boolean;
31
+ set playing(playing: boolean);
32
+ protected constructor(initialState: AbstractMediaInitialState);
33
+ abstract play(options?: Partial<PlaybackOptions>): this;
34
+ abstract pause(options?: Partial<PlaybackOptions>): this;
35
+ abstract setVolume(volume: number): this;
36
+ abstract setLoop(loop: boolean): this;
37
+ abstract setPlaybackRate(playbackRate: number): this;
38
+ abstract getTime(): number;
39
+ abstract setTime(time: number): this;
40
+ abstract setMuted(muted: boolean): this;
41
+ stop(options?: Partial<PlaybackOptions>): this;
42
+ toggle(options?: Partial<PlaybackOptions>): this;
43
+ applyOptions(options?: Partial<PlaybackOptions>): this;
44
+ destroy(): void;
45
+ }
@@ -0,0 +1,103 @@
1
+ import { Signal } from '../core/Signal.js';
2
+
3
+ class AbstractMedia {
4
+ onStart = new Signal();
5
+ onStop = new Signal();
6
+ _duration;
7
+ _volume;
8
+ _playbackRate;
9
+ _loop;
10
+ _muted;
11
+ get duration() {
12
+ return this._duration;
13
+ }
14
+ get volume() {
15
+ return this._volume;
16
+ }
17
+ set volume(volume) {
18
+ this.setVolume(volume);
19
+ }
20
+ get loop() {
21
+ return this._loop;
22
+ }
23
+ set loop(loop) {
24
+ this.setLoop(loop);
25
+ }
26
+ get playbackRate() {
27
+ return this._playbackRate;
28
+ }
29
+ set playbackRate(playbackRate) {
30
+ this.setPlaybackRate(playbackRate);
31
+ }
32
+ get currentTime() {
33
+ return this.getTime();
34
+ }
35
+ set currentTime(currentTime) {
36
+ this.setTime(currentTime);
37
+ }
38
+ get muted() {
39
+ return this._muted;
40
+ }
41
+ set muted(muted) {
42
+ this.setMuted(muted);
43
+ }
44
+ get progress() {
45
+ const elapsed = this.currentTime;
46
+ const duration = this.duration;
47
+ return ((elapsed % duration) / duration);
48
+ }
49
+ get playing() {
50
+ return !this.paused;
51
+ }
52
+ set playing(playing) {
53
+ if (playing) {
54
+ this.play();
55
+ }
56
+ else {
57
+ this.pause();
58
+ }
59
+ }
60
+ constructor(initialState) {
61
+ const { duration, volume, playbackRate, loop, muted } = initialState;
62
+ this._duration = duration;
63
+ this._volume = volume;
64
+ this._playbackRate = playbackRate;
65
+ this._loop = loop;
66
+ this._muted = muted;
67
+ }
68
+ stop(options) {
69
+ this.pause(options);
70
+ this.currentTime = 0;
71
+ return this;
72
+ }
73
+ toggle(options) {
74
+ return this.paused ? this.play(options) : this.pause(options);
75
+ }
76
+ applyOptions(options = {}) {
77
+ const { volume, loop, playbackRate, time, muted } = options;
78
+ if (volume !== undefined) {
79
+ this.volume = volume;
80
+ }
81
+ if (loop !== undefined) {
82
+ this.loop = loop;
83
+ }
84
+ if (playbackRate !== undefined) {
85
+ this.playbackRate = playbackRate;
86
+ }
87
+ if (time !== undefined) {
88
+ this.currentTime = time;
89
+ }
90
+ if (muted !== undefined) {
91
+ this.muted = muted;
92
+ }
93
+ return this;
94
+ }
95
+ destroy() {
96
+ this.stop();
97
+ this.onStart.destroy();
98
+ this.onStop.destroy();
99
+ }
100
+ }
101
+
102
+ export { AbstractMedia };
103
+ //# sourceMappingURL=AbstractMedia.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractMedia.js","sources":["../../../../src/audio/AbstractMedia.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { Media } from '@/audio/Media';
2
+ export interface AudioAnalyserOptions {
3
+ fftSize: number;
4
+ minDecibels: number;
5
+ maxDecibels: number;
6
+ smoothingTimeConstant: number;
7
+ }
8
+ export declare class AudioAnalyser {
9
+ private readonly _media;
10
+ private readonly _fftSize;
11
+ private readonly _minDecibels;
12
+ private readonly _maxDecibels;
13
+ private readonly _smoothingTimeConstant;
14
+ private readonly _frequencyBinCount;
15
+ private readonly _timeDomainData;
16
+ private readonly _frequencyData;
17
+ private readonly _preciseTimeDomainData;
18
+ private readonly _preciseFrequencyData;
19
+ private _analyser;
20
+ private _audioContext;
21
+ private _analyserTarget;
22
+ constructor(media: Media, options?: Partial<AudioAnalyserOptions>);
23
+ connect(): this;
24
+ get timeDomainData(): Uint8Array;
25
+ get frequencyData(): Uint8Array;
26
+ get preciseTimeDomainData(): Float32Array;
27
+ get preciseFrequencyData(): Float32Array;
28
+ destroy(): void;
29
+ private setupWithAudioContext;
30
+ }
@@ -0,0 +1,92 @@
1
+ import { isAudioContextReady, getAudioContext, onAudioContextReady } from './audio-context.js';
2
+
3
+ class AudioAnalyser {
4
+ _media;
5
+ _fftSize;
6
+ _minDecibels;
7
+ _maxDecibels;
8
+ _smoothingTimeConstant;
9
+ _frequencyBinCount;
10
+ _timeDomainData;
11
+ _frequencyData;
12
+ _preciseTimeDomainData;
13
+ _preciseFrequencyData;
14
+ _analyser = null;
15
+ _audioContext = null;
16
+ _analyserTarget = null;
17
+ constructor(media, options = {}) {
18
+ const { fftSize, minDecibels, maxDecibels, smoothingTimeConstant } = options;
19
+ this._media = media;
20
+ this._fftSize = fftSize ?? 2048;
21
+ this._minDecibels = minDecibels ?? -100;
22
+ this._maxDecibels = maxDecibels ?? -30;
23
+ this._smoothingTimeConstant = smoothingTimeConstant ?? 0.8;
24
+ this._frequencyBinCount = this._fftSize / 2;
25
+ this._timeDomainData = new Uint8Array(this._frequencyBinCount);
26
+ this._frequencyData = new Uint8Array(this._frequencyBinCount);
27
+ this._preciseTimeDomainData = new Float32Array(this._frequencyBinCount);
28
+ this._preciseFrequencyData = new Float32Array(this._frequencyBinCount);
29
+ if (isAudioContextReady()) {
30
+ this.setupWithAudioContext(getAudioContext());
31
+ }
32
+ else {
33
+ onAudioContextReady.once(this.setupWithAudioContext, this);
34
+ }
35
+ }
36
+ connect() {
37
+ if (!this._analyser || this._analyserTarget !== null) {
38
+ return this;
39
+ }
40
+ const analyserTarget = this._media.analyserTarget;
41
+ if (!analyserTarget) {
42
+ throw new Error('No AudioNode on property analyserTarget.');
43
+ }
44
+ this._analyserTarget = analyserTarget;
45
+ analyserTarget.connect(this._analyser);
46
+ return this;
47
+ }
48
+ get timeDomainData() {
49
+ if (this._analyser) {
50
+ this.connect();
51
+ this._analyser.getByteTimeDomainData(this._timeDomainData);
52
+ }
53
+ return this._timeDomainData;
54
+ }
55
+ get frequencyData() {
56
+ if (this._analyser) {
57
+ this.connect();
58
+ this._analyser.getByteFrequencyData(this._frequencyData);
59
+ }
60
+ return this._frequencyData;
61
+ }
62
+ get preciseTimeDomainData() {
63
+ if (this._analyser) {
64
+ this.connect();
65
+ this._analyser.getFloatTimeDomainData(this._preciseTimeDomainData);
66
+ }
67
+ return this._preciseTimeDomainData;
68
+ }
69
+ get preciseFrequencyData() {
70
+ if (this._analyser) {
71
+ this.connect();
72
+ this._analyser.getFloatFrequencyData(this._preciseFrequencyData);
73
+ }
74
+ return this._preciseFrequencyData;
75
+ }
76
+ destroy() {
77
+ onAudioContextReady.clearByContext(this);
78
+ this._analyserTarget?.disconnect();
79
+ this._analyser?.disconnect();
80
+ }
81
+ setupWithAudioContext(audioContext) {
82
+ this._audioContext = audioContext;
83
+ this._analyser = audioContext.createAnalyser();
84
+ this._analyser.fftSize = this._fftSize;
85
+ this._analyser.minDecibels = this._minDecibels;
86
+ this._analyser.maxDecibels = this._maxDecibels;
87
+ this._analyser.smoothingTimeConstant = this._smoothingTimeConstant;
88
+ }
89
+ }
90
+
91
+ export { AudioAnalyser };
92
+ //# sourceMappingURL=AudioAnalyser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioAnalyser.js","sources":["../../../../src/audio/AudioAnalyser.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { PlaybackOptions } from '@/core/types';
2
+ export interface Media {
3
+ readonly duration: number;
4
+ readonly progress: number;
5
+ readonly analyserTarget: AudioNode | null;
6
+ volume: number;
7
+ loop: boolean;
8
+ playbackRate: number;
9
+ currentTime: number;
10
+ muted: boolean;
11
+ paused: boolean;
12
+ playing: boolean;
13
+ play(options?: Partial<PlaybackOptions>): this;
14
+ pause(options?: Partial<PlaybackOptions>): this;
15
+ stop(options?: Partial<PlaybackOptions>): this;
16
+ toggle(options?: Partial<PlaybackOptions>): this;
17
+ applyOptions(options: Partial<PlaybackOptions>): this;
18
+ setVolume(volume: number): this;
19
+ setLoop(loop: boolean): this;
20
+ setPlaybackRate(playbackRate: number): this;
21
+ getTime(): number;
22
+ setTime(time: number): this;
23
+ setMuted(muted: boolean): this;
24
+ destroy(): void;
25
+ }
@@ -0,0 +1,20 @@
1
+ import type { PlaybackOptions } from '@/core/types';
2
+ import { AbstractMedia } from '@/audio/AbstractMedia';
3
+ export declare class Music extends AbstractMedia {
4
+ private readonly _audioElement;
5
+ private _audioSetup;
6
+ constructor(audioElement: HTMLAudioElement, options?: Partial<PlaybackOptions>);
7
+ setVolume(value: number): this;
8
+ setLoop(loop: boolean): this;
9
+ setPlaybackRate(value: number): this;
10
+ getTime(): number;
11
+ setTime(currentTime: number): this;
12
+ setMuted(muted: boolean): this;
13
+ get paused(): boolean;
14
+ set paused(paused: boolean);
15
+ get analyserTarget(): AudioNode | null;
16
+ play(options?: Partial<PlaybackOptions>): this;
17
+ pause(options?: Partial<PlaybackOptions>): this;
18
+ destroy(): void;
19
+ private setupWithAudioContext;
20
+ }