@codexo/exojs 0.8.4 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) hide show
  1. package/CHANGELOG.md +99 -0
  2. package/README.md +34 -13
  3. package/dist/esm/animation/Tween.d.ts +20 -3
  4. package/dist/esm/animation/Tween.js +16 -8
  5. package/dist/esm/animation/Tween.js.map +1 -1
  6. package/dist/esm/animation/TweenManager.d.ts +16 -1
  7. package/dist/esm/animation/TweenManager.js +27 -2
  8. package/dist/esm/animation/TweenManager.js.map +1 -1
  9. package/dist/esm/audio/AudioAnalyser.d.ts +2 -0
  10. package/dist/esm/audio/AudioAnalyser.js +24 -9
  11. package/dist/esm/audio/AudioAnalyser.js.map +1 -1
  12. package/dist/esm/audio/AudioBus.d.ts +1 -0
  13. package/dist/esm/audio/AudioBus.js +8 -4
  14. package/dist/esm/audio/AudioBus.js.map +1 -1
  15. package/dist/esm/audio/AudioListener.d.ts +1 -0
  16. package/dist/esm/audio/AudioListener.js +7 -5
  17. package/dist/esm/audio/AudioListener.js.map +1 -1
  18. package/dist/esm/audio/AudioManager.d.ts +8 -2
  19. package/dist/esm/audio/AudioManager.js +14 -1
  20. package/dist/esm/audio/AudioManager.js.map +1 -1
  21. package/dist/esm/audio/BeatDetector.d.ts +2 -0
  22. package/dist/esm/audio/BeatDetector.js +27 -661
  23. package/dist/esm/audio/BeatDetector.js.map +1 -1
  24. package/dist/esm/audio/Music.d.ts +1 -0
  25. package/dist/esm/audio/Music.js +7 -3
  26. package/dist/esm/audio/Music.js.map +1 -1
  27. package/dist/esm/audio/OscillatorSound.d.ts +1 -0
  28. package/dist/esm/audio/OscillatorSound.js +7 -3
  29. package/dist/esm/audio/OscillatorSound.js.map +1 -1
  30. package/dist/esm/audio/Sound.d.ts +1 -0
  31. package/dist/esm/audio/Sound.js +7 -3
  32. package/dist/esm/audio/Sound.js.map +1 -1
  33. package/dist/esm/audio/audio-context.d.ts +2 -2
  34. package/dist/esm/audio/audio-context.js +4 -4
  35. package/dist/esm/audio/audio-context.js.map +1 -1
  36. package/dist/esm/audio/filters/ChorusFilter.d.ts +1 -0
  37. package/dist/esm/audio/filters/ChorusFilter.js +7 -3
  38. package/dist/esm/audio/filters/ChorusFilter.js.map +1 -1
  39. package/dist/esm/audio/filters/CompressorFilter.d.ts +1 -0
  40. package/dist/esm/audio/filters/CompressorFilter.js +7 -3
  41. package/dist/esm/audio/filters/CompressorFilter.js.map +1 -1
  42. package/dist/esm/audio/filters/DelayFilter.d.ts +1 -0
  43. package/dist/esm/audio/filters/DelayFilter.js +7 -3
  44. package/dist/esm/audio/filters/DelayFilter.js.map +1 -1
  45. package/dist/esm/audio/filters/EqualizerFilter.d.ts +1 -0
  46. package/dist/esm/audio/filters/EqualizerFilter.js +7 -3
  47. package/dist/esm/audio/filters/EqualizerFilter.js.map +1 -1
  48. package/dist/esm/audio/filters/GranularFilter.js +1 -86
  49. package/dist/esm/audio/filters/GranularFilter.js.map +1 -1
  50. package/dist/esm/audio/filters/HighpassFilter.d.ts +1 -0
  51. package/dist/esm/audio/filters/HighpassFilter.js +7 -3
  52. package/dist/esm/audio/filters/HighpassFilter.js.map +1 -1
  53. package/dist/esm/audio/filters/LowpassFilter.d.ts +1 -0
  54. package/dist/esm/audio/filters/LowpassFilter.js +7 -3
  55. package/dist/esm/audio/filters/LowpassFilter.js.map +1 -1
  56. package/dist/esm/audio/filters/PitchShiftFilter.js +1 -71
  57. package/dist/esm/audio/filters/PitchShiftFilter.js.map +1 -1
  58. package/dist/esm/audio/filters/ReverbFilter.d.ts +1 -0
  59. package/dist/esm/audio/filters/ReverbFilter.js +7 -3
  60. package/dist/esm/audio/filters/ReverbFilter.js.map +1 -1
  61. package/dist/esm/audio/filters/VocoderFilter.js +1 -89
  62. package/dist/esm/audio/filters/VocoderFilter.js.map +1 -1
  63. package/dist/esm/audio/filters/WorkletFilter.d.ts +2 -0
  64. package/dist/esm/audio/filters/WorkletFilter.js +10 -5
  65. package/dist/esm/audio/filters/WorkletFilter.js.map +1 -1
  66. package/dist/esm/audio/index.d.ts +15 -10
  67. package/dist/esm/audio/worklet/registerWorklet.d.ts +1 -1
  68. package/dist/esm/audio/worklet/registerWorklet.js +2 -2
  69. package/dist/esm/audio/worklet/registerWorklet.js.map +1 -1
  70. package/dist/esm/audio/worklets/beat-detector.worklet.d.ts +1 -0
  71. package/dist/esm/audio/worklets/beat-detector.worklet.js +647 -0
  72. package/dist/esm/audio/worklets/beat-detector.worklet.js.map +1 -0
  73. package/dist/esm/audio/worklets/granular.worklet.d.ts +1 -0
  74. package/dist/esm/audio/worklets/granular.worklet.js +89 -0
  75. package/dist/esm/audio/worklets/granular.worklet.js.map +1 -0
  76. package/dist/esm/audio/worklets/pitch-shift.worklet.d.ts +1 -0
  77. package/dist/esm/audio/worklets/pitch-shift.worklet.js +74 -0
  78. package/dist/esm/audio/worklets/pitch-shift.worklet.js.map +1 -0
  79. package/dist/esm/audio/worklets/vocoder.worklet.d.ts +1 -0
  80. package/dist/esm/audio/worklets/vocoder.worklet.js +92 -0
  81. package/dist/esm/audio/worklets/vocoder.worklet.js.map +1 -0
  82. package/dist/esm/core/Application.d.ts +86 -29
  83. package/dist/esm/core/Application.js +157 -47
  84. package/dist/esm/core/Application.js.map +1 -1
  85. package/dist/esm/core/Color.d.ts +0 -8
  86. package/dist/esm/core/Color.js +0 -24
  87. package/dist/esm/core/Color.js.map +1 -1
  88. package/dist/esm/core/Perf.d.ts +23 -0
  89. package/dist/esm/core/Perf.js +49 -0
  90. package/dist/esm/core/Perf.js.map +1 -0
  91. package/dist/esm/core/Scene.d.ts +40 -80
  92. package/dist/esm/core/Scene.js +63 -43
  93. package/dist/esm/core/Scene.js.map +1 -1
  94. package/dist/esm/core/SceneManager.d.ts +11 -25
  95. package/dist/esm/core/SceneManager.js +37 -100
  96. package/dist/esm/core/SceneManager.js.map +1 -1
  97. package/dist/esm/core/SceneNode.d.ts +28 -17
  98. package/dist/esm/core/SceneNode.js +66 -42
  99. package/dist/esm/core/SceneNode.js.map +1 -1
  100. package/dist/esm/core/Signal.d.ts +24 -28
  101. package/dist/esm/core/Signal.js +64 -50
  102. package/dist/esm/core/Signal.js.map +1 -1
  103. package/dist/esm/core/Timer.d.ts +1 -0
  104. package/dist/esm/core/Timer.js +3 -0
  105. package/dist/esm/core/Timer.js.map +1 -1
  106. package/dist/esm/core/capabilities.d.ts +2 -0
  107. package/dist/esm/core/capabilities.js +15 -0
  108. package/dist/esm/core/capabilities.js.map +1 -1
  109. package/dist/esm/core/index.d.ts +1 -0
  110. package/dist/esm/core/types.d.ts +1 -1
  111. package/dist/esm/core/utils.d.ts +12 -0
  112. package/dist/esm/core/utils.js +18 -1
  113. package/dist/esm/core/utils.js.map +1 -1
  114. package/dist/esm/debug/BoundingBoxesLayer.js +1 -1
  115. package/dist/esm/debug/BoundingBoxesLayer.js.map +1 -1
  116. package/dist/esm/debug/HitTestLayer.js +1 -1
  117. package/dist/esm/debug/HitTestLayer.js.map +1 -1
  118. package/dist/esm/debug/PerformanceLayer.js +1 -2
  119. package/dist/esm/debug/PerformanceLayer.js.map +1 -1
  120. package/dist/esm/debug/PointerStackLayer.js +1 -2
  121. package/dist/esm/debug/PointerStackLayer.js.map +1 -1
  122. package/dist/esm/debug/RenderPassInspectorLayer.js +1 -2
  123. package/dist/esm/debug/RenderPassInspectorLayer.js.map +1 -1
  124. package/dist/esm/index.js +37 -10
  125. package/dist/esm/index.js.map +1 -1
  126. package/dist/esm/input/InputManager.d.ts +1 -0
  127. package/dist/esm/input/InputManager.js +30 -3
  128. package/dist/esm/input/InputManager.js.map +1 -1
  129. package/dist/esm/input/InteractionManager.d.ts +5 -2
  130. package/dist/esm/input/InteractionManager.js +29 -18
  131. package/dist/esm/input/InteractionManager.js.map +1 -1
  132. package/dist/esm/input/Pointer.js +3 -2
  133. package/dist/esm/input/Pointer.js.map +1 -1
  134. package/dist/esm/input/internal/interactionManagerRegistry.d.ts +9 -0
  135. package/dist/esm/input/internal/interactionManagerRegistry.js +10 -0
  136. package/dist/esm/input/internal/interactionManagerRegistry.js.map +1 -0
  137. package/dist/esm/math/AbstractVector.d.ts +1 -7
  138. package/dist/esm/math/AbstractVector.js +6 -20
  139. package/dist/esm/math/AbstractVector.js.map +1 -1
  140. package/dist/esm/math/Circle.js +0 -2
  141. package/dist/esm/math/Circle.js.map +1 -1
  142. package/dist/esm/math/Collision.d.ts +9 -3
  143. package/dist/esm/math/Ellipse.d.ts +2 -5
  144. package/dist/esm/math/Ellipse.js +10 -7
  145. package/dist/esm/math/Ellipse.js.map +1 -1
  146. package/dist/esm/math/ObservableVector.d.ts +1 -1
  147. package/dist/esm/math/ObservableVector.js +3 -3
  148. package/dist/esm/math/ObservableVector.js.map +1 -1
  149. package/dist/esm/math/Polygon.d.ts +0 -2
  150. package/dist/esm/math/Polygon.js +1 -9
  151. package/dist/esm/math/Polygon.js.map +1 -1
  152. package/dist/esm/math/Rectangle.js +0 -2
  153. package/dist/esm/math/Rectangle.js.map +1 -1
  154. package/dist/esm/math/collision-detection.d.ts +19 -4
  155. package/dist/esm/math/collision-detection.js +61 -4
  156. package/dist/esm/math/collision-detection.js.map +1 -1
  157. package/dist/esm/math/swept-collision.d.ts +16 -12
  158. package/dist/esm/math/swept-collision.js +109 -19
  159. package/dist/esm/math/swept-collision.js.map +1 -1
  160. package/dist/esm/particles/ParticleSystem.d.ts +8 -5
  161. package/dist/esm/particles/ParticleSystem.js +10 -6
  162. package/dist/esm/particles/ParticleSystem.js.map +1 -1
  163. package/dist/esm/particles/distributions/{Gradient.d.ts → ColorGradient.d.ts} +5 -5
  164. package/dist/esm/particles/distributions/{Gradient.js → ColorGradient.js} +5 -5
  165. package/dist/esm/particles/distributions/ColorGradient.js.map +1 -0
  166. package/dist/esm/particles/distributions/Distribution.d.ts +2 -2
  167. package/dist/esm/particles/distributions/index.d.ts +2 -2
  168. package/dist/esm/particles/gpu/ParticleGpuState.js +1 -1
  169. package/dist/esm/particles/index.d.ts +1 -0
  170. package/dist/esm/particles/modules/ColorOverLifetime.d.ts +3 -3
  171. package/dist/esm/particles/modules/ColorOverLifetime.js.map +1 -1
  172. package/dist/esm/particles/modules/ColorOverSpeed.d.ts +3 -3
  173. package/dist/esm/particles/modules/ColorOverSpeed.js.map +1 -1
  174. package/dist/esm/particles/modules/UpdateModule.d.ts +2 -2
  175. package/dist/esm/particles/modules/UpdateModule.js +1 -1
  176. package/dist/esm/particles/modules/WgslContribution.d.ts +2 -2
  177. package/dist/esm/rendering/CallbackRenderPass.d.ts +1 -0
  178. package/dist/esm/rendering/CallbackRenderPass.js +1 -0
  179. package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
  180. package/dist/esm/rendering/Camera.d.ts +33 -0
  181. package/dist/esm/rendering/Camera.js +38 -0
  182. package/dist/esm/rendering/Camera.js.map +1 -0
  183. package/dist/esm/rendering/Container.d.ts +7 -25
  184. package/dist/esm/rendering/Container.js +25 -87
  185. package/dist/esm/rendering/Container.js.map +1 -1
  186. package/dist/esm/rendering/Drawable.d.ts +8 -10
  187. package/dist/esm/rendering/Drawable.js +12 -20
  188. package/dist/esm/rendering/Drawable.js.map +1 -1
  189. package/dist/esm/rendering/RenderBackend.d.ts +19 -0
  190. package/dist/esm/rendering/RenderNode.d.ts +82 -11
  191. package/dist/esm/rendering/RenderNode.js +133 -163
  192. package/dist/esm/rendering/RenderNode.js.map +1 -1
  193. package/dist/esm/rendering/RenderPass.d.ts +1 -0
  194. package/dist/esm/rendering/RenderStats.d.ts +9 -0
  195. package/dist/esm/rendering/RenderStats.js +2 -0
  196. package/dist/esm/rendering/RenderStats.js.map +1 -1
  197. package/dist/esm/rendering/RenderTarget.d.ts +13 -0
  198. package/dist/esm/rendering/RenderTarget.js +13 -0
  199. package/dist/esm/rendering/RenderTarget.js.map +1 -1
  200. package/dist/esm/rendering/RenderTargetPass.js +17 -0
  201. package/dist/esm/rendering/RenderTargetPass.js.map +1 -1
  202. package/dist/esm/rendering/RendererRegistry.d.ts +1 -0
  203. package/dist/esm/rendering/RendererRegistry.js +1 -0
  204. package/dist/esm/rendering/RendererRegistry.js.map +1 -1
  205. package/dist/esm/rendering/RenderingContext.d.ts +87 -0
  206. package/dist/esm/rendering/RenderingContext.js +157 -0
  207. package/dist/esm/rendering/RenderingContext.js.map +1 -0
  208. package/dist/esm/rendering/TransformBuffer.d.ts +38 -0
  209. package/dist/esm/rendering/TransformBuffer.js +116 -0
  210. package/dist/esm/rendering/TransformBuffer.js.map +1 -0
  211. package/dist/esm/rendering/View.d.ts +23 -0
  212. package/dist/esm/rendering/View.js +42 -0
  213. package/dist/esm/rendering/View.js.map +1 -1
  214. package/dist/esm/rendering/filters/WebGpuShaderFilter.js +5 -12
  215. package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -1
  216. package/dist/esm/rendering/geometry/Geometry.d.ts +40 -0
  217. package/dist/esm/rendering/geometry/Geometry.js +228 -0
  218. package/dist/esm/rendering/geometry/Geometry.js.map +1 -0
  219. package/dist/esm/rendering/geometry/GeometryAttribute.d.ts +32 -0
  220. package/dist/esm/rendering/geometry/QuadGeometry.d.ts +5 -0
  221. package/dist/esm/rendering/gradient/Gradient.d.ts +34 -0
  222. package/dist/esm/rendering/gradient/Gradient.js +114 -0
  223. package/dist/esm/rendering/gradient/Gradient.js.map +1 -0
  224. package/dist/esm/rendering/gradient/LinearGradient.d.ts +10 -0
  225. package/dist/esm/rendering/gradient/LinearGradient.js +26 -0
  226. package/dist/esm/rendering/gradient/LinearGradient.js.map +1 -0
  227. package/dist/esm/rendering/gradient/RadialGradient.d.ts +10 -0
  228. package/dist/esm/rendering/gradient/RadialGradient.js +25 -0
  229. package/dist/esm/rendering/gradient/RadialGradient.js.map +1 -0
  230. package/dist/esm/rendering/index.d.ts +103 -59
  231. package/dist/esm/rendering/material/Material.d.ts +114 -0
  232. package/dist/esm/rendering/material/Material.js +111 -0
  233. package/dist/esm/rendering/material/Material.js.map +1 -0
  234. package/dist/esm/rendering/material/MaterialKey.d.ts +18 -0
  235. package/dist/esm/rendering/material/MaterialKey.js +82 -0
  236. package/dist/esm/rendering/material/MaterialKey.js.map +1 -0
  237. package/dist/esm/rendering/material/MeshMaterial.d.ts +16 -0
  238. package/dist/esm/rendering/material/MeshMaterial.js +21 -0
  239. package/dist/esm/rendering/material/MeshMaterial.js.map +1 -0
  240. package/dist/esm/rendering/{mesh/MeshShader.d.ts → material/ShaderSource.d.ts} +30 -62
  241. package/dist/esm/rendering/{mesh/MeshShader.js → material/ShaderSource.js} +36 -62
  242. package/dist/esm/rendering/material/ShaderSource.js.map +1 -0
  243. package/dist/esm/rendering/material/SpriteMaterial.d.ts +15 -0
  244. package/dist/esm/rendering/material/SpriteMaterial.js +20 -0
  245. package/dist/esm/rendering/material/SpriteMaterial.js.map +1 -0
  246. package/dist/esm/rendering/mesh/Mesh.d.ts +29 -12
  247. package/dist/esm/rendering/mesh/Mesh.js +123 -4
  248. package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
  249. package/dist/esm/rendering/pass/RenderPassCoordinator.d.ts +63 -0
  250. package/dist/esm/rendering/pass/RenderPassDescriptor.d.ts +48 -0
  251. package/dist/esm/rendering/pass/RenderPassDescriptor.js +16 -0
  252. package/dist/esm/rendering/pass/RenderPassDescriptor.js.map +1 -0
  253. package/dist/esm/rendering/plan/RenderCommand.d.ts +67 -0
  254. package/dist/esm/rendering/plan/RenderCommand.js +94 -0
  255. package/dist/esm/rendering/plan/RenderCommand.js.map +1 -0
  256. package/dist/esm/rendering/plan/RenderEffectExecutor.d.ts +10 -0
  257. package/dist/esm/rendering/plan/RenderEffectExecutor.js +159 -0
  258. package/dist/esm/rendering/plan/RenderEffectExecutor.js.map +1 -0
  259. package/dist/esm/rendering/plan/RenderPlan.d.ts +23 -0
  260. package/dist/esm/rendering/plan/RenderPlan.js +12 -0
  261. package/dist/esm/rendering/plan/RenderPlan.js.map +1 -0
  262. package/dist/esm/rendering/plan/RenderPlanBuilder.d.ts +31 -0
  263. package/dist/esm/rendering/plan/RenderPlanBuilder.js +242 -0
  264. package/dist/esm/rendering/plan/RenderPlanBuilder.js.map +1 -0
  265. package/dist/esm/rendering/plan/RenderPlanOptimizer.d.ts +10 -0
  266. package/dist/esm/rendering/plan/RenderPlanOptimizer.js +180 -0
  267. package/dist/esm/rendering/plan/RenderPlanOptimizer.js.map +1 -0
  268. package/dist/esm/rendering/plan/RenderPlanPlayer.d.ts +9 -0
  269. package/dist/esm/rendering/plan/RenderPlanPlayer.js +56 -0
  270. package/dist/esm/rendering/plan/RenderPlanPlayer.js.map +1 -0
  271. package/dist/esm/rendering/plan/RenderScope.d.ts +70 -0
  272. package/dist/esm/rendering/plan/RenderScope.js +16 -0
  273. package/dist/esm/rendering/plan/RenderScope.js.map +1 -0
  274. package/dist/esm/rendering/plan/playRenderTree.d.ts +4 -0
  275. package/dist/esm/rendering/plan/playRenderTree.js +19 -0
  276. package/dist/esm/rendering/plan/playRenderTree.js.map +1 -0
  277. package/dist/esm/rendering/shader/Shader.d.ts +1 -0
  278. package/dist/esm/rendering/shader/Shader.js +1 -0
  279. package/dist/esm/rendering/shader/Shader.js.map +1 -1
  280. package/dist/esm/rendering/shader/ShaderUniform.d.ts +1 -0
  281. package/dist/esm/rendering/shader/ShaderUniform.js +1 -0
  282. package/dist/esm/rendering/shader/ShaderUniform.js.map +1 -1
  283. package/dist/esm/rendering/sprite/Sprite.d.ts +25 -3
  284. package/dist/esm/rendering/sprite/Sprite.js +48 -15
  285. package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
  286. package/dist/esm/rendering/sprite/spriteMaterialSources.d.ts +36 -0
  287. package/dist/esm/rendering/sprite/spriteMaterialSources.js +128 -0
  288. package/dist/esm/rendering/sprite/spriteMaterialSources.js.map +1 -0
  289. package/dist/esm/rendering/text/AbstractText.d.ts +36 -0
  290. package/dist/esm/rendering/text/AbstractText.js +49 -0
  291. package/dist/esm/rendering/text/AbstractText.js.map +1 -0
  292. package/dist/esm/rendering/text/BitmapText.d.ts +97 -0
  293. package/dist/esm/rendering/text/BitmapText.js +220 -0
  294. package/dist/esm/rendering/text/BitmapText.js.map +1 -0
  295. package/dist/esm/rendering/text/BmFont.d.ts +50 -0
  296. package/dist/esm/rendering/text/BmFont.js +24 -0
  297. package/dist/esm/rendering/text/BmFont.js.map +1 -0
  298. package/dist/esm/rendering/text/GlyphAtlas.d.ts +104 -0
  299. package/dist/esm/rendering/text/GlyphAtlas.js +347 -0
  300. package/dist/esm/rendering/text/GlyphAtlas.js.map +1 -0
  301. package/dist/esm/rendering/text/GlyphAtlasPool.d.ts +40 -0
  302. package/dist/esm/rendering/text/GlyphAtlasPool.js +67 -0
  303. package/dist/esm/rendering/text/GlyphAtlasPool.js.map +1 -0
  304. package/dist/esm/rendering/text/GlyphSdf.d.ts +92 -0
  305. package/dist/esm/rendering/text/GlyphSdf.js +220 -0
  306. package/dist/esm/rendering/text/GlyphSdf.js.map +1 -0
  307. package/dist/esm/rendering/text/HTMLText.d.ts +107 -0
  308. package/dist/esm/rendering/text/HTMLText.js +284 -0
  309. package/dist/esm/rendering/text/HTMLText.js.map +1 -0
  310. package/dist/esm/rendering/text/LayoutOptions.d.ts +30 -0
  311. package/dist/esm/rendering/text/Text.d.ts +89 -20
  312. package/dist/esm/rendering/text/Text.js +176 -101
  313. package/dist/esm/rendering/text/Text.js.map +1 -1
  314. package/dist/esm/rendering/text/TextLayout.d.ts +20 -8
  315. package/dist/esm/rendering/text/TextLayout.js +234 -25
  316. package/dist/esm/rendering/text/TextLayout.js.map +1 -1
  317. package/dist/esm/rendering/text/TextStyle.d.ts +154 -87
  318. package/dist/esm/rendering/text/TextStyle.js +257 -203
  319. package/dist/esm/rendering/text/TextStyle.js.map +1 -1
  320. package/dist/esm/rendering/text/types.d.ts +73 -13
  321. package/dist/esm/rendering/texture/DataTexture.d.ts +5 -0
  322. package/dist/esm/rendering/texture/DataTexture.js +7 -0
  323. package/dist/esm/rendering/texture/DataTexture.js.map +1 -1
  324. package/dist/esm/rendering/texture/Texture.d.ts +1 -0
  325. package/dist/esm/rendering/texture/Texture.js +1 -0
  326. package/dist/esm/rendering/texture/Texture.js.map +1 -1
  327. package/dist/esm/rendering/types.d.ts +3 -1
  328. package/dist/esm/rendering/types.js +2 -0
  329. package/dist/esm/rendering/types.js.map +1 -1
  330. package/dist/esm/rendering/video/Video.d.ts +5 -8
  331. package/dist/esm/rendering/video/Video.js +12 -13
  332. package/dist/esm/rendering/video/Video.js.map +1 -1
  333. package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +40 -0
  334. package/dist/esm/rendering/webgl2/WebGl2Backend.js +344 -27
  335. package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
  336. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.d.ts +22 -2
  337. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +404 -112
  338. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -1
  339. package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.d.ts +57 -0
  340. package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js +79 -0
  341. package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js.map +1 -0
  342. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +12 -0
  343. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +214 -58
  344. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
  345. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.d.ts +34 -0
  346. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js +169 -0
  347. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js.map +1 -0
  348. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.d.ts +56 -0
  349. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js +486 -0
  350. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js.map +1 -0
  351. package/dist/esm/rendering/webgl2/glsl/mesh.frag.js +1 -1
  352. package/dist/esm/rendering/webgl2/glsl/mesh.vert.js +1 -1
  353. package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js +4 -0
  354. package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js.map +1 -0
  355. package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js +4 -0
  356. package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js.map +1 -0
  357. package/dist/esm/rendering/webgl2/glsl/text-color.frag.js +4 -0
  358. package/dist/esm/rendering/webgl2/glsl/text-color.frag.js.map +1 -0
  359. package/dist/esm/rendering/webgl2/glsl/text-msdf.frag.js +4 -0
  360. package/dist/esm/rendering/webgl2/glsl/text-msdf.frag.js.map +1 -0
  361. package/dist/esm/rendering/webgl2/glsl/text-sdf.frag.js +4 -0
  362. package/dist/esm/rendering/webgl2/glsl/text-sdf.frag.js.map +1 -0
  363. package/dist/esm/rendering/webgl2/glsl/text.vert.js +4 -0
  364. package/dist/esm/rendering/webgl2/glsl/text.vert.js.map +1 -0
  365. package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +50 -0
  366. package/dist/esm/rendering/webgpu/WebGpuBackend.js +151 -27
  367. package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
  368. package/dist/esm/rendering/webgpu/WebGpuBlendState.js +26 -0
  369. package/dist/esm/rendering/webgpu/WebGpuBlendState.js.map +1 -1
  370. package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js +22 -17
  371. package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js.map +1 -1
  372. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +26 -2
  373. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +511 -89
  374. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
  375. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +13 -17
  376. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js.map +1 -1
  377. package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.d.ts +141 -0
  378. package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js +270 -0
  379. package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js.map +1 -0
  380. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +16 -0
  381. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +344 -27
  382. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
  383. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.d.ts +57 -0
  384. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js +257 -0
  385. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js.map +1 -0
  386. package/dist/esm/rendering/webgpu/WebGpuStencilState.d.ts +14 -0
  387. package/dist/esm/rendering/webgpu/WebGpuStencilState.js +36 -0
  388. package/dist/esm/rendering/webgpu/WebGpuStencilState.js.map +1 -0
  389. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.d.ts +70 -0
  390. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js +775 -0
  391. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js.map +1 -0
  392. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts +16 -0
  393. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js +57 -0
  394. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js.map +1 -0
  395. package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js +96 -0
  396. package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js.map +1 -0
  397. package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js +68 -0
  398. package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js.map +1 -0
  399. package/dist/esm/resources/Asset.d.ts +23 -0
  400. package/dist/esm/resources/Asset.js +23 -0
  401. package/dist/esm/resources/Asset.js.map +1 -0
  402. package/dist/esm/resources/AssetDefinitions.d.ts +137 -0
  403. package/dist/esm/resources/Assets.d.ts +35 -0
  404. package/dist/esm/resources/Assets.js +32 -0
  405. package/dist/esm/resources/Assets.js.map +1 -0
  406. package/dist/esm/resources/IndexedDbDatabase.js +17 -1
  407. package/dist/esm/resources/IndexedDbDatabase.js.map +1 -1
  408. package/dist/esm/resources/IndexedDbStore.js +17 -1
  409. package/dist/esm/resources/IndexedDbStore.js.map +1 -1
  410. package/dist/esm/resources/JsonStore.d.ts +18 -0
  411. package/dist/esm/resources/JsonStore.js +62 -0
  412. package/dist/esm/resources/JsonStore.js.map +1 -0
  413. package/dist/esm/resources/Loader.d.ts +244 -18
  414. package/dist/esm/resources/Loader.js +456 -50
  415. package/dist/esm/resources/Loader.js.map +1 -1
  416. package/dist/esm/resources/LoadingQueue.d.ts +28 -0
  417. package/dist/esm/resources/LoadingQueue.js +59 -0
  418. package/dist/esm/resources/LoadingQueue.js.map +1 -0
  419. package/dist/esm/resources/factories/BmFontFactory.d.ts +25 -0
  420. package/dist/esm/resources/factories/BmFontFactory.js +96 -0
  421. package/dist/esm/resources/factories/BmFontFactory.js.map +1 -0
  422. package/dist/esm/resources/factories/CsvFactory.d.ts +35 -0
  423. package/dist/esm/resources/factories/CsvFactory.js +87 -0
  424. package/dist/esm/resources/factories/CsvFactory.js.map +1 -0
  425. package/dist/esm/resources/factories/ImageFactory.d.ts +14 -8
  426. package/dist/esm/resources/factories/ImageFactory.js +13 -6
  427. package/dist/esm/resources/factories/ImageFactory.js.map +1 -1
  428. package/dist/esm/resources/factories/MusicFactory.d.ts +8 -2
  429. package/dist/esm/resources/factories/MusicFactory.js +25 -14
  430. package/dist/esm/resources/factories/MusicFactory.js.map +1 -1
  431. package/dist/esm/resources/factories/SoundFactory.d.ts +2 -2
  432. package/dist/esm/resources/factories/SoundFactory.js.map +1 -1
  433. package/dist/esm/resources/factories/SubtitleFactory.d.ts +28 -0
  434. package/dist/esm/resources/factories/SubtitleFactory.js +203 -0
  435. package/dist/esm/resources/factories/SubtitleFactory.js.map +1 -0
  436. package/dist/esm/resources/factories/SvgFactory.d.ts +18 -1
  437. package/dist/esm/resources/factories/SvgFactory.js +21 -2
  438. package/dist/esm/resources/factories/SvgFactory.js.map +1 -1
  439. package/dist/esm/resources/factories/TextureFactory.d.ts +4 -4
  440. package/dist/esm/resources/factories/TextureFactory.js +8 -4
  441. package/dist/esm/resources/factories/TextureFactory.js.map +1 -1
  442. package/dist/esm/resources/factories/VideoFactory.d.ts +8 -2
  443. package/dist/esm/resources/factories/VideoFactory.js +27 -20
  444. package/dist/esm/resources/factories/VideoFactory.js.map +1 -1
  445. package/dist/esm/resources/factories/XmlFactory.d.ts +24 -0
  446. package/dist/esm/resources/factories/XmlFactory.js +37 -0
  447. package/dist/esm/resources/factories/XmlFactory.js.map +1 -0
  448. package/dist/esm/resources/index.d.ts +9 -1
  449. package/dist/esm/resources/tokens.d.ts +49 -3
  450. package/dist/esm/resources/tokens.js +50 -4
  451. package/dist/esm/resources/tokens.js.map +1 -1
  452. package/dist/exo.esm.js +15382 -8078
  453. package/dist/exo.esm.js.map +1 -1
  454. package/package.json +34 -16
  455. package/dist/esm/input/interaction-hooks.d.ts +0 -34
  456. package/dist/esm/input/interaction-hooks.js +0 -35
  457. package/dist/esm/input/interaction-hooks.js.map +0 -1
  458. package/dist/esm/particles/distributions/Gradient.js.map +0 -1
  459. package/dist/esm/rendering/mesh/MeshShader.js.map +0 -1
  460. package/dist/esm/rendering/text/DynamicGlyphAtlas.d.ts +0 -33
  461. package/dist/esm/rendering/text/DynamicGlyphAtlas.js +0 -134
  462. package/dist/esm/rendering/text/DynamicGlyphAtlas.js.map +0 -1
  463. package/dist/esm/rendering/text/atlas-singleton.d.ts +0 -7
  464. package/dist/esm/rendering/text/atlas-singleton.js +0 -17
  465. package/dist/esm/rendering/text/atlas-singleton.js.map +0 -1
  466. package/dist/esm/resources/factories/VttFactory.d.ts +0 -24
  467. package/dist/esm/resources/factories/VttFactory.js +0 -158
  468. package/dist/esm/resources/factories/VttFactory.js.map +0 -1
  469. package/dist/esm/vendor/webgl-debug.js +0 -1160
  470. package/dist/esm/vendor/webgl-debug.js.map +0 -1
