@codexo/exojs 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (739) hide show
  1. package/CHANGELOG.md +133 -6
  2. package/README.md +80 -63
  3. package/dist/esm/animation/Tween.js +1 -1
  4. package/dist/esm/animation/Tween.js.map +1 -1
  5. package/dist/esm/animation/TweenManager.d.ts +9 -5
  6. package/dist/esm/animation/TweenManager.d.ts.map +1 -1
  7. package/dist/esm/animation/TweenManager.js +14 -8
  8. package/dist/esm/animation/TweenManager.js.map +1 -1
  9. package/dist/esm/animation/index.d.ts +6 -4
  10. package/dist/esm/animation/index.d.ts.map +1 -1
  11. package/dist/esm/audio/AudioBus.d.ts +12 -12
  12. package/dist/esm/audio/AudioBus.js +29 -29
  13. package/dist/esm/audio/AudioEffect.d.ts +18 -0
  14. package/dist/esm/audio/AudioEffect.d.ts.map +1 -0
  15. package/dist/esm/audio/AudioEffect.js +16 -0
  16. package/dist/esm/audio/AudioEffect.js.map +1 -0
  17. package/dist/esm/audio/AudioGenerator.d.ts +91 -0
  18. package/dist/esm/audio/AudioGenerator.d.ts.map +1 -0
  19. package/dist/esm/audio/AudioGenerator.js +165 -0
  20. package/dist/esm/audio/AudioGenerator.js.map +1 -0
  21. package/dist/esm/audio/AudioGeneratorVoice.d.ts +52 -0
  22. package/dist/esm/audio/AudioGeneratorVoice.d.ts.map +1 -0
  23. package/dist/esm/audio/AudioGeneratorVoice.js +141 -0
  24. package/dist/esm/audio/AudioGeneratorVoice.js.map +1 -0
  25. package/dist/esm/audio/AudioInput.d.ts +39 -0
  26. package/dist/esm/audio/AudioInput.d.ts.map +1 -0
  27. package/dist/esm/audio/AudioInput.js +53 -0
  28. package/dist/esm/audio/AudioInput.js.map +1 -0
  29. package/dist/esm/audio/AudioManager.d.ts +72 -34
  30. package/dist/esm/audio/AudioManager.d.ts.map +1 -1
  31. package/dist/esm/audio/AudioManager.js +97 -51
  32. package/dist/esm/audio/AudioManager.js.map +1 -1
  33. package/dist/esm/audio/AudioStream.d.ts +49 -0
  34. package/dist/esm/audio/AudioStream.d.ts.map +1 -0
  35. package/dist/esm/audio/AudioStream.js +109 -0
  36. package/dist/esm/audio/AudioStream.js.map +1 -0
  37. package/dist/esm/audio/AudioStreamVoice.d.ts +61 -0
  38. package/dist/esm/audio/AudioStreamVoice.d.ts.map +1 -0
  39. package/dist/esm/audio/AudioStreamVoice.js +137 -0
  40. package/dist/esm/audio/AudioStreamVoice.js.map +1 -0
  41. package/dist/esm/audio/BaseVoice.d.ts +111 -0
  42. package/dist/esm/audio/BaseVoice.d.ts.map +1 -0
  43. package/dist/esm/audio/BaseVoice.js +298 -0
  44. package/dist/esm/audio/BaseVoice.js.map +1 -0
  45. package/dist/esm/audio/BiquadEffect.d.ts +53 -0
  46. package/dist/esm/audio/BiquadEffect.d.ts.map +1 -0
  47. package/dist/esm/audio/BiquadEffect.js +110 -0
  48. package/dist/esm/audio/BiquadEffect.js.map +1 -0
  49. package/dist/esm/audio/InputVoice.d.ts +41 -0
  50. package/dist/esm/audio/InputVoice.d.ts.map +1 -0
  51. package/dist/esm/audio/InputVoice.js +85 -0
  52. package/dist/esm/audio/InputVoice.js.map +1 -0
  53. package/dist/esm/audio/NoopVoice.d.ts +29 -0
  54. package/dist/esm/audio/NoopVoice.d.ts.map +1 -0
  55. package/dist/esm/audio/NoopVoice.js +52 -0
  56. package/dist/esm/audio/NoopVoice.js.map +1 -0
  57. package/dist/esm/audio/Playable.d.ts +135 -0
  58. package/dist/esm/audio/Playable.d.ts.map +1 -0
  59. package/dist/esm/audio/Sound.d.ts +64 -69
  60. package/dist/esm/audio/Sound.d.ts.map +1 -1
  61. package/dist/esm/audio/Sound.js +176 -377
  62. package/dist/esm/audio/Sound.js.map +1 -1
  63. package/dist/esm/audio/SoundVoice.d.ts +63 -0
  64. package/dist/esm/audio/SoundVoice.d.ts.map +1 -0
  65. package/dist/esm/audio/SoundVoice.js +168 -0
  66. package/dist/esm/audio/SoundVoice.js.map +1 -0
  67. package/dist/esm/audio/{filters/WorkletFilter.d.ts → WorkletEffect.d.ts} +3 -3
  68. package/dist/esm/audio/WorkletEffect.d.ts.map +1 -0
  69. package/dist/esm/audio/{filters/WorkletFilter.js → WorkletEffect.js} +6 -6
  70. package/dist/esm/audio/WorkletEffect.js.map +1 -0
  71. package/dist/esm/audio/audio-context.js +1 -1
  72. package/dist/esm/audio/audio-context.js.map +1 -1
  73. package/dist/esm/audio/crossFade.d.ts +22 -13
  74. package/dist/esm/audio/crossFade.d.ts.map +1 -1
  75. package/dist/esm/audio/crossFade.js +21 -13
  76. package/dist/esm/audio/crossFade.js.map +1 -1
  77. package/dist/esm/audio/filters/HighpassFilter.d.ts +2 -2
  78. package/dist/esm/audio/filters/HighpassFilter.js +2 -2
  79. package/dist/esm/audio/filters/LowpassFilter.d.ts +2 -2
  80. package/dist/esm/audio/filters/LowpassFilter.js +2 -2
  81. package/dist/esm/audio/filters/index.d.ts +0 -10
  82. package/dist/esm/audio/filters/index.d.ts.map +1 -1
  83. package/dist/esm/audio/index.d.ts +13 -15
  84. package/dist/esm/audio/index.d.ts.map +1 -1
  85. package/dist/esm/core/Application.d.ts +127 -10
  86. package/dist/esm/core/Application.d.ts.map +1 -1
  87. package/dist/esm/core/Application.js +226 -25
  88. package/dist/esm/core/Application.js.map +1 -1
  89. package/dist/esm/core/BuildInfo.js +2 -2
  90. package/dist/esm/core/Color.d.ts +6 -4
  91. package/dist/esm/core/Color.d.ts.map +1 -1
  92. package/dist/esm/core/Color.js +19 -15
  93. package/dist/esm/core/Color.js.map +1 -1
  94. package/dist/esm/core/DisposalScope.d.ts +50 -0
  95. package/dist/esm/core/DisposalScope.d.ts.map +1 -0
  96. package/dist/esm/core/DisposalScope.js +86 -0
  97. package/dist/esm/core/DisposalScope.js.map +1 -0
  98. package/dist/esm/core/Perf.d.ts +10 -22
  99. package/dist/esm/core/Perf.d.ts.map +1 -1
  100. package/dist/esm/core/Perf.js +15 -8
  101. package/dist/esm/core/Perf.js.map +1 -1
  102. package/dist/esm/core/Registry.d.ts +64 -0
  103. package/dist/esm/core/Registry.d.ts.map +1 -0
  104. package/dist/esm/core/Registry.js +79 -0
  105. package/dist/esm/core/Registry.js.map +1 -0
  106. package/dist/esm/core/Scene.d.ts +69 -21
  107. package/dist/esm/core/Scene.d.ts.map +1 -1
  108. package/dist/esm/core/Scene.js +109 -16
  109. package/dist/esm/core/Scene.js.map +1 -1
  110. package/dist/esm/core/SceneManager.d.ts +22 -60
  111. package/dist/esm/core/SceneManager.d.ts.map +1 -1
  112. package/dist/esm/core/SceneManager.js +68 -153
  113. package/dist/esm/core/SceneManager.js.map +1 -1
  114. package/dist/esm/core/SceneNode.d.ts +43 -2
  115. package/dist/esm/core/SceneNode.d.ts.map +1 -1
  116. package/dist/esm/core/SceneNode.js +101 -12
  117. package/dist/esm/core/SceneNode.js.map +1 -1
  118. package/dist/esm/core/Signal.js.map +1 -1
  119. package/dist/esm/core/Stage.d.ts +42 -0
  120. package/dist/esm/core/Stage.d.ts.map +1 -0
  121. package/dist/esm/core/System.d.ts +22 -0
  122. package/dist/esm/core/System.d.ts.map +1 -0
  123. package/dist/esm/core/SystemRegistry.d.ts +35 -0
  124. package/dist/esm/core/SystemRegistry.d.ts.map +1 -0
  125. package/dist/esm/core/SystemRegistry.js +104 -0
  126. package/dist/esm/core/SystemRegistry.js.map +1 -0
  127. package/dist/esm/core/Time.d.ts +15 -0
  128. package/dist/esm/core/Time.d.ts.map +1 -1
  129. package/dist/esm/core/Time.js +25 -0
  130. package/dist/esm/core/Time.js.map +1 -1
  131. package/dist/esm/core/dev.d.ts +9 -4
  132. package/dist/esm/core/dev.d.ts.map +1 -1
  133. package/dist/esm/core/dev.js +5 -0
  134. package/dist/esm/core/dev.js.map +1 -1
  135. package/dist/esm/core/index.d.ts +26 -15
  136. package/dist/esm/core/index.d.ts.map +1 -1
  137. package/dist/esm/core/letterbox.d.ts +25 -0
  138. package/dist/esm/core/letterbox.d.ts.map +1 -0
  139. package/dist/esm/core/letterbox.js +26 -0
  140. package/dist/esm/core/letterbox.js.map +1 -0
  141. package/dist/esm/core/serialization/NodeSerializer.d.ts +71 -0
  142. package/dist/esm/core/serialization/NodeSerializer.d.ts.map +1 -0
  143. package/dist/esm/core/serialization/Prefab.d.ts +49 -0
  144. package/dist/esm/core/serialization/Prefab.d.ts.map +1 -0
  145. package/dist/esm/core/serialization/Prefab.js +61 -0
  146. package/dist/esm/core/serialization/Prefab.js.map +1 -0
  147. package/dist/esm/core/serialization/SerializationRegistry.d.ts +95 -0
  148. package/dist/esm/core/serialization/SerializationRegistry.d.ts.map +1 -0
  149. package/dist/esm/core/serialization/SerializationRegistry.js +108 -0
  150. package/dist/esm/core/serialization/SerializationRegistry.js.map +1 -0
  151. package/dist/esm/core/serialization/commonFields.d.ts +20 -0
  152. package/dist/esm/core/serialization/commonFields.d.ts.map +1 -0
  153. package/dist/esm/core/serialization/commonFields.js +149 -0
  154. package/dist/esm/core/serialization/commonFields.js.map +1 -0
  155. package/dist/esm/core/serialization/coreSerializers.d.ts +9 -0
  156. package/dist/esm/core/serialization/coreSerializers.d.ts.map +1 -0
  157. package/dist/esm/core/serialization/coreSerializers.js +101 -0
  158. package/dist/esm/core/serialization/coreSerializers.js.map +1 -0
  159. package/dist/esm/core/serialization/index.d.ts +6 -0
  160. package/dist/esm/core/serialization/index.d.ts.map +1 -0
  161. package/dist/esm/core/serialization/read.d.ts +65 -0
  162. package/dist/esm/core/serialization/read.d.ts.map +1 -0
  163. package/dist/esm/core/serialization/read.js +48 -0
  164. package/dist/esm/core/serialization/read.js.map +1 -0
  165. package/dist/esm/core/serialization/renderingSerializers.d.ts +7 -0
  166. package/dist/esm/core/serialization/renderingSerializers.d.ts.map +1 -0
  167. package/dist/esm/core/serialization/renderingSerializers.js +311 -0
  168. package/dist/esm/core/serialization/renderingSerializers.js.map +1 -0
  169. package/dist/esm/core/serialization/serialize.d.ts +56 -0
  170. package/dist/esm/core/serialization/serialize.d.ts.map +1 -0
  171. package/dist/esm/core/serialization/serialize.js +144 -0
  172. package/dist/esm/core/serialization/serialize.js.map +1 -0
  173. package/dist/esm/core/serialization/serializerHelpers.d.ts +46 -0
  174. package/dist/esm/core/serialization/serializerHelpers.d.ts.map +1 -0
  175. package/dist/esm/core/serialization/serializerHelpers.js +161 -0
  176. package/dist/esm/core/serialization/serializerHelpers.js.map +1 -0
  177. package/dist/esm/core/serialization/types.d.ts +49 -0
  178. package/dist/esm/core/serialization/types.d.ts.map +1 -0
  179. package/dist/esm/core/serialization/types.js +9 -0
  180. package/dist/esm/core/serialization/types.js.map +1 -0
  181. package/dist/esm/core/serialization/uiSerializers.d.ts +7 -0
  182. package/dist/esm/core/serialization/uiSerializers.d.ts.map +1 -0
  183. package/dist/esm/core/serialization/uiSerializers.js +206 -0
  184. package/dist/esm/core/serialization/uiSerializers.js.map +1 -0
  185. package/dist/esm/core/types.d.ts +1 -1
  186. package/dist/esm/core/types.d.ts.map +1 -1
  187. package/dist/esm/core/utils.d.ts +1 -16
  188. package/dist/esm/core/utils.d.ts.map +1 -1
  189. package/dist/esm/core/utils.js +2 -100
  190. package/dist/esm/core/utils.js.map +1 -1
  191. package/dist/esm/debug/PerformanceLayer.js +8 -9
  192. package/dist/esm/debug/PerformanceLayer.js.map +1 -1
  193. package/dist/esm/debug/PointerStackLayer.d.ts.map +1 -1
  194. package/dist/esm/debug/PointerStackLayer.js +9 -6
  195. package/dist/esm/debug/PointerStackLayer.js.map +1 -1
  196. package/dist/esm/debug/RenderPassInspectorLayer.d.ts.map +1 -1
  197. package/dist/esm/debug/RenderPassInspectorLayer.js +19 -12
  198. package/dist/esm/debug/RenderPassInspectorLayer.js.map +1 -1
  199. package/dist/esm/extensions/Extension.d.ts +39 -4
  200. package/dist/esm/extensions/Extension.d.ts.map +1 -1
  201. package/dist/esm/extensions/materialize.d.ts +9 -1
  202. package/dist/esm/extensions/materialize.d.ts.map +1 -1
  203. package/dist/esm/extensions/materialize.js +17 -2
  204. package/dist/esm/extensions/materialize.js.map +1 -1
  205. package/dist/esm/extensions/snapshot.d.ts +2 -1
  206. package/dist/esm/extensions/snapshot.d.ts.map +1 -1
  207. package/dist/esm/extensions/snapshot.js +8 -0
  208. package/dist/esm/extensions/snapshot.js.map +1 -1
  209. package/dist/esm/index.d.ts +2 -1
  210. package/dist/esm/index.d.ts.map +1 -1
  211. package/dist/esm/index.js +34 -59
  212. package/dist/esm/index.js.map +1 -1
  213. package/dist/esm/input/FocusManager.d.ts +59 -0
  214. package/dist/esm/input/FocusManager.d.ts.map +1 -0
  215. package/dist/esm/input/FocusManager.js +175 -0
  216. package/dist/esm/input/FocusManager.js.map +1 -0
  217. package/dist/esm/input/Gamepad.d.ts.map +1 -1
  218. package/dist/esm/input/Gamepad.js +8 -4
  219. package/dist/esm/input/Gamepad.js.map +1 -1
  220. package/dist/esm/input/GamepadAxis.js +2 -2
  221. package/dist/esm/input/GamepadDefinitions.d.ts.map +1 -1
  222. package/dist/esm/input/GamepadDefinitions.js +6 -2
  223. package/dist/esm/input/GamepadDefinitions.js.map +1 -1
  224. package/dist/esm/input/GestureRecognizer.d.ts +1 -2
  225. package/dist/esm/input/GestureRecognizer.d.ts.map +1 -1
  226. package/dist/esm/input/GestureRecognizer.js +1 -3
  227. package/dist/esm/input/GestureRecognizer.js.map +1 -1
  228. package/dist/esm/input/InputBinding.js +3 -3
  229. package/dist/esm/input/InputBinding.js.map +1 -1
  230. package/dist/esm/input/InputManager.d.ts +7 -2
  231. package/dist/esm/input/InputManager.d.ts.map +1 -1
  232. package/dist/esm/input/InputManager.js +35 -21
  233. package/dist/esm/input/InputManager.js.map +1 -1
  234. package/dist/esm/input/InteractionManager.d.ts +67 -2
  235. package/dist/esm/input/InteractionManager.d.ts.map +1 -1
  236. package/dist/esm/input/InteractionManager.js +165 -41
  237. package/dist/esm/input/InteractionManager.js.map +1 -1
  238. package/dist/esm/input/KeyEvent.d.ts +25 -0
  239. package/dist/esm/input/KeyEvent.d.ts.map +1 -0
  240. package/dist/esm/input/KeyEvent.js +32 -0
  241. package/dist/esm/input/KeyEvent.js.map +1 -0
  242. package/dist/esm/input/Pointer.d.ts +21 -4
  243. package/dist/esm/input/Pointer.d.ts.map +1 -1
  244. package/dist/esm/input/Pointer.js +54 -15
  245. package/dist/esm/input/Pointer.js.map +1 -1
  246. package/dist/esm/input/index.d.ts +3 -1
  247. package/dist/esm/input/index.d.ts.map +1 -1
  248. package/dist/esm/math/AbstractVector.d.ts.map +1 -1
  249. package/dist/esm/math/AbstractVector.js +7 -2
  250. package/dist/esm/math/AbstractVector.js.map +1 -1
  251. package/dist/esm/math/Circle.d.ts.map +1 -1
  252. package/dist/esm/math/Circle.js +5 -1
  253. package/dist/esm/math/Circle.js.map +1 -1
  254. package/dist/esm/math/Line.d.ts +1 -1
  255. package/dist/esm/math/Line.d.ts.map +1 -1
  256. package/dist/esm/math/Line.js +1 -1
  257. package/dist/esm/math/Line.js.map +1 -1
  258. package/dist/esm/math/Matrix.d.ts.map +1 -1
  259. package/dist/esm/math/Matrix.js +6 -1
  260. package/dist/esm/math/Matrix.js.map +1 -1
  261. package/dist/esm/math/ObservableVector.d.ts +26 -8
  262. package/dist/esm/math/ObservableVector.d.ts.map +1 -1
  263. package/dist/esm/math/ObservableVector.js +24 -16
  264. package/dist/esm/math/ObservableVector.js.map +1 -1
  265. package/dist/esm/math/Polygon.d.ts +5 -0
  266. package/dist/esm/math/Polygon.d.ts.map +1 -1
  267. package/dist/esm/math/Polygon.js +27 -3
  268. package/dist/esm/math/Polygon.js.map +1 -1
  269. package/dist/esm/math/Random.d.ts +9 -9
  270. package/dist/esm/math/Random.d.ts.map +1 -1
  271. package/dist/esm/math/Random.js +46 -46
  272. package/dist/esm/math/Random.js.map +1 -1
  273. package/dist/esm/math/Rectangle.d.ts +11 -4
  274. package/dist/esm/math/Rectangle.d.ts.map +1 -1
  275. package/dist/esm/math/Rectangle.js +12 -6
  276. package/dist/esm/math/Rectangle.js.map +1 -1
  277. package/dist/esm/math/Vector.d.ts +1 -1
  278. package/dist/esm/math/Vector.d.ts.map +1 -1
  279. package/dist/esm/math/Vector.js +1 -1
  280. package/dist/esm/math/Vector.js.map +1 -1
  281. package/dist/esm/math/collision-detection.d.ts +42 -0
  282. package/dist/esm/math/collision-detection.d.ts.map +1 -1
  283. package/dist/esm/math/collision-detection.js +54 -4
  284. package/dist/esm/math/collision-detection.js.map +1 -1
  285. package/dist/esm/math/collision-primitives.d.ts.map +1 -1
  286. package/dist/esm/math/collision-primitives.js +4 -0
  287. package/dist/esm/math/collision-primitives.js.map +1 -1
  288. package/dist/esm/math/geometry.d.ts +26 -0
  289. package/dist/esm/math/geometry.d.ts.map +1 -1
  290. package/dist/esm/math/geometry.js +89 -2
  291. package/dist/esm/math/geometry.js.map +1 -1
  292. package/dist/esm/math/index.d.ts +7 -5
  293. package/dist/esm/math/index.d.ts.map +1 -1
  294. package/dist/esm/math/swept-collision.d.ts +13 -0
  295. package/dist/esm/math/swept-collision.d.ts.map +1 -1
  296. package/dist/esm/math/swept-collision.js +15 -1
  297. package/dist/esm/math/swept-collision.js.map +1 -1
  298. package/dist/esm/math/triangulate.d.ts.map +1 -1
  299. package/dist/esm/math/triangulate.js +9 -1
  300. package/dist/esm/math/triangulate.js.map +1 -1
  301. package/dist/esm/math/utils.d.ts +20 -0
  302. package/dist/esm/math/utils.d.ts.map +1 -1
  303. package/dist/esm/math/utils.js +18 -15
  304. package/dist/esm/math/utils.js.map +1 -1
  305. package/dist/esm/renderer-sdk.d.ts +2 -0
  306. package/dist/esm/renderer-sdk.d.ts.map +1 -1
  307. package/dist/esm/{rendering.js → renderer-sdk.js} +1 -1
  308. package/dist/esm/renderer-sdk.js.map +1 -0
  309. package/dist/esm/rendering/CallbackRenderPass.js +1 -1
  310. package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
  311. package/dist/esm/rendering/Container.d.ts +3 -0
  312. package/dist/esm/rendering/Container.d.ts.map +1 -1
  313. package/dist/esm/rendering/Container.js +28 -5
  314. package/dist/esm/rendering/Container.js.map +1 -1
  315. package/dist/esm/rendering/Drawable.d.ts +24 -0
  316. package/dist/esm/rendering/Drawable.d.ts.map +1 -1
  317. package/dist/esm/rendering/Drawable.js +54 -0
  318. package/dist/esm/rendering/Drawable.js.map +1 -1
  319. package/dist/esm/rendering/GpuResourceAccountant.d.ts +65 -0
  320. package/dist/esm/rendering/GpuResourceAccountant.d.ts.map +1 -0
  321. package/dist/esm/rendering/GpuResourceAccountant.js +130 -0
  322. package/dist/esm/rendering/GpuResourceAccountant.js.map +1 -0
  323. package/dist/esm/rendering/RenderBackend.d.ts +15 -1
  324. package/dist/esm/rendering/RenderBackend.d.ts.map +1 -1
  325. package/dist/esm/rendering/RenderBatch.d.ts +55 -0
  326. package/dist/esm/rendering/RenderBatch.d.ts.map +1 -0
  327. package/dist/esm/rendering/RenderBatch.js +107 -0
  328. package/dist/esm/rendering/RenderBatch.js.map +1 -0
  329. package/dist/esm/rendering/RenderNode.d.ts +50 -10
  330. package/dist/esm/rendering/RenderNode.d.ts.map +1 -1
  331. package/dist/esm/rendering/RenderNode.js +113 -20
  332. package/dist/esm/rendering/RenderNode.js.map +1 -1
  333. package/dist/esm/rendering/RenderNodePass.js +2 -2
  334. package/dist/esm/rendering/RenderNodePass.js.map +1 -1
  335. package/dist/esm/rendering/RenderStats.d.ts +39 -0
  336. package/dist/esm/rendering/RenderStats.d.ts.map +1 -1
  337. package/dist/esm/rendering/RenderStats.js +14 -0
  338. package/dist/esm/rendering/RenderStats.js.map +1 -1
  339. package/dist/esm/rendering/RendererRegistry.d.ts.map +1 -1
  340. package/dist/esm/rendering/RendererRegistry.js +20 -23
  341. package/dist/esm/rendering/RendererRegistry.js.map +1 -1
  342. package/dist/esm/rendering/RenderingContext.d.ts +88 -4
  343. package/dist/esm/rendering/RenderingContext.d.ts.map +1 -1
  344. package/dist/esm/rendering/RenderingContext.js +107 -5
  345. package/dist/esm/rendering/RenderingContext.js.map +1 -1
  346. package/dist/esm/rendering/TransformBuffer.d.ts.map +1 -1
  347. package/dist/esm/rendering/TransformBuffer.js +2 -0
  348. package/dist/esm/rendering/TransformBuffer.js.map +1 -1
  349. package/dist/esm/rendering/View.d.ts +47 -15
  350. package/dist/esm/rendering/View.d.ts.map +1 -1
  351. package/dist/esm/rendering/View.js +44 -27
  352. package/dist/esm/rendering/View.js.map +1 -1
  353. package/dist/esm/rendering/filters/WebGpuShaderFilter.d.ts.map +1 -1
  354. package/dist/esm/rendering/filters/WebGpuShaderFilter.js +3 -1
  355. package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -1
  356. package/dist/esm/rendering/geometry/Geometry.d.ts.map +1 -1
  357. package/dist/esm/rendering/geometry/Geometry.js +4 -2
  358. package/dist/esm/rendering/geometry/Geometry.js.map +1 -1
  359. package/dist/esm/rendering/gradient/Gradient.d.ts.map +1 -1
  360. package/dist/esm/rendering/gradient/Gradient.js +7 -2
  361. package/dist/esm/rendering/gradient/Gradient.js.map +1 -1
  362. package/dist/esm/rendering/material/MaterialKey.d.ts.map +1 -1
  363. package/dist/esm/rendering/material/MaterialKey.js +2 -0
  364. package/dist/esm/rendering/material/MaterialKey.js.map +1 -1
  365. package/dist/esm/rendering/material/ShaderSource.js +6 -0
  366. package/dist/esm/rendering/material/ShaderSource.js.map +1 -1
  367. package/dist/esm/rendering/mesh/ImmediateMesh.d.ts +48 -0
  368. package/dist/esm/rendering/mesh/ImmediateMesh.d.ts.map +1 -0
  369. package/dist/esm/rendering/mesh/ImmediateMesh.js +85 -0
  370. package/dist/esm/rendering/mesh/ImmediateMesh.js.map +1 -0
  371. package/dist/esm/rendering/mesh/Mesh.d.ts +29 -6
  372. package/dist/esm/rendering/mesh/Mesh.d.ts.map +1 -1
  373. package/dist/esm/rendering/mesh/Mesh.js +40 -13
  374. package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
  375. package/dist/esm/rendering/pixelSnap.d.ts.map +1 -1
  376. package/dist/esm/rendering/pixelSnap.js +1 -0
  377. package/dist/esm/rendering/pixelSnap.js.map +1 -1
  378. package/dist/esm/rendering/plan/RenderCommand.d.ts +31 -9
  379. package/dist/esm/rendering/plan/RenderCommand.d.ts.map +1 -1
  380. package/dist/esm/rendering/plan/RenderCommand.js +23 -21
  381. package/dist/esm/rendering/plan/RenderCommand.js.map +1 -1
  382. package/dist/esm/rendering/plan/RenderEffectExecutor.d.ts.map +1 -1
  383. package/dist/esm/rendering/plan/RenderEffectExecutor.js +1 -0
  384. package/dist/esm/rendering/plan/RenderEffectExecutor.js.map +1 -1
  385. package/dist/esm/rendering/plan/RenderInstruction.d.ts +7 -37
  386. package/dist/esm/rendering/plan/RenderInstruction.d.ts.map +1 -1
  387. package/dist/esm/rendering/plan/RenderPlanBuilder.d.ts +17 -2
  388. package/dist/esm/rendering/plan/RenderPlanBuilder.d.ts.map +1 -1
  389. package/dist/esm/rendering/plan/RenderPlanBuilder.js +132 -46
  390. package/dist/esm/rendering/plan/RenderPlanBuilder.js.map +1 -1
  391. package/dist/esm/rendering/plan/RenderPlanOptimizer.d.ts.map +1 -1
  392. package/dist/esm/rendering/plan/RenderPlanOptimizer.js +31 -4
  393. package/dist/esm/rendering/plan/RenderPlanOptimizer.js.map +1 -1
  394. package/dist/esm/rendering/plan/RenderPlanPlayer.d.ts.map +1 -1
  395. package/dist/esm/rendering/plan/RenderPlanPlayer.js +54 -17
  396. package/dist/esm/rendering/plan/RenderPlanPlayer.js.map +1 -1
  397. package/dist/esm/rendering/plan/RenderScope.d.ts +16 -10
  398. package/dist/esm/rendering/plan/RenderScope.d.ts.map +1 -1
  399. package/dist/esm/rendering/primitives/Graphics.d.ts +6 -0
  400. package/dist/esm/rendering/primitives/Graphics.d.ts.map +1 -1
  401. package/dist/esm/rendering/primitives/Graphics.js +17 -1
  402. package/dist/esm/rendering/primitives/Graphics.js.map +1 -1
  403. package/dist/esm/rendering/{index.d.ts → public.d.ts} +5 -35
  404. package/dist/esm/rendering/public.d.ts.map +1 -0
  405. package/dist/esm/rendering/shader/ShaderAttribute.d.ts.map +1 -1
  406. package/dist/esm/rendering/shader/ShaderAttribute.js +2 -0
  407. package/dist/esm/rendering/shader/ShaderAttribute.js.map +1 -1
  408. package/dist/esm/rendering/sprite/AnimatedSprite.d.ts +11 -0
  409. package/dist/esm/rendering/sprite/AnimatedSprite.d.ts.map +1 -1
  410. package/dist/esm/rendering/sprite/AnimatedSprite.js +24 -2
  411. package/dist/esm/rendering/sprite/AnimatedSprite.js.map +1 -1
  412. package/dist/esm/rendering/sprite/NineSliceSprite.d.ts.map +1 -1
  413. package/dist/esm/rendering/sprite/NineSliceSprite.js +10 -11
  414. package/dist/esm/rendering/sprite/NineSliceSprite.js.map +1 -1
  415. package/dist/esm/rendering/sprite/RepeatingSprite.d.ts.map +1 -1
  416. package/dist/esm/rendering/sprite/RepeatingSprite.js +1 -3
  417. package/dist/esm/rendering/sprite/RepeatingSprite.js.map +1 -1
  418. package/dist/esm/rendering/sprite/Sprite.d.ts.map +1 -1
  419. package/dist/esm/rendering/sprite/Sprite.js +30 -3
  420. package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
  421. package/dist/esm/rendering/sprite/nineSlice.d.ts.map +1 -1
  422. package/dist/esm/rendering/sprite/nineSlice.js +12 -18
  423. package/dist/esm/rendering/sprite/nineSlice.js.map +1 -1
  424. package/dist/esm/rendering/sprite/repeatingSpritePlan.d.ts.map +1 -1
  425. package/dist/esm/rendering/sprite/repeatingSpritePlan.js +2 -2
  426. package/dist/esm/rendering/sprite/repeatingSpritePlan.js.map +1 -1
  427. package/dist/esm/rendering/text/BitmapText.d.ts +2 -0
  428. package/dist/esm/rendering/text/BitmapText.d.ts.map +1 -1
  429. package/dist/esm/rendering/text/BitmapText.js +4 -0
  430. package/dist/esm/rendering/text/BitmapText.js.map +1 -1
  431. package/dist/esm/rendering/text/GlyphAtlas.d.ts.map +1 -1
  432. package/dist/esm/rendering/text/GlyphAtlas.js +2 -1
  433. package/dist/esm/rendering/text/GlyphAtlas.js.map +1 -1
  434. package/dist/esm/rendering/text/GlyphAtlasPool.d.ts +8 -1
  435. package/dist/esm/rendering/text/GlyphAtlasPool.d.ts.map +1 -1
  436. package/dist/esm/rendering/text/GlyphAtlasPool.js +9 -12
  437. package/dist/esm/rendering/text/GlyphAtlasPool.js.map +1 -1
  438. package/dist/esm/rendering/text/GlyphSdf.d.ts.map +1 -1
  439. package/dist/esm/rendering/text/GlyphSdf.js +5 -1
  440. package/dist/esm/rendering/text/GlyphSdf.js.map +1 -1
  441. package/dist/esm/rendering/text/HTMLText.d.ts.map +1 -1
  442. package/dist/esm/rendering/text/HTMLText.js +1 -0
  443. package/dist/esm/rendering/text/HTMLText.js.map +1 -1
  444. package/dist/esm/rendering/text/Text.d.ts +17 -6
  445. package/dist/esm/rendering/text/Text.d.ts.map +1 -1
  446. package/dist/esm/rendering/text/Text.js +7 -12
  447. package/dist/esm/rendering/text/Text.js.map +1 -1
  448. package/dist/esm/rendering/text/TextLayout.d.ts.map +1 -1
  449. package/dist/esm/rendering/text/TextLayout.js +4 -18
  450. package/dist/esm/rendering/text/TextLayout.js.map +1 -1
  451. package/dist/esm/rendering/texture/DataTexture.js +2 -2
  452. package/dist/esm/rendering/texture/DataTexture.js.map +1 -1
  453. package/dist/esm/rendering/texture/Texture.d.ts +6 -0
  454. package/dist/esm/rendering/texture/Texture.d.ts.map +1 -1
  455. package/dist/esm/rendering/texture/Texture.js +8 -0
  456. package/dist/esm/rendering/texture/Texture.js.map +1 -1
  457. package/dist/esm/rendering/texture/TextureRegion.d.ts.map +1 -1
  458. package/dist/esm/rendering/texture/TextureRegion.js.map +1 -1
  459. package/dist/esm/rendering/texture/repeat.d.ts.map +1 -1
  460. package/dist/esm/rendering/texture/repeat.js +2 -2
  461. package/dist/esm/rendering/texture/repeat.js.map +1 -1
  462. package/dist/esm/rendering/types.d.ts +11 -0
  463. package/dist/esm/rendering/types.d.ts.map +1 -1
  464. package/dist/esm/rendering/types.js +11 -0
  465. package/dist/esm/rendering/types.js.map +1 -1
  466. package/dist/esm/rendering/video/Video.d.ts +7 -3
  467. package/dist/esm/rendering/video/Video.d.ts.map +1 -1
  468. package/dist/esm/rendering/video/Video.js +7 -3
  469. package/dist/esm/rendering/video/Video.js.map +1 -1
  470. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.d.ts.map +1 -1
  471. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js +2 -2
  472. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js.map +1 -1
  473. package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +21 -2
  474. package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts.map +1 -1
  475. package/dist/esm/rendering/webgl2/WebGl2Backend.js +106 -6
  476. package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
  477. package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.d.ts.map +1 -1
  478. package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.js +2 -2
  479. package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.js.map +1 -1
  480. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.d.ts +17 -0
  481. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.d.ts.map +1 -1
  482. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +122 -38
  483. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -1
  484. package/dist/esm/rendering/webgl2/WebGl2NineSliceSpriteRenderer.d.ts.map +1 -1
  485. package/dist/esm/rendering/webgl2/WebGl2NineSliceSpriteRenderer.js +2 -1
  486. package/dist/esm/rendering/webgl2/WebGl2NineSliceSpriteRenderer.js.map +1 -1
  487. package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.d.ts +16 -1
  488. package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.d.ts.map +1 -1
  489. package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.js +32 -1
  490. package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.js.map +1 -1
  491. package/dist/esm/rendering/webgl2/WebGl2RepeatingSpriteRenderer.d.ts.map +1 -1
  492. package/dist/esm/rendering/webgl2/WebGl2RepeatingSpriteRenderer.js +15 -11
  493. package/dist/esm/rendering/webgl2/WebGl2RepeatingSpriteRenderer.js.map +1 -1
  494. package/dist/esm/rendering/webgl2/WebGl2ShaderBlock.d.ts.map +1 -1
  495. package/dist/esm/rendering/webgl2/WebGl2ShaderBlock.js +14 -3
  496. package/dist/esm/rendering/webgl2/WebGl2ShaderBlock.js.map +1 -1
  497. package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js +3 -3
  498. package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js.map +1 -1
  499. package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.d.ts.map +1 -1
  500. package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.js +11 -2
  501. package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.js.map +1 -1
  502. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts.map +1 -1
  503. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +7 -2
  504. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
  505. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.d.ts.map +1 -1
  506. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js +3 -2
  507. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js.map +1 -1
  508. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.d.ts.map +1 -1
  509. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js +10 -4
  510. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js.map +1 -1
  511. package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +18 -2
  512. package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts.map +1 -1
  513. package/dist/esm/rendering/webgpu/WebGpuBackend.js +91 -10
  514. package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
  515. package/dist/esm/rendering/webgpu/WebGpuBlendState.d.ts.map +1 -1
  516. package/dist/esm/rendering/webgpu/WebGpuBlendState.js +3 -0
  517. package/dist/esm/rendering/webgpu/WebGpuBlendState.js.map +1 -1
  518. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +13 -0
  519. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts.map +1 -1
  520. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +102 -24
  521. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
  522. package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.d.ts.map +1 -1
  523. package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.js +6 -1
  524. package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.js.map +1 -1
  525. package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.d.ts.map +1 -1
  526. package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.js +19 -9
  527. package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.js.map +1 -1
  528. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts.map +1 -1
  529. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +8 -4
  530. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
  531. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.d.ts.map +1 -1
  532. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js +1 -0
  533. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js.map +1 -1
  534. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.d.ts.map +1 -1
  535. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js +19 -7
  536. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js.map +1 -1
  537. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts +13 -2
  538. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts.map +1 -1
  539. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js +22 -2
  540. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js.map +1 -1
  541. package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js +1 -1
  542. package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.js.map +1 -1
  543. package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.d.ts +7 -0
  544. package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.d.ts.map +1 -1
  545. package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js +8 -0
  546. package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.js.map +1 -1
  547. package/dist/esm/resources/Asset.d.ts +1 -1
  548. package/dist/esm/resources/Asset.d.ts.map +1 -1
  549. package/dist/esm/resources/Asset.js +0 -2
  550. package/dist/esm/resources/Asset.js.map +1 -1
  551. package/dist/esm/resources/AssetContainer.d.ts +75 -0
  552. package/dist/esm/resources/AssetContainer.d.ts.map +1 -0
  553. package/dist/esm/resources/AssetContainer.js +100 -0
  554. package/dist/esm/resources/AssetContainer.js.map +1 -0
  555. package/dist/esm/resources/AssetDefinitions.d.ts +3 -3
  556. package/dist/esm/resources/AssetDefinitions.d.ts.map +1 -1
  557. package/dist/esm/resources/Assets.d.ts.map +1 -1
  558. package/dist/esm/resources/Assets.js +0 -1
  559. package/dist/esm/resources/Assets.js.map +1 -1
  560. package/dist/esm/resources/FactoryRegistry.d.ts.map +1 -1
  561. package/dist/esm/resources/FactoryRegistry.js +14 -23
  562. package/dist/esm/resources/FactoryRegistry.js.map +1 -1
  563. package/dist/esm/resources/IndexedDbDatabase.d.ts.map +1 -1
  564. package/dist/esm/resources/IndexedDbDatabase.js +8 -1
  565. package/dist/esm/resources/IndexedDbDatabase.js.map +1 -1
  566. package/dist/esm/resources/IndexedDbKeyValueStore.d.ts +37 -0
  567. package/dist/esm/resources/IndexedDbKeyValueStore.d.ts.map +1 -0
  568. package/dist/esm/resources/IndexedDbKeyValueStore.js +58 -0
  569. package/dist/esm/resources/IndexedDbKeyValueStore.js.map +1 -0
  570. package/dist/esm/resources/KeyValueStore.d.ts +31 -0
  571. package/dist/esm/resources/KeyValueStore.d.ts.map +1 -0
  572. package/dist/esm/resources/Loader.d.ts +42 -2
  573. package/dist/esm/resources/Loader.d.ts.map +1 -1
  574. package/dist/esm/resources/Loader.js +92 -7
  575. package/dist/esm/resources/Loader.js.map +1 -1
  576. package/dist/esm/resources/MemoryStore.d.ts +17 -0
  577. package/dist/esm/resources/MemoryStore.d.ts.map +1 -0
  578. package/dist/esm/resources/MemoryStore.js +30 -0
  579. package/dist/esm/resources/MemoryStore.js.map +1 -0
  580. package/dist/esm/resources/WebStorageStore.d.ts +40 -0
  581. package/dist/esm/resources/WebStorageStore.d.ts.map +1 -0
  582. package/dist/esm/resources/WebStorageStore.js +84 -0
  583. package/dist/esm/resources/WebStorageStore.js.map +1 -0
  584. package/dist/esm/resources/coreAssetBindings.d.ts.map +1 -1
  585. package/dist/esm/resources/coreAssetBindings.js +16 -5
  586. package/dist/esm/resources/coreAssetBindings.js.map +1 -1
  587. package/dist/esm/resources/factories/BmFontFactory.js +4 -4
  588. package/dist/esm/resources/factories/BmFontFactory.js.map +1 -1
  589. package/dist/esm/resources/factories/MusicFactory.d.ts +9 -9
  590. package/dist/esm/resources/factories/MusicFactory.d.ts.map +1 -1
  591. package/dist/esm/resources/factories/MusicFactory.js +7 -7
  592. package/dist/esm/resources/factories/MusicFactory.js.map +1 -1
  593. package/dist/esm/resources/factories/SoundFactory.js +2 -2
  594. package/dist/esm/resources/factories/SoundFactory.js.map +1 -1
  595. package/dist/esm/resources/factories/SubtitleFactory.d.ts +11 -1
  596. package/dist/esm/resources/factories/SubtitleFactory.d.ts.map +1 -1
  597. package/dist/esm/resources/factories/SubtitleFactory.js +13 -9
  598. package/dist/esm/resources/factories/SubtitleFactory.js.map +1 -1
  599. package/dist/esm/resources/index.d.ts +51 -34
  600. package/dist/esm/resources/index.d.ts.map +1 -1
  601. package/dist/esm/resources/utils.js +4 -4
  602. package/dist/esm/resources/utils.js.map +1 -1
  603. package/dist/esm/ui/Button.d.ts +54 -0
  604. package/dist/esm/ui/Button.d.ts.map +1 -0
  605. package/dist/esm/ui/Button.js +139 -0
  606. package/dist/esm/ui/Button.js.map +1 -0
  607. package/dist/esm/ui/Label.d.ts +17 -0
  608. package/dist/esm/ui/Label.d.ts.map +1 -0
  609. package/dist/esm/ui/Label.js +37 -0
  610. package/dist/esm/ui/Label.js.map +1 -0
  611. package/dist/esm/ui/Panel.d.ts +38 -0
  612. package/dist/esm/ui/Panel.d.ts.map +1 -0
  613. package/dist/esm/ui/Panel.js +61 -0
  614. package/dist/esm/ui/Panel.js.map +1 -0
  615. package/dist/esm/ui/ProgressBar.d.ts +37 -0
  616. package/dist/esm/ui/ProgressBar.d.ts.map +1 -0
  617. package/dist/esm/ui/ProgressBar.js +76 -0
  618. package/dist/esm/ui/ProgressBar.js.map +1 -0
  619. package/dist/esm/ui/Stack.d.ts +34 -0
  620. package/dist/esm/ui/Stack.d.ts.map +1 -0
  621. package/dist/esm/ui/Stack.js +69 -0
  622. package/dist/esm/ui/Stack.js.map +1 -0
  623. package/dist/esm/ui/UIRoot.d.ts +31 -0
  624. package/dist/esm/ui/UIRoot.d.ts.map +1 -0
  625. package/dist/esm/ui/UIRoot.js +49 -0
  626. package/dist/esm/ui/UIRoot.js.map +1 -0
  627. package/dist/esm/ui/Widget.d.ts +45 -0
  628. package/dist/esm/ui/Widget.d.ts.map +1 -0
  629. package/dist/esm/ui/Widget.js +113 -0
  630. package/dist/esm/ui/Widget.js.map +1 -0
  631. package/dist/esm/ui/index.d.ts +13 -0
  632. package/dist/esm/ui/index.d.ts.map +1 -0
  633. package/dist/exo.debug.esm.js +1 -948
  634. package/dist/exo.debug.esm.js.map +1 -1
  635. package/dist/exo.esm.js +1 -40945
  636. package/dist/exo.esm.js.map +1 -1
  637. package/package.json +24 -13
  638. package/dist/esm/audio/AbstractMedia.d.ts +0 -75
  639. package/dist/esm/audio/AbstractMedia.d.ts.map +0 -1
  640. package/dist/esm/audio/AbstractMedia.js +0 -179
  641. package/dist/esm/audio/AbstractMedia.js.map +0 -1
  642. package/dist/esm/audio/AudioAnalyser.d.ts +0 -128
  643. package/dist/esm/audio/AudioAnalyser.d.ts.map +0 -1
  644. package/dist/esm/audio/AudioAnalyser.js +0 -473
  645. package/dist/esm/audio/AudioAnalyser.js.map +0 -1
  646. package/dist/esm/audio/AudioFilter.d.ts +0 -17
  647. package/dist/esm/audio/AudioFilter.d.ts.map +0 -1
  648. package/dist/esm/audio/AudioFilter.js +0 -15
  649. package/dist/esm/audio/AudioFilter.js.map +0 -1
  650. package/dist/esm/audio/BeatDetector.d.ts +0 -207
  651. package/dist/esm/audio/BeatDetector.d.ts.map +0 -1
  652. package/dist/esm/audio/BeatDetector.js +0 -424
  653. package/dist/esm/audio/BeatDetector.js.map +0 -1
  654. package/dist/esm/audio/Media.d.ts +0 -37
  655. package/dist/esm/audio/Media.d.ts.map +0 -1
  656. package/dist/esm/audio/Music.d.ts +0 -42
  657. package/dist/esm/audio/Music.d.ts.map +0 -1
  658. package/dist/esm/audio/Music.js +0 -164
  659. package/dist/esm/audio/Music.js.map +0 -1
  660. package/dist/esm/audio/OscillatorSound.d.ts +0 -100
  661. package/dist/esm/audio/OscillatorSound.d.ts.map +0 -1
  662. package/dist/esm/audio/OscillatorSound.js +0 -346
  663. package/dist/esm/audio/OscillatorSound.js.map +0 -1
  664. package/dist/esm/audio/dsp/fft.d.ts +0 -23
  665. package/dist/esm/audio/dsp/fft.d.ts.map +0 -1
  666. package/dist/esm/audio/dsp/mel.d.ts +0 -44
  667. package/dist/esm/audio/dsp/mel.d.ts.map +0 -1
  668. package/dist/esm/audio/dsp/mel.js +0 -70
  669. package/dist/esm/audio/dsp/mel.js.map +0 -1
  670. package/dist/esm/audio/dsp/tempogram.d.ts +0 -52
  671. package/dist/esm/audio/dsp/tempogram.d.ts.map +0 -1
  672. package/dist/esm/audio/filters/ChorusFilter.d.ts +0 -54
  673. package/dist/esm/audio/filters/ChorusFilter.d.ts.map +0 -1
  674. package/dist/esm/audio/filters/ChorusFilter.js +0 -155
  675. package/dist/esm/audio/filters/ChorusFilter.js.map +0 -1
  676. package/dist/esm/audio/filters/CompressorFilter.d.ts +0 -54
  677. package/dist/esm/audio/filters/CompressorFilter.d.ts.map +0 -1
  678. package/dist/esm/audio/filters/CompressorFilter.js +0 -123
  679. package/dist/esm/audio/filters/CompressorFilter.js.map +0 -1
  680. package/dist/esm/audio/filters/DelayFilter.d.ts +0 -36
  681. package/dist/esm/audio/filters/DelayFilter.d.ts.map +0 -1
  682. package/dist/esm/audio/filters/DelayFilter.js +0 -114
  683. package/dist/esm/audio/filters/DelayFilter.js.map +0 -1
  684. package/dist/esm/audio/filters/DuckingFilter.d.ts +0 -45
  685. package/dist/esm/audio/filters/DuckingFilter.d.ts.map +0 -1
  686. package/dist/esm/audio/filters/DuckingFilter.js +0 -172
  687. package/dist/esm/audio/filters/DuckingFilter.js.map +0 -1
  688. package/dist/esm/audio/filters/EqualizerFilter.d.ts +0 -51
  689. package/dist/esm/audio/filters/EqualizerFilter.d.ts.map +0 -1
  690. package/dist/esm/audio/filters/EqualizerFilter.js +0 -138
  691. package/dist/esm/audio/filters/EqualizerFilter.js.map +0 -1
  692. package/dist/esm/audio/filters/GranularFilter.d.ts +0 -63
  693. package/dist/esm/audio/filters/GranularFilter.d.ts.map +0 -1
  694. package/dist/esm/audio/filters/GranularFilter.js +0 -107
  695. package/dist/esm/audio/filters/GranularFilter.js.map +0 -1
  696. package/dist/esm/audio/filters/PitchShiftFilter.d.ts +0 -45
  697. package/dist/esm/audio/filters/PitchShiftFilter.d.ts.map +0 -1
  698. package/dist/esm/audio/filters/PitchShiftFilter.js +0 -66
  699. package/dist/esm/audio/filters/PitchShiftFilter.js.map +0 -1
  700. package/dist/esm/audio/filters/ReverbFilter.d.ts +0 -38
  701. package/dist/esm/audio/filters/ReverbFilter.d.ts.map +0 -1
  702. package/dist/esm/audio/filters/ReverbFilter.js +0 -122
  703. package/dist/esm/audio/filters/ReverbFilter.js.map +0 -1
  704. package/dist/esm/audio/filters/VocoderFilter.d.ts +0 -50
  705. package/dist/esm/audio/filters/VocoderFilter.d.ts.map +0 -1
  706. package/dist/esm/audio/filters/VocoderFilter.js +0 -94
  707. package/dist/esm/audio/filters/VocoderFilter.js.map +0 -1
  708. package/dist/esm/audio/filters/WorkletFilter.d.ts.map +0 -1
  709. package/dist/esm/audio/filters/WorkletFilter.js.map +0 -1
  710. package/dist/esm/audio/worklets/beat-detector.worklet.d.ts +0 -2
  711. package/dist/esm/audio/worklets/beat-detector.worklet.d.ts.map +0 -1
  712. package/dist/esm/audio/worklets/beat-detector.worklet.js +0 -647
  713. package/dist/esm/audio/worklets/beat-detector.worklet.js.map +0 -1
  714. package/dist/esm/audio/worklets/granular.worklet.d.ts +0 -2
  715. package/dist/esm/audio/worklets/granular.worklet.d.ts.map +0 -1
  716. package/dist/esm/audio/worklets/granular.worklet.js +0 -89
  717. package/dist/esm/audio/worklets/granular.worklet.js.map +0 -1
  718. package/dist/esm/audio/worklets/pitch-shift.worklet.d.ts +0 -2
  719. package/dist/esm/audio/worklets/pitch-shift.worklet.d.ts.map +0 -1
  720. package/dist/esm/audio/worklets/pitch-shift.worklet.js +0 -74
  721. package/dist/esm/audio/worklets/pitch-shift.worklet.js.map +0 -1
  722. package/dist/esm/audio/worklets/vocoder.worklet.d.ts +0 -2
  723. package/dist/esm/audio/worklets/vocoder.worklet.d.ts.map +0 -1
  724. package/dist/esm/audio/worklets/vocoder.worklet.js +0 -92
  725. package/dist/esm/audio/worklets/vocoder.worklet.js.map +0 -1
  726. package/dist/esm/input/internal/interactionManagerRegistry.d.ts +0 -10
  727. package/dist/esm/input/internal/interactionManagerRegistry.d.ts.map +0 -1
  728. package/dist/esm/input/internal/interactionManagerRegistry.js +0 -10
  729. package/dist/esm/input/internal/interactionManagerRegistry.js.map +0 -1
  730. package/dist/esm/rendering/index.d.ts.map +0 -1
  731. package/dist/esm/rendering/plan/RenderInstruction.js +0 -45
  732. package/dist/esm/rendering/plan/RenderInstruction.js.map +0 -1
  733. package/dist/esm/rendering.d.ts +0 -29
  734. package/dist/esm/rendering.d.ts.map +0 -1
  735. package/dist/esm/rendering.js.map +0 -1
  736. package/dist/esm/resources/JsonStore.d.ts +0 -19
  737. package/dist/esm/resources/JsonStore.d.ts.map +0 -1
  738. package/dist/esm/resources/JsonStore.js +0 -62
  739. package/dist/esm/resources/JsonStore.js.map +0 -1
@@ -1,949 +1,2 @@
1
- import { Color } from '@codexo/exojs';
2
- import { Graphics } from '@codexo/exojs';
3
- import { Keyboard } from '@codexo/exojs';
4
- import { View } from '@codexo/exojs';
5
- import { Container } from '@codexo/exojs';
6
- import { Text } from '@codexo/exojs';
7
- import { TextStyle } from '@codexo/exojs';
8
- import { RenderPipeline } from '@codexo/exojs';
9
-
10
- /**
11
- * Abstract base for a single diagnostic overlay layer. Subclasses produce a
12
- * visual (outlines, text panels, sparklines, etc.) that
13
- * {@link DebugOverlay} composites each frame when {@link visible} is `true`.
14
- *
15
- * Concrete layers are tree-shakeable via the `@codexo/exojs/debug` subpath
16
- * and are not loaded unless explicitly imported.
17
- */
18
- class DebugLayer {
19
- _app;
20
- visible = false;
21
- constructor(_app) {
22
- this._app = _app;
23
- }
24
- /**
25
- * Whether this layer renders in the scene's world-space view or in a
26
- * screen-space (canvas-pixel) view. Defaults to 'screen'. Subclasses
27
- * override to return 'world' when rendering at actual scene positions.
28
- */
29
- get viewMode() {
30
- return 'screen';
31
- }
32
- /**
33
- * Release any scene-graph nodes or resources owned by this layer.
34
- * Called by {@link DebugOverlay.destroy}. The base implementation is a
35
- * no-op; subclasses override to tear down their {@link Container} subtrees.
36
- */
37
- destroy() {
38
- // Default: nothing. Subclasses override to release Container subtrees etc.
39
- }
40
- }
41
-
42
- // ---------------------------------------------------------------------------
43
- // HSL → RGB helper
44
- // ---------------------------------------------------------------------------
45
- /**
46
- * Convert HSL (hue 0-360, saturation 0-1, lightness 0-1) to a Color instance.
47
- * Returns an RGB Color (alpha = alpha parameter).
48
- */
49
- function hslToColor(h, s, l, alpha) {
50
- const c = (1 - Math.abs(2 * l - 1)) * s;
51
- const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
52
- const m = l - c / 2;
53
- let r;
54
- let g;
55
- let b;
56
- if (h < 60) {
57
- r = c;
58
- g = x;
59
- b = 0;
60
- }
61
- else if (h < 120) {
62
- r = x;
63
- g = c;
64
- b = 0;
65
- }
66
- else if (h < 180) {
67
- r = 0;
68
- g = c;
69
- b = x;
70
- }
71
- else if (h < 240) {
72
- r = 0;
73
- g = x;
74
- b = c;
75
- }
76
- else if (h < 300) {
77
- r = x;
78
- g = 0;
79
- b = c;
80
- }
81
- else {
82
- r = c;
83
- g = 0;
84
- b = x;
85
- }
86
- return new Color(r + m, g + m, b + m, alpha);
87
- }
88
- // ---------------------------------------------------------------------------
89
- /**
90
- * Debug layer that draws a bounding-box outline around every visible
91
- * RenderNode in the scene. Colours cycle by zIndex (HSL hue). World-space.
92
- */
93
- class BoundingBoxesLayer extends DebugLayer {
94
- _graphics = null;
95
- constructor(app) {
96
- super(app);
97
- }
98
- /** Renders in world-space so outlines align with scene node positions. */
99
- get viewMode() {
100
- return 'world';
101
- }
102
- /** No per-frame pre-computation required; all state is derived in {@link render}. */
103
- update(_delta) {
104
- // State is built in render() each frame; nothing to pre-compute here.
105
- }
106
- /**
107
- * Walk the scene tree and draw a colored rectangle outline around every
108
- * visible node that has non-zero bounds. Outline hue cycles by `zIndex`
109
- * so overlapping nodes are visually distinguishable.
110
- */
111
- render(backend) {
112
- const root = this._app.scene.currentScene?.root;
113
- if (!root) {
114
- return;
115
- }
116
- if (this._graphics === null) {
117
- this._graphics = new Graphics();
118
- }
119
- const gfx = this._graphics;
120
- gfx.clear();
121
- gfx.lineWidth = 1;
122
- this._walkNode(root, gfx);
123
- gfx.render(backend);
124
- }
125
- /** Release the internal {@link Graphics} primitive. */
126
- destroy() {
127
- if (this._graphics !== null) {
128
- this._graphics.destroy();
129
- this._graphics = null;
130
- }
131
- }
132
- // -----------------------------------------------------------------------
133
- _walkNode(node, gfx) {
134
- if (!node.visible) {
135
- return;
136
- }
137
- const bounds = node.getBounds();
138
- // Skip zero-area bounds (defensive).
139
- if (bounds.width > 0 && bounds.height > 0) {
140
- const hue = (((node.zIndex * 30) % 360) + 360) % 360;
141
- const color = hslToColor(hue, 0.7, 0.5, 0.7);
142
- gfx.lineColor = color;
143
- // Draw the rectangle outline as four line segments.
144
- const l = bounds.left;
145
- const t = bounds.top;
146
- const r = bounds.right;
147
- const bo = bounds.bottom;
148
- gfx.moveTo(l, t);
149
- gfx.lineTo(r, t);
150
- gfx.lineTo(r, bo);
151
- gfx.lineTo(l, bo);
152
- gfx.lineTo(l, t);
153
- color.destroy();
154
- }
155
- // Recurse into Container children.
156
- const container = node;
157
- if (Array.isArray(container.children)) {
158
- for (const child of container.children) {
159
- this._walkNode(child, gfx);
160
- }
161
- }
162
- }
163
- }
164
-
165
- // Color constants (created once, reused).
166
- const colorIdle = new Color(1, 0, 1, 0.6); // magenta
167
- const colorHovered = new Color(1, 1, 0, 0.9); // yellow
168
- const colorCaptured = new Color(0, 1, 1, 0.9); // cyan
169
- const colorQuadrant = new Color(0.5, 0.5, 0.5, 0.3); // faint gray
170
- /**
171
- * Debug layer that draws outlines around interactive scene nodes.
172
- * - Magenta: interactive but idle.
173
- * - Yellow: currently hovered.
174
- * - Cyan: pointer-captured (drag in progress).
175
- * - Faint gray quadrant outlines when the spatial index is active (i.e.
176
- * at least one interactive node is present in the scene).
177
- * World-space.
178
- */
179
- class HitTestLayer extends DebugLayer {
180
- _graphics = null;
181
- constructor(app) {
182
- super(app);
183
- }
184
- /** Renders in world-space so outlines align with interactive node positions. */
185
- get viewMode() {
186
- return 'world';
187
- }
188
- /** No per-frame pre-computation required; all state is derived in {@link render}. */
189
- update(_delta) {
190
- // Nothing to pre-compute; all state is read in render().
191
- }
192
- /**
193
- * Walk the scene tree and draw color-coded outlines around interactive
194
- * nodes (magenta = idle, yellow = hovered, cyan = pointer-captured).
195
- * Also draws faint gray quadrant boundaries when the spatial index is
196
- * active, helping diagnose partitioning behavior.
197
- */
198
- render(backend) {
199
- const root = this._app.scene.currentScene?.root;
200
- if (!root) {
201
- return;
202
- }
203
- if (this._graphics === null) {
204
- this._graphics = new Graphics();
205
- }
206
- const gfx = this._graphics;
207
- gfx.clear();
208
- gfx.lineWidth = 1;
209
- // Determine hovered and captured sets for color-coding.
210
- const interaction = this._app.interaction;
211
- const hoveredNode = interaction.getHoveredNode();
212
- const capturedNodes = new Set(interaction.getCapturedNodes());
213
- // Walk scene and draw outlines for interactive nodes.
214
- this._walkNode(root, gfx, hoveredNode, capturedNodes);
215
- // Draw quadtree regions when the spatial index is active.
216
- const quadtree = interaction._getDebugQuadtree();
217
- if (quadtree !== null) {
218
- gfx.lineColor = colorQuadrant;
219
- quadtree._walkBounds(rect => {
220
- gfx.moveTo(rect.left, rect.top);
221
- gfx.lineTo(rect.right, rect.top);
222
- gfx.lineTo(rect.right, rect.bottom);
223
- gfx.lineTo(rect.left, rect.bottom);
224
- gfx.lineTo(rect.left, rect.top);
225
- });
226
- }
227
- gfx.render(backend);
228
- }
229
- /** Release the internal {@link Graphics} primitive. */
230
- destroy() {
231
- if (this._graphics !== null) {
232
- this._graphics.destroy();
233
- this._graphics = null;
234
- }
235
- }
236
- // -----------------------------------------------------------------------
237
- _walkNode(node, gfx, hovered, captured) {
238
- if (!node.visible) {
239
- return;
240
- }
241
- if (node.interactive) {
242
- const bounds = node.getBounds();
243
- if (bounds.width > 0 && bounds.height > 0) {
244
- if (captured.has(node)) {
245
- gfx.lineColor = colorCaptured;
246
- }
247
- else if (node === hovered) {
248
- gfx.lineColor = colorHovered;
249
- }
250
- else {
251
- gfx.lineColor = colorIdle;
252
- }
253
- gfx.moveTo(bounds.left, bounds.top);
254
- gfx.lineTo(bounds.right, bounds.top);
255
- gfx.lineTo(bounds.right, bounds.bottom);
256
- gfx.lineTo(bounds.left, bounds.bottom);
257
- gfx.lineTo(bounds.left, bounds.top);
258
- }
259
- }
260
- // Recurse into Container children.
261
- const container = node;
262
- if (Array.isArray(container.children)) {
263
- for (const child of container.children) {
264
- this._walkNode(child, gfx, hovered, captured);
265
- }
266
- }
267
- }
268
- }
269
-
270
- // --- layout constants (camelCase to satisfy lint naming convention) ----------
271
- const panelX$1 = 8;
272
- const panelY$1 = 8;
273
- const panelW$1 = 180;
274
- const panelH$1 = 130;
275
- const lineH$1 = 14;
276
- const textSize$2 = 11;
277
- const textRowCount = 4;
278
- const sparklineY = panelY$1 + 8 + textRowCount * lineH$1 + 4;
279
- const sparklineH = panelH$1 - (sparklineY - panelY$1) - 4;
280
- const sparklineW = panelW$1 - 16;
281
- const sparklineX = panelX$1 + 8;
282
- const fpsSampleCount = 60;
283
- const sparklineSampleCount = 120;
284
- const sparklineMaxMs = 33; // 100% height = 33ms (~30 fps)
285
- // Semi-transparent dark background.
286
- const bgColor$2 = new Color(0, 0, 0, 0.7);
287
- // Bright text color (light blue-white).
288
- const textColor$2 = Color.white.clone();
289
- // Cyan sparkline.
290
- const sparklineColor = new Color(0, 1, 1, 1);
291
- // -----------------------------------------------------------------------------
292
- /** Recursively count nodes under a RenderNode. */
293
- function countNodes(node) {
294
- let count = 1;
295
- const container = node;
296
- if (Array.isArray(container.children)) {
297
- for (const child of container.children) {
298
- count += countNodes(child);
299
- }
300
- }
301
- return count;
302
- }
303
- /**
304
- * Debug layer that renders a compact screen-space HUD (top-left) showing
305
- * rolling-average FPS, per-frame time in milliseconds, draw-call count, and
306
- * scene-node count, alongside a 120-sample frame-time sparkline.
307
- *
308
- * Enable via {@link DebugOverlay} or by pressing F1 while the canvas has focus.
309
- */
310
- class PerformanceLayer extends DebugLayer {
311
- // Rolling FPS sample buffer (60 samples).
312
- _fpsSamples = new Float32Array(fpsSampleCount);
313
- _fpsSampleIndex = 0;
314
- // Rolling frame-time buffer (120 samples) for sparkline.
315
- _sparkSamples = new Float32Array(sparklineSampleCount);
316
- _sparkSampleIndex = 0;
317
- // Root container — lazily initialized on first update() call so the
318
- // glyph atlas is not touched in environments where canvas 2D is absent.
319
- _root = null;
320
- _textFps = null;
321
- _textFrame = null;
322
- _textDraws = null;
323
- _textNodes = null;
324
- _sparkline = null;
325
- constructor(app) {
326
- super(app);
327
- }
328
- get viewMode() {
329
- return 'screen';
330
- }
331
- /**
332
- * Sample the current frame time, recompute the rolling FPS average,
333
- * update stat text nodes, and rebuild the sparkline geometry. Lazily
334
- * initializes the panel scene graph on first call to avoid touching the
335
- * glyph atlas until the layer is actually shown.
336
- */
337
- update(delta) {
338
- // Lazily build the scene graph on first update so that Text (which
339
- // touches the glyph atlas immediately) is only constructed when the
340
- // layer is first made visible — not at DebugOverlay construction time.
341
- if (this._root === null) {
342
- this._build();
343
- }
344
- // --- FPS rolling average ---
345
- const frameMs = delta.milliseconds;
346
- this._fpsSamples[this._fpsSampleIndex] = frameMs;
347
- this._fpsSampleIndex = (this._fpsSampleIndex + 1) % fpsSampleCount;
348
- let totalMs = 0;
349
- let validSamples = 0;
350
- for (let i = 0; i < fpsSampleCount; i++) {
351
- const s = this._fpsSamples[i];
352
- if (s > 0) {
353
- totalMs += s;
354
- validSamples++;
355
- }
356
- }
357
- const avgMs = validSamples > 0 ? totalMs / validSamples : 0;
358
- const fps = avgMs > 0 ? 1000 / avgMs : 0;
359
- // --- Sparkline sample ---
360
- this._sparkSamples[this._sparkSampleIndex] = frameMs;
361
- this._sparkSampleIndex = (this._sparkSampleIndex + 1) % sparklineSampleCount;
362
- // --- Stats ---
363
- const stats = this._app.backend.stats;
364
- const scene = this._app.scene.currentScene;
365
- const nodeCount = scene ? countNodes(scene.root) : 0;
366
- // --- Update text ---
367
- if (this._textFps !== null) {
368
- this._textFps.text = `FPS: ${fps.toFixed(1)}`;
369
- }
370
- if (this._textFrame !== null) {
371
- this._textFrame.text = `Frame: ${frameMs.toFixed(1)}ms`;
372
- }
373
- if (this._textDraws !== null) {
374
- this._textDraws.text = `Draws: ${stats.drawCalls}`;
375
- }
376
- if (this._textNodes !== null) {
377
- this._textNodes.text = `Nodes: ${nodeCount}`;
378
- }
379
- // --- Rebuild sparkline geometry ---
380
- if (this._sparkline !== null) {
381
- this._sparkline.clear();
382
- this._sparkline.lineWidth = 1;
383
- this._sparkline.lineColor = sparklineColor;
384
- // Walk samples in chronological order (oldest first).
385
- const oldest = this._sparkSampleIndex;
386
- const stepX = sparklineW / (sparklineSampleCount - 1);
387
- let started = false;
388
- for (let i = 0; i < sparklineSampleCount; i++) {
389
- const sampleIndex = (oldest + i) % sparklineSampleCount;
390
- const ms = this._sparkSamples[sampleIndex];
391
- const px = sparklineX + i * stepX;
392
- const py = sparklineY + sparklineH - Math.min(1, ms / sparklineMaxMs) * sparklineH;
393
- if (!started) {
394
- this._sparkline.moveTo(px, py);
395
- started = true;
396
- }
397
- else {
398
- this._sparkline.lineTo(px, py);
399
- }
400
- }
401
- }
402
- }
403
- /** Submit the panel's {@link Container} subtree to the backend for drawing. */
404
- render(backend) {
405
- this._root?.render(backend);
406
- }
407
- /** Destroy the panel's {@link Container} subtree and release all child references. */
408
- destroy() {
409
- if (this._root !== null) {
410
- this._root.destroy();
411
- this._root = null;
412
- }
413
- this._textFps = null;
414
- this._textFrame = null;
415
- this._textDraws = null;
416
- this._textNodes = null;
417
- this._sparkline = null;
418
- }
419
- // -----------------------------------------------------------------------
420
- _build() {
421
- const style = new TextStyle({
422
- fontSize: textSize$2,
423
- fontFamily: 'Arial',
424
- fontWeight: 'normal',
425
- fillColor: textColor$2,
426
- });
427
- const bg = new Graphics();
428
- bg.fillColor = bgColor$2;
429
- bg.drawRectangle(panelX$1, panelY$1, panelW$1, panelH$1);
430
- this._textFps = new Text('FPS: -', style.clone());
431
- this._textFrame = new Text('Frame: -', style.clone());
432
- this._textDraws = new Text('Draws: -', style.clone());
433
- this._textNodes = new Text('Nodes: -', style.clone());
434
- this._textFps.x = panelX$1 + 8;
435
- this._textFps.y = panelY$1 + 8;
436
- this._textFrame.x = panelX$1 + 8;
437
- this._textFrame.y = panelY$1 + 8 + lineH$1;
438
- this._textDraws.x = panelX$1 + 8;
439
- this._textDraws.y = panelY$1 + 8 + lineH$1 * 2;
440
- this._textNodes.x = panelX$1 + 8;
441
- this._textNodes.y = panelY$1 + 8 + lineH$1 * 3;
442
- this._sparkline = new Graphics();
443
- this._root = new Container();
444
- this._root.addChild(bg);
445
- this._root.addChild(this._textFps);
446
- this._root.addChild(this._textFrame);
447
- this._root.addChild(this._textDraws);
448
- this._root.addChild(this._textNodes);
449
- this._root.addChild(this._sparkline);
450
- }
451
- }
452
-
453
- // ---------------------------------------------------------------------------
454
- // Layout constants
455
- // ---------------------------------------------------------------------------
456
- const panelW = 260;
457
- const panelH = 160;
458
- const panelPad = 8;
459
- const lineH = 14;
460
- const textSize$1 = 11;
461
- const maxEntries = 10;
462
- // Semi-transparent dark background.
463
- const bgColor$1 = new Color(0, 0, 0, 0.7);
464
- const textColor$1 = Color.white.clone();
465
- // ---------------------------------------------------------------------------
466
- /**
467
- * Debug layer that shows a screen-space panel (top-right corner) listing all
468
- * RenderNodes under the current pointer position, sorted by zIndex descending.
469
- * Screen-space.
470
- */
471
- class PointerStackLayer extends DebugLayer {
472
- _root = null;
473
- _bg = null;
474
- _lines = [];
475
- constructor(app) {
476
- super(app);
477
- }
478
- /** Renders in screen-space so the panel stays fixed in the top-right corner. */
479
- get viewMode() {
480
- return 'screen';
481
- }
482
- /**
483
- * Lazily initialize the panel on first call, reposition it to the
484
- * top-right corner, and populate text lines with the current pointer
485
- * stack (up to 10 entries, sorted by zIndex descending).
486
- */
487
- update(_delta) {
488
- if (this._root === null) {
489
- this._build();
490
- }
491
- const canvas = this._app.canvas;
492
- const panelX = canvas.width - panelW - panelPad;
493
- const panelY = panelPad;
494
- // Position the panel.
495
- if (this._root !== null) {
496
- this._root.x = panelX;
497
- this._root.y = panelY;
498
- }
499
- // Collect stack info.
500
- const lines = this._buildLines();
501
- // Update text nodes.
502
- for (let i = 0; i < this._lines.length; i++) {
503
- const lineNode = this._lines[i];
504
- if (i < lines.length) {
505
- lineNode.text = lines[i];
506
- lineNode.visible = true;
507
- }
508
- else {
509
- lineNode.text = '';
510
- lineNode.visible = false;
511
- }
512
- }
513
- }
514
- /** Submit the panel's {@link Container} subtree to the backend for drawing. */
515
- render(backend) {
516
- this._root?.render(backend);
517
- }
518
- /** Destroy the panel's {@link Container} subtree and release all child references. */
519
- destroy() {
520
- if (this._root !== null) {
521
- this._root.destroy();
522
- this._root = null;
523
- }
524
- this._bg = null;
525
- this._lines = [];
526
- }
527
- // -----------------------------------------------------------------------
528
- _build() {
529
- const style = new TextStyle({
530
- fontSize: textSize$1,
531
- fontFamily: 'Arial',
532
- fontWeight: 'normal',
533
- fillColor: textColor$1,
534
- });
535
- this._bg = new Graphics();
536
- this._bg.fillColor = bgColor$1;
537
- // Panel background will be repositioned in update(); draw at local (0,0).
538
- this._bg.drawRectangle(0, 0, panelW, panelH);
539
- this._root = new Container();
540
- this._root.addChild(this._bg);
541
- // Pre-allocate enough Text nodes for header + entries.
542
- const totalLines = maxEntries + 2; // header row + cursor row + entries
543
- for (let i = 0; i < totalLines; i++) {
544
- const t = new Text('', style.clone());
545
- t.x = panelPad;
546
- t.y = panelPad + i * lineH;
547
- t.visible = false;
548
- this._root.addChild(t);
549
- this._lines.push(t);
550
- }
551
- }
552
- _buildLines() {
553
- const pos = this._app.input.getPrimaryPointerPosition();
554
- if (pos === null) {
555
- return ['Pointer: (none)'];
556
- }
557
- const { x: sx, y: sy } = pos;
558
- // The pointer x/y is canvas-relative. InteractionManager passes this
559
- // directly to node.contains(), so we do the same.
560
- const worldX = sx;
561
- const worldY = sy;
562
- const lines = [];
563
- lines.push(`Cursor: (${sx.toFixed(0)}, ${sy.toFixed(0)})`);
564
- lines.push('Stack (top→bottom):');
565
- // Collect all visible RenderNodes whose contains() returns true.
566
- const root = this._app.scene.currentScene?.root;
567
- const stack = [];
568
- if (root) {
569
- this._collectContaining(root, worldX, worldY, stack);
570
- stack.sort((a, b) => b.zIndex - a.zIndex);
571
- }
572
- const shown = stack.slice(0, maxEntries);
573
- for (const node of shown) {
574
- const name = node.constructor.name;
575
- const z = node.zIndex;
576
- const inter = node.interactive ? ' — interactive' : '';
577
- lines.push(` ${name} — z=${z}${inter}`);
578
- }
579
- if (stack.length > maxEntries) {
580
- lines.push(` … +${stack.length - maxEntries} more`);
581
- }
582
- if (shown.length === 0) {
583
- lines.push(' (none)');
584
- }
585
- return lines;
586
- }
587
- _collectContaining(node, x, y, result) {
588
- if (!node.visible) {
589
- return;
590
- }
591
- if (node.contains(x, y)) {
592
- result.push(node);
593
- }
594
- const container = node;
595
- if (Array.isArray(container.children)) {
596
- for (const child of container.children) {
597
- this._collectContaining(child, x, y, result);
598
- }
599
- }
600
- }
601
- }
602
-
603
- /**
604
- * Canvas-native debug overlay. Instantiate AFTER Application is constructed:
605
- *
606
- * import { DebugOverlay } from '@codexo/exojs/debug';
607
- * const debug = new DebugOverlay(app);
608
- * debug.layers.performance.visible = true; // or press F1
609
- *
610
- * The overlay subscribes to `app.onFrame` and renders its visible layers.
611
- * World-space layers render first (under text panels) in the scene view;
612
- * screen-space layers then render in the overlay's pixel-space view.
613
- *
614
- * Keybindings (while canvas has focus):
615
- * F1 — toggle Performance layer
616
- * F2 — toggle BoundingBoxes layer
617
- * F3 — toggle HitTest layer
618
- * F4 — toggle PointerStack layer
619
- *
620
- * NOTE: F-keys only fire while the canvas has focus (engine convention).
621
- *
622
- * The master `visible` switch suppresses all layer rendering when false
623
- * without changing individual layer visibility flags.
624
- */
625
- class DebugOverlay {
626
- /** Master visibility switch. When false, no layers render regardless of their individual flags. */
627
- visible = true;
628
- /** The four built-in diagnostic layers. Toggle each layer's `visible` flag or use the F1–F4 keybindings. */
629
- layers;
630
- _app;
631
- _view;
632
- _onFrameHandler;
633
- _onKeyDownHandler;
634
- _onResizeHandler;
635
- constructor(app) {
636
- this._app = app;
637
- this._view = new View(app.canvas.width / 2, app.canvas.height / 2, app.canvas.width, app.canvas.height);
638
- this.layers = {
639
- performance: new PerformanceLayer(app),
640
- boundingBoxes: new BoundingBoxesLayer(app),
641
- hitTest: new HitTestLayer(app),
642
- pointerStack: new PointerStackLayer(app),
643
- };
644
- this._onFrameHandler = this._onFrame.bind(this);
645
- this._onKeyDownHandler = this._onKeyDown.bind(this);
646
- this._onResizeHandler = this._onResize.bind(this);
647
- app.onFrame.add(this._onFrameHandler);
648
- app.input.onKeyDown.add(this._onKeyDownHandler);
649
- app.onResize.add(this._onResizeHandler);
650
- }
651
- /**
652
- * Unsubscribe from all application events, destroy every layer, and
653
- * release the overlay's internal {@link View}. Call this when you no
654
- * longer need the overlay to avoid memory leaks.
655
- */
656
- destroy() {
657
- this._app.onFrame.remove(this._onFrameHandler);
658
- this._app.input.onKeyDown.remove(this._onKeyDownHandler);
659
- this._app.onResize.remove(this._onResizeHandler);
660
- for (const layer of Object.values(this.layers)) {
661
- layer.destroy();
662
- }
663
- this._view.destroy();
664
- }
665
- _onResize(width, height) {
666
- this._view.resize(width, height);
667
- this._view.setCenter(width / 2, height / 2);
668
- }
669
- _onFrame(delta) {
670
- if (!this.visible)
671
- return;
672
- const layers = Object.values(this.layers);
673
- const visibleLayers = layers.filter(l => l.visible);
674
- if (visibleLayers.length === 0)
675
- return;
676
- const backend = this._app.backend;
677
- const sceneView = backend.view; // capture scene's current view
678
- // --- World-space layers first (render under screen-space text panels) ---
679
- const worldLayers = visibleLayers.filter(l => l.viewMode === 'world');
680
- for (const layer of worldLayers) {
681
- layer.update(delta);
682
- layer.render(backend);
683
- }
684
- // --- Screen-space layers: swap to overlay's pixel view ---
685
- const screenLayers = visibleLayers.filter(l => l.viewMode === 'screen');
686
- if (screenLayers.length > 0) {
687
- backend.setView(this._view);
688
- try {
689
- for (const layer of screenLayers) {
690
- layer.update(delta);
691
- layer.render(backend);
692
- }
693
- }
694
- finally {
695
- backend.setView(sceneView);
696
- }
697
- }
698
- }
699
- _onKeyDown(channel) {
700
- switch (channel) {
701
- case Keyboard.F1:
702
- this.layers.performance.visible = !this.layers.performance.visible;
703
- break;
704
- case Keyboard.F2:
705
- this.layers.boundingBoxes.visible = !this.layers.boundingBoxes.visible;
706
- break;
707
- case Keyboard.F3:
708
- this.layers.hitTest.visible = !this.layers.hitTest.visible;
709
- break;
710
- case Keyboard.F4:
711
- this.layers.pointerStack.visible = !this.layers.pointerStack.visible;
712
- break;
713
- }
714
- }
715
- }
716
-
717
- const panelX = 200; // sit to the right of the PerformanceLayer panel
718
- const panelY = 8;
719
- const panelMinW = 240;
720
- const panelMaxLines = 24;
721
- const panelLineH = 13;
722
- const panelPadding = 8;
723
- const textSize = 11;
724
- const bgColor = new Color(0, 0, 0, 0.7);
725
- const headerColor = new Color(0.6, 1, 1, 1);
726
- const textColor = Color.white.clone();
727
- const dimColor = new Color(0.7, 0.7, 0.7, 1);
728
- /**
729
- * Debug layer that lists every {@link RenderNode} with an active filter chain
730
- * each frame. Renders a compact text panel with per-drawable rows showing
731
- * the filter sequence, bounding-box dimensions, and mask/cache status.
732
- *
733
- * Use during development to answer:
734
- *
735
- * - "Is my filter actually attached?" → it appears in the list
736
- * - "Why does my frame have N render passes?" → see total pass count
737
- * - "Is this drawable being re-rendered or cached?" → `[cached]` flag
738
- *
739
- * For deep per-pass inspection (intermediate render-target contents, GLSL/WGSL
740
- * source, uniform values), use Spector.js or Chrome DevTools' WebGPU panel —
741
- * the engine emits debug-group labels around filter and mesh-custom-shader
742
- * passes so those tools show meaningful pass names.
743
- */
744
- class RenderPassInspectorLayer extends DebugLayer {
745
- _entries = [];
746
- _root = null;
747
- _bg = null;
748
- _header = null;
749
- _lines = [];
750
- _pipeline = null;
751
- constructor(app) {
752
- super(app);
753
- }
754
- /**
755
- * Flatten a {@link RenderPipeline} into depth-tagged rows, recursing into nested pipelines. Pure and
756
- * app-independent: identity is the pass object and `label` is display-only — no names are required.
757
- */
758
- static describePipeline(pipeline) {
759
- const rows = [];
760
- RenderPassInspectorLayer._collectPipelineRows(pipeline, 0, rows);
761
- return rows;
762
- }
763
- static _collectPipelineRows(pipeline, depth, rows) {
764
- for (const pass of pipeline) {
765
- rows.push({ depth, label: pass.label, enabled: pass.enabled, isPipeline: pass instanceof RenderPipeline });
766
- if (pass instanceof RenderPipeline) {
767
- RenderPassInspectorLayer._collectPipelineRows(pass, depth + 1, rows);
768
- }
769
- }
770
- }
771
- get viewMode() {
772
- return 'screen';
773
- }
774
- /**
775
- * Walk the scene graph and collect filter-chain entries for every
776
- * {@link RenderNode} with at least one filter. Replaces the previous
777
- * frame's snapshot. The current snapshot is exposed via {@link entries}
778
- * for tests and external consumers.
779
- */
780
- update(_delta) {
781
- if (this._root === null) {
782
- this._build();
783
- }
784
- this._entries.length = 0;
785
- const root = this._app.scene.currentScene?.root;
786
- if (root) {
787
- this._collect(root);
788
- }
789
- this._refreshPanel();
790
- }
791
- /** Submit the panel's {@link Container} subtree to the backend for drawing. */
792
- render(backend) {
793
- this._root?.render(backend);
794
- }
795
- destroy() {
796
- if (this._root !== null) {
797
- this._root.destroy();
798
- this._root = null;
799
- }
800
- this._bg = null;
801
- this._header = null;
802
- this._lines = [];
803
- this._entries.length = 0;
804
- this._pipeline = null;
805
- }
806
- /**
807
- * Read-only snapshot of the entries collected on the most recent
808
- * {@link update} call. Useful for tests and for external tooling that
809
- * wants to render its own visualisation rather than use the built-in
810
- * panel.
811
- */
812
- get entries() {
813
- return this._entries;
814
- }
815
- /** Total pass count across all collected entries. */
816
- get totalPasses() {
817
- let total = 0;
818
- for (const entry of this._entries) {
819
- total += entry.filters.length;
820
- if (entry.hasMask)
821
- total++;
822
- }
823
- return total;
824
- }
825
- /** Set a {@link RenderPipeline} to list beneath the filter chains, or `null` to clear it. */
826
- setPipeline(pipeline) {
827
- this._pipeline = pipeline;
828
- return this;
829
- }
830
- /** The pipeline currently being inspected, or `null`. */
831
- get pipeline() {
832
- return this._pipeline;
833
- }
834
- /** Depth-tagged rows for the inspected pipeline (empty if none is set). */
835
- pipelineRows() {
836
- return this._pipeline !== null ? RenderPassInspectorLayer.describePipeline(this._pipeline) : [];
837
- }
838
- // -----------------------------------------------------------------------
839
- _collect(node) {
840
- if (!node.visible)
841
- return;
842
- if (node.filters.length > 0) {
843
- const bounds = node.getBounds();
844
- this._entries.push({
845
- drawableLabel: node.constructor.name,
846
- filters: [...node.filters],
847
- width: Math.max(1, Math.ceil(bounds.width)),
848
- height: Math.max(1, Math.ceil(bounds.height)),
849
- hasMask: node.mask !== null,
850
- cachedAsBitmap: node.cacheAsBitmap,
851
- });
852
- }
853
- const container = node;
854
- if (Array.isArray(container.children)) {
855
- for (const child of container.children) {
856
- this._collect(child);
857
- }
858
- }
859
- }
860
- _build() {
861
- const style = new TextStyle({
862
- fontSize: textSize,
863
- fontFamily: 'Arial',
864
- fontWeight: 'normal',
865
- fillColor: textColor,
866
- });
867
- this._bg = new Graphics();
868
- const headerStyle = style.clone();
869
- headerStyle.fillColor = headerColor;
870
- this._header = new Text('', headerStyle);
871
- this._header.x = panelX + panelPadding;
872
- this._header.y = panelY + panelPadding;
873
- this._lines = [];
874
- for (let i = 0; i < panelMaxLines; i++) {
875
- const line = new Text('', style.clone());
876
- line.x = panelX + panelPadding;
877
- line.y = panelY + panelPadding + panelLineH + i * panelLineH;
878
- this._lines.push(line);
879
- }
880
- this._root = new Container();
881
- this._root.addChild(this._bg);
882
- this._root.addChild(this._header);
883
- for (const line of this._lines)
884
- this._root.addChild(line);
885
- }
886
- _refreshPanel() {
887
- if (this._header === null || this._bg === null)
888
- return;
889
- const lines = [];
890
- if (this._entries.length === 0) {
891
- lines.push({ text: '(no active filter chains)', dim: true });
892
- }
893
- else {
894
- for (const entry of this._entries) {
895
- const flags = [];
896
- if (entry.hasMask)
897
- flags.push('mask');
898
- if (entry.cachedAsBitmap)
899
- flags.push('cached');
900
- const flagsText = flags.length > 0 ? ` [${flags.join(',')}]` : '';
901
- lines.push({
902
- text: `${entry.drawableLabel} ${entry.width}x${entry.height}${flagsText}`,
903
- dim: false,
904
- });
905
- for (let i = 0; i < entry.filters.length; i++) {
906
- lines.push({ text: ` ${i}. ${entry.filters[i].constructor.name}`, dim: false });
907
- }
908
- }
909
- }
910
- const pipelineRows = this.pipelineRows();
911
- if (pipelineRows.length > 0) {
912
- lines.push({ text: 'Pipeline:', dim: true });
913
- for (const row of pipelineRows) {
914
- const indent = ' '.repeat(row.depth + 1);
915
- lines.push({ text: `${indent}${row.label}${row.enabled ? '' : ' [off]'}`, dim: !row.enabled });
916
- }
917
- }
918
- this._header.text = `Render Passes: ${this.totalPasses}`;
919
- const visibleCount = Math.min(lines.length, this._lines.length);
920
- for (let i = 0; i < this._lines.length; i++) {
921
- const line = this._lines[i];
922
- if (i < visibleCount) {
923
- const entry = lines[i];
924
- line.text = entry.text;
925
- line.style.fillColor = entry.dim ? dimColor : textColor;
926
- line.visible = true;
927
- }
928
- else {
929
- line.text = '';
930
- line.visible = false;
931
- }
932
- }
933
- if (lines.length > this._lines.length) {
934
- const last = this._lines[this._lines.length - 1];
935
- const overflow = lines.length - this._lines.length;
936
- last.text = `... (+${overflow} more)`;
937
- last.style.fillColor = dimColor;
938
- last.visible = true;
939
- }
940
- // Resize background to fit content.
941
- const panelHeight = panelPadding * 2 + panelLineH * (1 + visibleCount);
942
- this._bg.clear();
943
- this._bg.fillColor = bgColor;
944
- this._bg.drawRectangle(panelX, panelY, panelMinW, panelHeight);
945
- }
946
- }
947
-
948
- export { BoundingBoxesLayer, DebugLayer, DebugOverlay, HitTestLayer, PerformanceLayer, PointerStackLayer, RenderPassInspectorLayer };
1
+ import{Color as e}from"@codexo/exojs";import{Graphics as t}from"@codexo/exojs";import{Keyboard as s}from"@codexo/exojs";import{View as i}from"@codexo/exojs";import{Container as n}from"@codexo/exojs";import{Text as o}from"@codexo/exojs";import{RenderPipeline as r}from"@codexo/exojs";class l{_app;visible=!1;constructor(e){this._app=e}get viewMode(){return"screen"}destroy(){}}class h extends l{_graphics=null;constructor(e){super(e)}get viewMode(){return"world"}update(e){}render(e){const s=this._app.scene.currentScene?.root;if(!s)return;null===this._graphics&&(this._graphics=new t);const i=this._graphics;i.clear(),i.lineWidth=1,this._walkNode(s,i),i.render(e)}destroy(){null!==this._graphics&&(this._graphics.destroy(),this._graphics=null)}_walkNode(t,s){if(!t.visible)return;const i=t.getBounds();if(i.width>0&&i.height>0){const n=function(t,s,i,n){const o=(1-Math.abs(2*i-1))*s,r=o*(1-Math.abs(t/60%2-1)),l=i-o/2;let h,a,c;return t<60?(h=o,a=r,c=0):t<120?(h=r,a=o,c=0):t<180?(h=0,a=o,c=r):t<240?(h=0,a=r,c=o):t<300?(h=r,a=0,c=o):(h=o,a=0,c=r),new e(h+l,a+l,c+l,n)}((30*t.zIndex%360+360)%360,.7,.5,.7);s.lineColor=n;const o=i.left,r=i.top,l=i.right,h=i.bottom;s.moveTo(o,r),s.lineTo(l,r),s.lineTo(l,h),s.lineTo(o,h),s.lineTo(o,r),n.destroy()}const n=t;if(Array.isArray(n.children))for(const e of n.children)this._walkNode(e,s)}}const a=new e(1,0,1,.6),c=new e(1,1,0,.9),d=new e(0,1,1,.9),_=new e(.5,.5,.5,.3);class p extends l{_graphics=null;constructor(e){super(e)}get viewMode(){return"world"}update(e){}render(e){const s=this._app.scene.currentScene?.root;if(!s)return;null===this._graphics&&(this._graphics=new t);const i=this._graphics;i.clear(),i.lineWidth=1;const n=this._app.interaction,o=n.getHoveredNode(),r=new Set(n.getCapturedNodes());this._walkNode(s,i,o,r);const l=n._getDebugQuadtree();null!==l&&(i.lineColor=_,l._walkBounds(e=>{i.moveTo(e.left,e.top),i.lineTo(e.right,e.top),i.lineTo(e.right,e.bottom),i.lineTo(e.left,e.bottom),i.lineTo(e.left,e.top)})),i.render(e)}destroy(){null!==this._graphics&&(this._graphics.destroy(),this._graphics=null)}_walkNode(e,t,s,i){if(!e.visible)return;if(e.interactive){const n=e.getBounds();n.width>0&&n.height>0&&(i.has(e)?t.lineColor=d:t.lineColor=e===s?c:a,t.moveTo(n.left,n.top),t.lineTo(n.right,n.top),t.lineTo(n.right,n.bottom),t.lineTo(n.left,n.bottom),t.lineTo(n.left,n.top))}const n=e;if(Array.isArray(n.children))for(const e of n.children)this._walkNode(e,t,s,i)}}const u=120,f=new e(0,0,0,.7),w=e.white.clone(),x=new e(0,1,1,1);function m(e){let t=1;const s=e;if(Array.isArray(s.children))for(const e of s.children)t+=m(e);return t}class g extends l{_fpsSamples=new Float32Array(60);_fpsSampleIndex=0;_sparkSamples=new Float32Array(u);_sparkSampleIndex=0;_root=null;_textFps=null;_textFrame=null;_textDraws=null;_textNodes=null;_sparkline=null;constructor(e){super(e)}get viewMode(){return"screen"}update(e){null===this._root&&this._build();const t=e.milliseconds;this._fpsSamples[this._fpsSampleIndex]=t,this._fpsSampleIndex=(this._fpsSampleIndex+1)%60;let s=0,i=0;for(let e=0;e<60;e++){const t=this._fpsSamples[e];void 0!==t&&t>0&&(s+=t,i++)}const n=i>0?s/i:0,o=n>0?1e3/n:0;this._sparkSamples[this._sparkSampleIndex]=t,this._sparkSampleIndex=(this._sparkSampleIndex+1)%u;const r=this._app.backend.stats,l=this._app.scene.currentScene,h=l?m(l.root):0;if(null!==this._textFps&&(this._textFps.text=`FPS: ${o.toFixed(1)}`),null!==this._textFrame&&(this._textFrame.text=`Frame: ${t.toFixed(1)}ms`),null!==this._textDraws&&(this._textDraws.text=`Draws: ${r.drawCalls}`),null!==this._textNodes&&(this._textNodes.text=`Nodes: ${h}`),null!==this._sparkline){this._sparkline.clear(),this._sparkline.lineWidth=1,this._sparkline.lineColor=x;const e=this._sparkSampleIndex,t=164/119;let s=!1;for(let i=0;i<u;i++){const n=(e+i)%u,o=this._sparkSamples[n]??0,r=16+i*t,l=134-58*Math.min(1,o/33);s?this._sparkline.lineTo(r,l):(this._sparkline.moveTo(r,l),s=!0)}}}render(e){this._root?.render(e)}destroy(){null!==this._root&&(this._root.destroy(),this._root=null),this._textFps=null,this._textFrame=null,this._textDraws=null,this._textNodes=null,this._sparkline=null}_build(){const e={fontSize:11,fontFamily:"Arial",fontWeight:"normal",fillColor:w},s=new t;s.fillColor=f,s.drawRectangle(8,8,180,130),this._textFps=new o("FPS: -",e),this._textFrame=new o("Frame: -",e),this._textDraws=new o("Draws: -",e),this._textNodes=new o("Nodes: -",e),this._textFps.x=16,this._textFps.y=16,this._textFrame.x=16,this._textFrame.y=30,this._textDraws.x=16,this._textDraws.y=44,this._textNodes.x=16,this._textNodes.y=58,this._sparkline=new t,this._root=new n,this._root.addChild(s),this._root.addChild(this._textFps),this._root.addChild(this._textFrame),this._root.addChild(this._textDraws),this._root.addChild(this._textNodes),this._root.addChild(this._sparkline)}}const b=new e(0,0,0,.7),v=e.white.clone();class y extends l{_root=null;_bg=null;_lines=[];constructor(e){super(e)}get viewMode(){return"screen"}update(e){null===this._root&&this._build();const t=this._app.canvas.width-260-8;null!==this._root&&(this._root.x=t,this._root.y=8);const s=this._buildLines();for(let e=0;e<this._lines.length;e++){const t=this._lines[e];if(void 0===t)continue;const i=s[e];void 0!==i?(t.text=i,t.visible=!0):(t.text="",t.visible=!1)}}render(e){this._root?.render(e)}destroy(){null!==this._root&&(this._root.destroy(),this._root=null),this._bg=null,this._lines=[]}_build(){const e={fontSize:11,fontFamily:"Arial",fontWeight:"normal",fillColor:v};this._bg=new t,this._bg.fillColor=b,this._bg.drawRectangle(0,0,260,160),this._root=new n,this._root.addChild(this._bg);for(let t=0;t<12;t++){const s=new o("",e);s.x=8,s.y=8+14*t,s.visible=!1,this._root.addChild(s),this._lines.push(s)}}_buildLines(){const e=this._app.input.getPrimaryPointerPosition();if(null===e)return["Pointer: (none)"];const{x:t,y:s}=e,i=t,n=s,o=[];o.push(`Cursor: (${t.toFixed(0)}, ${s.toFixed(0)})`),o.push("Stack (top→bottom):");const r=this._app.scene.currentScene?.root,l=[];r&&(this._collectContaining(r,i,n,l),l.sort((e,t)=>t.zIndex-e.zIndex));const h=l.slice(0,10);for(const e of h){const t=e.constructor.name,s=e.zIndex,i=e.interactive?" — interactive":"";o.push(` ${t} — z=${s}${i}`)}return l.length>10&&o.push(` … +${l.length-10} more`),0===h.length&&o.push(" (none)"),o}_collectContaining(e,t,s,i){if(!e.visible)return;e.contains(t,s)&&i.push(e);const n=e;if(Array.isArray(n.children))for(const e of n.children)this._collectContaining(e,t,s,i)}}class F{visible=!0;layers;_app;_view;_onFrameHandler;_onKeyDownHandler;_onResizeHandler;constructor(e){this._app=e,this._view=new i(e.canvas.width/2,e.canvas.height/2,e.canvas.width,e.canvas.height),this.layers={performance:new g(e),boundingBoxes:new h(e),hitTest:new p(e),pointerStack:new y(e)},this._onFrameHandler=this._onFrame.bind(this),this._onKeyDownHandler=this._onKeyDown.bind(this),this._onResizeHandler=this._onResize.bind(this),e.onFrame.add(this._onFrameHandler),e.input.onKeyDown.add(this._onKeyDownHandler),e.onResize.add(this._onResizeHandler)}destroy(){this._app.onFrame.remove(this._onFrameHandler),this._app.input.onKeyDown.remove(this._onKeyDownHandler),this._app.onResize.remove(this._onResizeHandler);for(const e of Object.values(this.layers))e.destroy();this._view.destroy()}_onResize(e,t){this._view.resize(e,t),this._view.setCenter(e/2,t/2)}_onFrame(e){if(!this.visible)return;const t=Object.values(this.layers).filter(e=>e.visible);if(0===t.length)return;const s=this._app.backend,i=s.view,n=t.filter(e=>"world"===e.viewMode);for(const t of n)t.update(e),t.render(s);const o=t.filter(e=>"screen"===e.viewMode);if(o.length>0){s.setView(this._view);try{for(const t of o)t.update(e),t.render(s)}finally{s.setView(i)}}}_onKeyDown(e){switch(e){case s.F1:this.layers.performance.visible=!this.layers.performance.visible;break;case s.F2:this.layers.boundingBoxes.visible=!this.layers.boundingBoxes.visible;break;case s.F3:this.layers.hitTest.visible=!this.layers.hitTest.visible;break;case s.F4:this.layers.pointerStack.visible=!this.layers.pointerStack.visible}}}const k=new e(0,0,0,.7),C=new e(.6,1,1,1),S=e.white.clone(),$=new e(.7,.7,.7,1);class T extends l{_entries=[];_root=null;_bg=null;_header=null;_lines=[];_pipeline=null;constructor(e){super(e)}static describePipeline(e){const t=[];return T._collectPipelineRows(e,0,t),t}static _collectPipelineRows(e,t,s){for(const i of e)s.push({depth:t,label:i.label,enabled:i.enabled,isPipeline:i instanceof r}),i instanceof r&&T._collectPipelineRows(i,t+1,s)}get viewMode(){return"screen"}update(e){null===this._root&&this._build(),this._entries.length=0;const t=this._app.scene.currentScene?.root;t&&this._collect(t),this._refreshPanel()}render(e){this._root?.render(e)}destroy(){null!==this._root&&(this._root.destroy(),this._root=null),this._bg=null,this._header=null,this._lines=[],this._entries.length=0,this._pipeline=null}get entries(){return this._entries}get totalPasses(){let e=0;for(const t of this._entries)e+=t.filters.length,t.hasMask&&e++;return e}setPipeline(e){return this._pipeline=e,this}get pipeline(){return this._pipeline}pipelineRows(){return null!==this._pipeline?T.describePipeline(this._pipeline):[]}_collect(e){if(!e.visible)return;if(e.filters.length>0){const t=e.getBounds();this._entries.push({drawableLabel:e.constructor.name,filters:[...e.filters],width:Math.max(1,Math.ceil(t.width)),height:Math.max(1,Math.ceil(t.height)),hasMask:null!==e.mask,cachedAsBitmap:e.cacheAsBitmap})}const t=e;if(Array.isArray(t.children))for(const e of t.children)this._collect(e)}_build(){const e={fontSize:11,fontFamily:"Arial",fontWeight:"normal",fillColor:S};this._bg=new t;const s={...e,fillColor:C};this._header=new o("",s),this._header.x=208,this._header.y=16,this._lines=[];for(let t=0;t<24;t++){const s=new o("",e);s.x=208,s.y=29+13*t,this._lines.push(s)}this._root=new n,this._root.addChild(this._bg),this._root.addChild(this._header);for(const e of this._lines)this._root.addChild(e)}_refreshPanel(){if(null===this._header||null===this._bg)return;const e=[];if(0===this._entries.length)e.push({text:"(no active filter chains)",dim:!0});else for(const t of this._entries){const s=[];t.hasMask&&s.push("mask"),t.cachedAsBitmap&&s.push("cached");const i=s.length>0?` [${s.join(",")}]`:"";e.push({text:`${t.drawableLabel} ${t.width}x${t.height}${i}`,dim:!1});for(let s=0;s<t.filters.length;s++){const i=t.filters[s];void 0!==i&&e.push({text:` ${s}. ${i.constructor.name}`,dim:!1})}}const t=this.pipelineRows();if(t.length>0){e.push({text:"Pipeline:",dim:!0});for(const s of t){const t=" ".repeat(s.depth+1);e.push({text:`${t}${s.label}${s.enabled?"":" [off]"}`,dim:!s.enabled})}}this._header.text=`Render Passes: ${this.totalPasses}`;const s=Math.min(e.length,this._lines.length);for(let t=0;t<this._lines.length;t++){const i=this._lines[t];if(void 0===i)continue;const n=t<s?e[t]:void 0;void 0!==n?(i.text=n.text,i.style.fillColor=n.dim?$:S,i.visible=!0):(i.text="",i.visible=!1)}if(e.length>this._lines.length){const t=this._lines[this._lines.length-1],s=e.length-this._lines.length;void 0!==t&&(t.text=`... (+${s} more)`,t.style.fillColor=$,t.visible=!0)}const i=16+13*(1+s);this._bg.clear(),this._bg.fillColor=k,this._bg.drawRectangle(200,8,240,i)}}export{h as BoundingBoxesLayer,l as DebugLayer,F as DebugOverlay,p as HitTestLayer,g as PerformanceLayer,y as PointerStackLayer,T as RenderPassInspectorLayer};
949
2
  //# sourceMappingURL=exo.debug.esm.js.map