@@ -0,0 +1,89 @@
1
+ const granularWorkletSource = `
2
+ const sampleRate = globalThis.sampleRate;
3
+
4
+ class GranularProcessor extends AudioWorkletProcessor {
5
+ static get parameterDescriptors() {
6
+ return [
7
+ { name: 'grainSize', defaultValue: 0.05, minValue: 0.005, maxValue: 0.5, automationRate: 'k-rate' },
8
+ { name: 'density', defaultValue: 50, minValue: 1, maxValue: 500, automationRate: 'k-rate' },
9
+ { name: 'spread', defaultValue: 0.5, minValue: 0, maxValue: 1.0, automationRate: 'k-rate' },
10
+ { name: 'pitchMin', defaultValue: 1.0, minValue: 0.25, maxValue: 4.0, automationRate: 'k-rate' },
11
+ { name: 'pitchMax', defaultValue: 1.0, minValue: 0.25, maxValue: 4.0, automationRate: 'k-rate' },
12
+ { name: 'wet', defaultValue: 1.0, minValue: 0, maxValue: 1.0, automationRate: 'k-rate' },
13
+ ];
14
+ }
15
+
16
+ constructor(options) {
17
+ super();
18
+ const opts = options.processorOptions ?? {};
19
+ const bufferSeconds = opts.bufferSeconds ?? 2;
20
+ this._bufferLength = Math.floor(bufferSeconds * sampleRate);
21
+ this._buffer = new Float32Array(this._bufferLength);
22
+ this._writePos = 0;
23
+ this._timeUntilNextGrainSamples = 0;
24
+ this._grains = []; // { startPos, ageSamples, lengthSamples, pitch }
25
+ }
26
+
27
+ process(inputs, outputs, parameters) {
28
+ const input = inputs[0]?.[0];
29
+ const output = outputs[0]?.[0];
30
+ if (!input || !output) return true;
31
+
32
+ const grainSize = parameters.grainSize[0];
33
+ const density = parameters.density[0];
34
+ const spread = parameters.spread[0];
35
+ const pitchMin = parameters.pitchMin[0];
36
+ const pitchMax = parameters.pitchMax[0];
37
+ const wet = parameters.wet[0];
38
+
39
+ const grainSizeSamples = Math.max(8, Math.floor(grainSize * sampleRate));
40
+ const samplesPerGrain = sampleRate / Math.max(1, density);
41
+
42
+ for (let i = 0; i < input.length; i++) {
43
+ // Write input to circular buffer
44
+ this._buffer[this._writePos] = input[i];
45
+ this._writePos = (this._writePos + 1) % this._bufferLength;
46
+
47
+ // Spawn new grain if scheduled
48
+ this._timeUntilNextGrainSamples -= 1;
49
+ if (this._timeUntilNextGrainSamples <= 0) {
50
+ // Random offset into recent past, biased by spread
51
+ const maxOffset = Math.floor(spread * this._bufferLength);
52
+ const offset = Math.floor(Math.random() * Math.max(1, maxOffset));
53
+ const startPos = (this._writePos - offset - grainSizeSamples + this._bufferLength) % this._bufferLength;
54
+ // Random pitch in [pitchMin, pitchMax]
55
+ const pitch = pitchMin + Math.random() * Math.max(0, pitchMax - pitchMin);
56
+
57
+ this._grains.push({ startPos, ageSamples: 0, lengthSamples: grainSizeSamples, pitch });
58
+ this._timeUntilNextGrainSamples = samplesPerGrain;
59
+ }
60
+
61
+ // Mix all active grains (apply Hann window)
62
+ let grainSum = 0;
63
+ for (let g = this._grains.length - 1; g >= 0; g--) {
64
+ const grain = this._grains[g];
65
+ if (grain.ageSamples >= grain.lengthSamples) {
66
+ this._grains.splice(g, 1);
67
+ continue;
68
+ }
69
+
70
+ const phase = grain.ageSamples / grain.lengthSamples;
71
+ const window = 0.5 * (1 - Math.cos(2 * Math.PI * phase));
72
+ const readPos = grain.startPos + grain.ageSamples * grain.pitch;
73
+ const sampleIndex = Math.floor(readPos) % this._bufferLength;
74
+ const safeIndex = (sampleIndex + this._bufferLength) % this._bufferLength;
75
+ grainSum += this._buffer[safeIndex] * window;
76
+
77
+ grain.ageSamples++;
78
+ }
79
+
80
+ output[i] = (1 - wet) * input[i] + wet * grainSum;
81
+ }
82
+ return true;
83
+ }
84
+ }
85
+ registerProcessor('exojs-granular', GranularProcessor);
86
+ `;
87
+
88
+ export { granularWorkletSource };
89
+ //# sourceMappingURL=granular.worklet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"granular.worklet.js","sources":["../../../../../src/audio/worklets/granular.worklet.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAO,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1 @@
1
+ export declare const pitchShiftWorkletSource = "\nclass PitchShiftProcessor extends AudioWorkletProcessor {\n static get parameterDescriptors() {\n return [\n { name: 'pitch', defaultValue: 1.0, minValue: 0.25, maxValue: 4.0, automationRate: 'k-rate' },\n { name: 'wet', defaultValue: 1.0, minValue: 0, maxValue: 1.0, automationRate: 'k-rate' },\n ];\n }\n\n constructor(options) {\n super();\n const grainSize = options.processorOptions?.grainSize ?? 1024;\n this._grainSize = grainSize;\n this._bufferLength = grainSize * 4;\n this._buffer = new Float32Array(this._bufferLength);\n this._writePos = 0;\n // Two staggered read positions for overlap-add\n this._readPosA = 0;\n this._readPosB = grainSize / 2;\n this._hannWindow = this._buildHannWindow(grainSize);\n }\n\n _buildHannWindow(n) {\n const w = new Float32Array(n);\n for (let i = 0; i < n; i++) {\n w[i] = 0.5 * (1 - Math.cos(2 * Math.PI * i / (n - 1)));\n }\n return w;\n }\n\n _readGrain(readPos) {\n const grainSize = this._grainSize;\n const sampleIndex = Math.floor(readPos);\n const phase = sampleIndex % grainSize; // position within the grain envelope\n const win = this._hannWindow[phase];\n const bufferIndex = ((this._writePos - this._bufferLength + sampleIndex) % this._bufferLength + this._bufferLength) % this._bufferLength;\n return this._buffer[bufferIndex] * win;\n }\n\n process(inputs, outputs, parameters) {\n const input = inputs[0]?.[0];\n const output = outputs[0]?.[0];\n if (!input || !output) return true;\n\n const pitch = parameters.pitch[0];\n const wet = parameters.wet[0];\n\n for (let i = 0; i < input.length; i++) {\n // Write to circular buffer\n this._buffer[this._writePos] = input[i];\n this._writePos = (this._writePos + 1) % this._bufferLength;\n\n // Read two grains and sum\n const grainA = this._readGrain(this._readPosA);\n const grainB = this._readGrain(this._readPosB);\n const shifted = grainA + grainB;\n\n // Mix with dry\n output[i] = (1 - wet) * input[i] + wet * shifted;\n\n // Advance read positions at pitch rate\n this._readPosA += pitch;\n this._readPosB += pitch;\n if (this._readPosA >= this._grainSize) this._readPosA -= this._grainSize;\n if (this._readPosB >= this._grainSize) this._readPosB -= this._grainSize;\n }\n return true;\n }\n}\nregisterProcessor('exojs-pitch-shift', PitchShiftProcessor);\n";
@@ -0,0 +1,74 @@
1
+ const pitchShiftWorkletSource = `
2
+ class PitchShiftProcessor extends AudioWorkletProcessor {
3
+ static get parameterDescriptors() {
4
+ return [
5
+ { name: 'pitch', defaultValue: 1.0, minValue: 0.25, maxValue: 4.0, automationRate: 'k-rate' },
6
+ { name: 'wet', defaultValue: 1.0, minValue: 0, maxValue: 1.0, automationRate: 'k-rate' },
7
+ ];
8
+ }
9
+
10
+ constructor(options) {
11
+ super();
12
+ const grainSize = options.processorOptions?.grainSize ?? 1024;
13
+ this._grainSize = grainSize;
14
+ this._bufferLength = grainSize * 4;
15
+ this._buffer = new Float32Array(this._bufferLength);
16
+ this._writePos = 0;
17
+ // Two staggered read positions for overlap-add
18
+ this._readPosA = 0;
19
+ this._readPosB = grainSize / 2;
20
+ this._hannWindow = this._buildHannWindow(grainSize);
21
+ }
22
+
23
+ _buildHannWindow(n) {
24
+ const w = new Float32Array(n);
25
+ for (let i = 0; i < n; i++) {
26
+ w[i] = 0.5 * (1 - Math.cos(2 * Math.PI * i / (n - 1)));
27
+ }
28
+ return w;
29
+ }
30
+
31
+ _readGrain(readPos) {
32
+ const grainSize = this._grainSize;
33
+ const sampleIndex = Math.floor(readPos);
34
+ const phase = sampleIndex % grainSize; // position within the grain envelope
35
+ const win = this._hannWindow[phase];
36
+ const bufferIndex = ((this._writePos - this._bufferLength + sampleIndex) % this._bufferLength + this._bufferLength) % this._bufferLength;
37
+ return this._buffer[bufferIndex] * win;
38
+ }
39
+
40
+ process(inputs, outputs, parameters) {
41
+ const input = inputs[0]?.[0];
42
+ const output = outputs[0]?.[0];
43
+ if (!input || !output) return true;
44
+
45
+ const pitch = parameters.pitch[0];
46
+ const wet = parameters.wet[0];
47
+
48
+ for (let i = 0; i < input.length; i++) {
49
+ // Write to circular buffer
50
+ this._buffer[this._writePos] = input[i];
51
+ this._writePos = (this._writePos + 1) % this._bufferLength;
52
+
53
+ // Read two grains and sum
54
+ const grainA = this._readGrain(this._readPosA);
55
+ const grainB = this._readGrain(this._readPosB);
56
+ const shifted = grainA + grainB;
57
+
58
+ // Mix with dry
59
+ output[i] = (1 - wet) * input[i] + wet * shifted;
60
+
61
+ // Advance read positions at pitch rate
62
+ this._readPosA += pitch;
63
+ this._readPosB += pitch;
64
+ if (this._readPosA >= this._grainSize) this._readPosA -= this._grainSize;
65
+ if (this._readPosB >= this._grainSize) this._readPosB -= this._grainSize;
66
+ }
67
+ return true;
68
+ }
69
+ }
70
+ registerProcessor('exojs-pitch-shift', PitchShiftProcessor);
71
+ `;
72
+
73
+ export { pitchShiftWorkletSource };
74
+ //# sourceMappingURL=pitch-shift.worklet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pitch-shift.worklet.js","sources":["../../../../../src/audio/worklets/pitch-shift.worklet.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAO,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1 @@
1
+ export declare const vocoderWorkletSource = "\nconst sampleRate = globalThis.sampleRate;\n\nclass VocoderProcessor extends AudioWorkletProcessor {\n static get parameterDescriptors() {\n return [\n { name: 'wet', defaultValue: 1.0, minValue: 0, maxValue: 1.0, automationRate: 'k-rate' },\n { name: 'envelopeSmoothing', defaultValue: 0.005, minValue: 0.0001, maxValue: 0.1, automationRate: 'k-rate' },\n ];\n }\n\n constructor(options) {\n super();\n const opts = options.processorOptions ?? {};\n const bandCount = opts.numBands ?? 16;\n const minHz = opts.minHz ?? 80;\n const maxHz = opts.maxHz ?? 8000;\n const Q = opts.bandQ ?? 4;\n\n // Log-spaced band centers + biquad coefficients\n this._bands = [];\n for (let i = 0; i < bandCount; i++) {\n const ratio = bandCount === 1 ? 0 : i / (bandCount - 1);\n const centerHz = minHz * Math.pow(maxHz / minHz, ratio);\n const omega = 2 * Math.PI * centerHz / sampleRate;\n const cos = Math.cos(omega);\n const sin = Math.sin(omega);\n const alpha = sin / (2 * Q);\n\n // Bandpass (constant 0 dB peak) biquad\n const a0 = 1 + alpha;\n const b0 = alpha / a0;\n const b1 = 0;\n const b2 = -alpha / a0;\n const a1 = (-2 * cos) / a0;\n const a2 = (1 - alpha) / a0;\n this._bands.push({ b0, b1, b2, a1, a2 });\n }\n\n // Per-band biquad state (one for carrier, one for modulator)\n this._carrierStates = this._bands.map(() => ({ x1: 0, x2: 0, y1: 0, y2: 0 }));\n this._modulatorStates = this._bands.map(() => ({ x1: 0, x2: 0, y1: 0, y2: 0 }));\n\n // Per-band envelope follower\n this._envelopes = new Float32Array(bandCount);\n }\n\n _processBiquad(state, coef, x) {\n const y = coef.b0 * x + coef.b1 * state.x1 + coef.b2 * state.x2 - coef.a1 * state.y1 - coef.a2 * state.y2;\n state.x2 = state.x1; state.x1 = x;\n state.y2 = state.y1; state.y1 = y;\n return y;\n }\n\n process(inputs, outputs, parameters) {\n const carrier = inputs[0]?.[0];\n const modulator = inputs[1]?.[0];\n const output = outputs[0]?.[0];\n if (!carrier || !output) return true;\n\n const wet = parameters.wet[0];\n const envSmoothing = parameters.envelopeSmoothing[0];\n const bandCount = this._bands.length;\n\n for (let i = 0; i < carrier.length; i++) {\n const carrierSample = carrier[i];\n const modulatorSample = modulator?.[i] ?? 0;\n\n let bandSum = 0;\n for (let b = 0; b < bandCount; b++) {\n const coef = this._bands[b];\n\n // Modulator band \u2192 envelope follower\n const modBand = this._processBiquad(this._modulatorStates[b], coef, modulatorSample);\n const target = Math.abs(modBand);\n this._envelopes[b] += (target - this._envelopes[b]) * envSmoothing;\n\n // Carrier band, scaled by modulator envelope\n const carBand = this._processBiquad(this._carrierStates[b], coef, carrierSample);\n bandSum += carBand * this._envelopes[b];\n }\n\n output[i] = (1 - wet) * carrierSample + wet * bandSum;\n }\n return true;\n }\n}\nregisterProcessor('exojs-vocoder', VocoderProcessor);\n";
@@ -0,0 +1,92 @@
1
+ const vocoderWorkletSource = `
2
+ const sampleRate = globalThis.sampleRate;
3
+
4
+ class VocoderProcessor extends AudioWorkletProcessor {
5
+ static get parameterDescriptors() {
6
+ return [
7
+ { name: 'wet', defaultValue: 1.0, minValue: 0, maxValue: 1.0, automationRate: 'k-rate' },
8
+ { name: 'envelopeSmoothing', defaultValue: 0.005, minValue: 0.0001, maxValue: 0.1, automationRate: 'k-rate' },
9
+ ];
10
+ }
11
+
12
+ constructor(options) {
13
+ super();
14
+ const opts = options.processorOptions ?? {};
15
+ const bandCount = opts.numBands ?? 16;
16
+ const minHz = opts.minHz ?? 80;
17
+ const maxHz = opts.maxHz ?? 8000;
18
+ const Q = opts.bandQ ?? 4;
19
+
20
+ // Log-spaced band centers + biquad coefficients
21
+ this._bands = [];
22
+ for (let i = 0; i < bandCount; i++) {
23
+ const ratio = bandCount === 1 ? 0 : i / (bandCount - 1);
24
+ const centerHz = minHz * Math.pow(maxHz / minHz, ratio);
25
+ const omega = 2 * Math.PI * centerHz / sampleRate;
26
+ const cos = Math.cos(omega);
27
+ const sin = Math.sin(omega);
28
+ const alpha = sin / (2 * Q);
29
+
30
+ // Bandpass (constant 0 dB peak) biquad
31
+ const a0 = 1 + alpha;
32
+ const b0 = alpha / a0;
33
+ const b1 = 0;
34
+ const b2 = -alpha / a0;
35
+ const a1 = (-2 * cos) / a0;
36
+ const a2 = (1 - alpha) / a0;
37
+ this._bands.push({ b0, b1, b2, a1, a2 });
38
+ }
39
+
40
+ // Per-band biquad state (one for carrier, one for modulator)
41
+ this._carrierStates = this._bands.map(() => ({ x1: 0, x2: 0, y1: 0, y2: 0 }));
42
+ this._modulatorStates = this._bands.map(() => ({ x1: 0, x2: 0, y1: 0, y2: 0 }));
43
+
44
+ // Per-band envelope follower
45
+ this._envelopes = new Float32Array(bandCount);
46
+ }
47
+
48
+ _processBiquad(state, coef, x) {
49
+ const y = coef.b0 * x + coef.b1 * state.x1 + coef.b2 * state.x2 - coef.a1 * state.y1 - coef.a2 * state.y2;
50
+ state.x2 = state.x1; state.x1 = x;
51
+ state.y2 = state.y1; state.y1 = y;
52
+ return y;
53
+ }
54
+
55
+ process(inputs, outputs, parameters) {
56
+ const carrier = inputs[0]?.[0];
57
+ const modulator = inputs[1]?.[0];
58
+ const output = outputs[0]?.[0];
59
+ if (!carrier || !output) return true;
60
+
61
+ const wet = parameters.wet[0];
62
+ const envSmoothing = parameters.envelopeSmoothing[0];
63
+ const bandCount = this._bands.length;
64
+
65
+ for (let i = 0; i < carrier.length; i++) {
66
+ const carrierSample = carrier[i];
67
+ const modulatorSample = modulator?.[i] ?? 0;
68
+
69
+ let bandSum = 0;
70
+ for (let b = 0; b < bandCount; b++) {
71
+ const coef = this._bands[b];
72
+
73
+ // Modulator band → envelope follower
74
+ const modBand = this._processBiquad(this._modulatorStates[b], coef, modulatorSample);
75
+ const target = Math.abs(modBand);
76
+ this._envelopes[b] += (target - this._envelopes[b]) * envSmoothing;
77
+
78
+ // Carrier band, scaled by modulator envelope
79
+ const carBand = this._processBiquad(this._carrierStates[b], coef, carrierSample);
80
+ bandSum += carBand * this._envelopes[b];
81
+ }
82
+
83
+ output[i] = (1 - wet) * carrierSample + wet * bandSum;
84
+ }
85
+ return true;
86
+ }
87
+ }
88
+ registerProcessor('exojs-vocoder', VocoderProcessor);
89
+ `;
90
+
91
+ export { vocoderWorkletSource };
92
+ //# sourceMappingURL=vocoder.worklet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vocoder.worklet.js","sources":["../../../../../src/audio/worklets/vocoder.worklet.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAO,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -5,37 +5,59 @@ import type { GamepadSlotStrategy } from '@/input/InputManager';
5
5
  import { InputManager } from '@/input/InputManager';
6
6
  import { InteractionManager } from '@/input/InteractionManager';
7
7
  import type { RenderBackend } from '@/rendering/RenderBackend';
8
+ import { RenderingContext, type RenderToOptions } from '@/rendering/RenderingContext';
9
+ import { type RenderNode } from '@/rendering/RenderNode';
10
+ import type { RenderTexture } from '@/rendering/texture/RenderTexture';
8
11
  import { Texture } from '@/rendering/texture/Texture';
9
- import type { CacheStore } from '@/resources/CacheStore';
10
- import { Loader } from '@/resources/Loader';
12
+ import { Loader, type LoaderOptions } from '@/resources/Loader';
11
13
  import { Capabilities } from './capabilities';
12
14
  import { Color } from './Color';
13
15
  import type { Scene } from './Scene';
14
16
  import { SceneManager } from './SceneManager';
15
17
  import { Signal } from './Signal';
16
- import type { Time } from './Time';
18
+ import { Time } from './Time';
17
19
  export declare enum ApplicationStatus {
18
20
  Loading = 1,
19
21
  Running = 2,
20
22
  Halting = 3,
21
23
  Stopped = 4
22
24
  }
25
+ export interface CanvasApplicationOptions {
26
+ /** Existing canvas element to use. If omitted, Application creates one. */
27
+ element?: HTMLCanvasElement;
28
+ /** Logical canvas width. Default: 800. */
29
+ width?: number;
30
+ /** Logical canvas height. Default: 600. */
31
+ height?: number;
32
+ /** Device/render pixel ratio applied to the backing buffer. Default: 1. */
33
+ pixelRatio?: number;
34
+ /** Canvas tabIndex. Default: -1, preserving current behavior. */
35
+ tabIndex?: number;
36
+ /** CSS image-rendering hint applied to the canvas style. */
37
+ imageRendering?: 'auto' | 'pixelated' | 'crisp-edges';
38
+ }
39
+ export interface RenderingApplicationOptions {
40
+ /** WebGL2-only debug wrapper. Ignored by WebGPU. */
41
+ debug?: boolean;
42
+ /** WebGL2 context attributes. Ignored by WebGPU. */
43
+ webglAttributes?: WebGLContextAttributes;
44
+ /** WebGL2 sprite renderer batch size. Ignored by WebGPU. */
45
+ spriteRendererBatchSize?: number;
46
+ /** WebGL2 particle renderer batch size. Ignored by WebGPU. */
47
+ particleRendererBatchSize?: number;
48
+ }
49
+ export interface InputApplicationOptions {
50
+ gamepadDefinitions?: GamepadDefinition[];
51
+ gamepadSlotStrategy?: GamepadSlotStrategy;
52
+ pointerDistanceThreshold?: number;
53
+ }
23
54
  export interface ApplicationOptions {
24
- canvas: HTMLCanvasElement;
25
- width: number;
26
- height: number;
27
- debug: boolean;
28
- clearColor: Color;
29
- spriteRendererBatchSize: number;
30
- particleRendererBatchSize: number;
31
- gamepadDefinitions: GamepadDefinition[];
32
- gamepadSlotStrategy: GamepadSlotStrategy;
33
- pointerDistanceThreshold: number;
34
- webglAttributes: WebGLContextAttributes;
35
- resourcePath: string;
36
- requestOptions: RequestInit;
37
- cache?: CacheStore | readonly CacheStore[];
55
+ clearColor?: Color;
38
56
  backend?: BackendConfig;
57
+ canvas?: CanvasApplicationOptions;
58
+ loader?: LoaderOptions;
59
+ rendering?: RenderingApplicationOptions;
60
+ input?: InputApplicationOptions;
39
61
  }
40
62
  export interface WebGl2BackendConfig {
41
63
  type: 'webgl2';
@@ -46,11 +68,6 @@ export interface WebGpuBackendConfig {
46
68
  export interface AutoBackendConfig {
47
69
  type: 'auto';
48
70
  }
49
- /**
50
- * Discriminated union of backend selection options. `'auto'` picks WebGPU
51
- * when available, falling back to WebGL2 if adapter acquisition fails;
52
- * the explicit values pin the choice and skip the fallback path.
53
- */
54
71
  export type BackendConfig = AutoBackendConfig | WebGl2BackendConfig | WebGpuBackendConfig;
55
72
  /**
56
73
  * Top-level engine instance. Owns the canvas, render backend, scene-stack
@@ -81,7 +98,7 @@ export declare class Application {
81
98
  readonly loader: Loader;
82
99
  readonly input: InputManager;
83
100
  readonly interaction: InteractionManager;
84
- readonly sceneManager: SceneManager;
101
+ readonly scene: SceneManager;
85
102
  readonly tweens: TweenManager;
86
103
  readonly onResize: Signal<[number, number, Application]>;
87
104
  readonly onFrame: Signal<[Time]>;
@@ -95,21 +112,37 @@ export declare class Application {
95
112
  private readonly _activeClock;
96
113
  private readonly _frameClock;
97
114
  private _status;
115
+ private _pixelRatio;
98
116
  private _frameCount;
99
117
  private _frameRequest;
100
118
  private _backendType;
101
119
  private _backend;
120
+ private _rendering;
102
121
  private _capabilities;
103
122
  private _documentVisible;
104
123
  private _cursor;
105
124
  private readonly _visibilityChangeHandler;
106
- constructor(appSettings?: Partial<ApplicationOptions>);
125
+ constructor(appSettings?: ApplicationOptions);
107
126
  get status(): ApplicationStatus;
108
127
  get startupTime(): Time;
109
128
  get activeTime(): Time;
110
129
  get frameTime(): Time;
111
130
  get frameCount(): number;
131
+ /**
132
+ * Low-level render backend. Prefer the high-level
133
+ * {@link Application.rendering} render context for normal rendering.
134
+ * Direct backend access is an escape hatch for custom render passes
135
+ * and advanced GPU work.
136
+ * @advanced
137
+ */
112
138
  get backend(): RenderBackend;
139
+ /**
140
+ * High-level rendering context. Routes scene drawing through the
141
+ * RenderPlan pipeline (build → optimize → play) and provides off-screen
142
+ * capture via {@link RenderingContext.renderTo}. Exposes the raw
143
+ * {@link RenderBackend} for advanced / custom-renderer use.
144
+ */
145
+ get rendering(): RenderingContext;
113
146
  /**
114
147
  * Resolved capabilities for the host browser. Available after
115
148
  * {@link Application.start} resolves; reading before that throws.
@@ -130,10 +163,27 @@ export declare class Application {
130
163
  start(scene: Scene): Promise<this>;
131
164
  /**
132
165
  * One iteration of the per-frame loop. Invoked by `requestAnimationFrame`.
133
- * Skips the body when the document is hidden and `pauseOnHidden` is
134
- * `true`. Order: reset render stats input + interaction update
135
- * audio update tween update optional view runtime update →
136
- * scene-graph update → onFrame dispatch → backend flush → reschedule.
166
+ * When the document is hidden and `pauseOnHidden` is `true`, the frame
167
+ * clock is reset and the body is skipped preventing a large delta spike
168
+ * on the first visible frame after resume.
169
+ *
170
+ * Each normal frame runs two distinct phases:
171
+ *
172
+ * **Update phase** — input and interaction flush, audio update, tween
173
+ * advancement, optional view runtime update, then `scene.update(delta)` for
174
+ * each participating scene in stack order.
175
+ *
176
+ * **Render phase** — `scene.draw(context)` for each participating scene in
177
+ * stack order, followed by the transition overlay when active.
178
+ *
179
+ * **Frame dispatch / flush** — `onFrame` signal, backend GPU flush,
180
+ * frame-time stat write, RAF reschedule.
181
+ *
182
+ * The simulation `delta` forwarded to all update recipients is clamped to
183
+ * an internal maximum (100 ms) so that debugger pauses, device sleep/resume,
184
+ * or severe browser scheduling gaps cannot produce runaway animation
185
+ * advancement. Real wall-clock time and RAF cadence are unaffected; the raw
186
+ * elapsed delta is recorded separately in `backend.stats.rawFrameDeltaMs`.
137
187
  */
138
188
  update(): this;
139
189
  /**
@@ -155,6 +205,12 @@ export declare class Application {
155
205
  * scratch canvas and used as the cursor image.
156
206
  */
157
207
  setCursor(cursor: string | Texture | HTMLImageElement | HTMLCanvasElement): this;
208
+ /**
209
+ * Renders `node` into an off-screen {@link RenderTexture} and returns it.
210
+ *
211
+ * Convenience wrapper that delegates to {@link RenderingContext.renderTo}.
212
+ */
213
+ renderTo(node: RenderNode, options: RenderToOptions): RenderTexture;
158
214
  /**
159
215
  * Tear down every owned subsystem (loader, interaction, input, tweens,
160
216
  * backend, scene manager, all clocks, all signals) and release event
@@ -164,6 +220,7 @@ export declare class Application {
164
220
  private _onDocumentVisibilityChange;
165
221
  private resolveInitialBackendType;
166
222
  private createBackend;
167
- private initializeRenderManager;
223
+ private initializeBackend;
168
224
  private canUseWebGpu;
225
+ private _applyCanvasSize;
169
226
  }