@codexo/exojs 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (468) hide show
  1. package/CHANGELOG.md +163 -0
  2. package/README.md +141 -0
  3. package/dist/esm/audio/AbstractMedia.d.ts +45 -0
  4. package/dist/esm/audio/AbstractMedia.js +103 -0
  5. package/dist/esm/audio/AbstractMedia.js.map +1 -0
  6. package/dist/esm/audio/AudioAnalyser.d.ts +30 -0
  7. package/dist/esm/audio/AudioAnalyser.js +92 -0
  8. package/dist/esm/audio/AudioAnalyser.js.map +1 -0
  9. package/dist/esm/audio/Media.d.ts +25 -0
  10. package/dist/esm/audio/Music.d.ts +20 -0
  11. package/dist/esm/audio/Music.js +119 -0
  12. package/dist/esm/audio/Music.js.map +1 -0
  13. package/dist/esm/audio/Sound.d.ts +56 -0
  14. package/dist/esm/audio/Sound.js +394 -0
  15. package/dist/esm/audio/Sound.js.map +1 -0
  16. package/dist/esm/audio/audio-context.d.ts +11 -0
  17. package/dist/esm/audio/audio-context.js +115 -0
  18. package/dist/esm/audio/audio-context.js.map +1 -0
  19. package/dist/esm/audio/index.d.ts +6 -0
  20. package/dist/esm/core/Application.d.ts +76 -0
  21. package/dist/esm/core/Application.js +206 -0
  22. package/dist/esm/core/Application.js.map +1 -0
  23. package/dist/esm/core/Bounds.d.ts +19 -0
  24. package/dist/esm/core/Bounds.js +59 -0
  25. package/dist/esm/core/Bounds.js.map +1 -0
  26. package/dist/esm/core/Clock.d.ts +18 -0
  27. package/dist/esm/core/Clock.js +68 -0
  28. package/dist/esm/core/Clock.js.map +1 -0
  29. package/dist/esm/core/Color.d.ts +176 -0
  30. package/dist/esm/core/Color.js +265 -0
  31. package/dist/esm/core/Color.js.map +1 -0
  32. package/dist/esm/core/Quadtree.d.ts +20 -0
  33. package/dist/esm/core/Quadtree.js +86 -0
  34. package/dist/esm/core/Quadtree.js.map +1 -0
  35. package/dist/esm/core/Scene.d.ts +83 -0
  36. package/dist/esm/core/Scene.js +81 -0
  37. package/dist/esm/core/Scene.js.map +1 -0
  38. package/dist/esm/core/SceneManager.d.ts +66 -0
  39. package/dist/esm/core/SceneManager.js +396 -0
  40. package/dist/esm/core/SceneManager.js.map +1 -0
  41. package/dist/esm/core/SceneNode.d.ts +58 -0
  42. package/dist/esm/core/SceneNode.js +174 -0
  43. package/dist/esm/core/SceneNode.js.map +1 -0
  44. package/dist/esm/core/Signal.d.ts +18 -0
  45. package/dist/esm/core/Signal.js +63 -0
  46. package/dist/esm/core/Signal.js.map +1 -0
  47. package/dist/esm/core/Time.d.ts +38 -0
  48. package/dist/esm/core/Time.js +107 -0
  49. package/dist/esm/core/Time.js.map +1 -0
  50. package/dist/esm/core/Timer.d.ts +12 -0
  51. package/dist/esm/core/Timer.js +34 -0
  52. package/dist/esm/core/Timer.js.map +1 -0
  53. package/dist/esm/core/index.d.ts +13 -0
  54. package/dist/esm/core/types.d.ts +29 -0
  55. package/dist/esm/core/utils.d.ts +22 -0
  56. package/dist/esm/core/utils.js +136 -0
  57. package/dist/esm/core/utils.js.map +1 -0
  58. package/dist/esm/index.d.ts +8 -0
  59. package/dist/esm/index.js +135 -0
  60. package/dist/esm/index.js.map +1 -0
  61. package/dist/esm/input/ArcadeStickGamepadMapping.d.ts +5 -0
  62. package/dist/esm/input/ArcadeStickGamepadMapping.js +29 -0
  63. package/dist/esm/input/ArcadeStickGamepadMapping.js.map +1 -0
  64. package/dist/esm/input/GameCubeGamepadMapping.d.ts +5 -0
  65. package/dist/esm/input/GameCubeGamepadMapping.js +9 -0
  66. package/dist/esm/input/GameCubeGamepadMapping.js.map +1 -0
  67. package/dist/esm/input/Gamepad.d.ts +45 -0
  68. package/dist/esm/input/Gamepad.js +154 -0
  69. package/dist/esm/input/Gamepad.js.map +1 -0
  70. package/dist/esm/input/GamepadChannels.d.ts +39 -0
  71. package/dist/esm/input/GamepadChannels.js +45 -0
  72. package/dist/esm/input/GamepadChannels.js.map +1 -0
  73. package/dist/esm/input/GamepadControl.d.ts +15 -0
  74. package/dist/esm/input/GamepadControl.js +29 -0
  75. package/dist/esm/input/GamepadControl.js.map +1 -0
  76. package/dist/esm/input/GamepadDefinitions.d.ts +31 -0
  77. package/dist/esm/input/GamepadDefinitions.js +175 -0
  78. package/dist/esm/input/GamepadDefinitions.js.map +1 -0
  79. package/dist/esm/input/GamepadMapping.d.ts +23 -0
  80. package/dist/esm/input/GamepadMapping.js +32 -0
  81. package/dist/esm/input/GamepadMapping.js.map +1 -0
  82. package/dist/esm/input/GamepadPromptLayouts.d.ts +9 -0
  83. package/dist/esm/input/GamepadPromptLayouts.js +140 -0
  84. package/dist/esm/input/GamepadPromptLayouts.js.map +1 -0
  85. package/dist/esm/input/GenericDualAnalogGamepadMapping.d.ts +5 -0
  86. package/dist/esm/input/GenericDualAnalogGamepadMapping.js +53 -0
  87. package/dist/esm/input/GenericDualAnalogGamepadMapping.js.map +1 -0
  88. package/dist/esm/input/Input.d.ts +28 -0
  89. package/dist/esm/input/Input.js +68 -0
  90. package/dist/esm/input/Input.js.map +1 -0
  91. package/dist/esm/input/InputManager.d.ts +76 -0
  92. package/dist/esm/input/InputManager.js +346 -0
  93. package/dist/esm/input/InputManager.js.map +1 -0
  94. package/dist/esm/input/JoyConLeftGamepadMapping.d.ts +5 -0
  95. package/dist/esm/input/JoyConLeftGamepadMapping.js +9 -0
  96. package/dist/esm/input/JoyConLeftGamepadMapping.js.map +1 -0
  97. package/dist/esm/input/JoyConRightGamepadMapping.d.ts +5 -0
  98. package/dist/esm/input/JoyConRightGamepadMapping.js +9 -0
  99. package/dist/esm/input/JoyConRightGamepadMapping.js.map +1 -0
  100. package/dist/esm/input/PlayStationGamepadMapping.d.ts +5 -0
  101. package/dist/esm/input/PlayStationGamepadMapping.js +9 -0
  102. package/dist/esm/input/PlayStationGamepadMapping.js.map +1 -0
  103. package/dist/esm/input/Pointer.d.ts +52 -0
  104. package/dist/esm/input/Pointer.js +127 -0
  105. package/dist/esm/input/Pointer.js.map +1 -0
  106. package/dist/esm/input/SteamControllerGamepadMapping.d.ts +5 -0
  107. package/dist/esm/input/SteamControllerGamepadMapping.js +9 -0
  108. package/dist/esm/input/SteamControllerGamepadMapping.js.map +1 -0
  109. package/dist/esm/input/SwitchProGamepadMapping.d.ts +5 -0
  110. package/dist/esm/input/SwitchProGamepadMapping.js +9 -0
  111. package/dist/esm/input/SwitchProGamepadMapping.js.map +1 -0
  112. package/dist/esm/input/XboxGamepadMapping.d.ts +5 -0
  113. package/dist/esm/input/XboxGamepadMapping.js +9 -0
  114. package/dist/esm/input/XboxGamepadMapping.js.map +1 -0
  115. package/dist/esm/input/index.d.ts +19 -0
  116. package/dist/esm/input/types.d.ts +111 -0
  117. package/dist/esm/input/types.js +117 -0
  118. package/dist/esm/input/types.js.map +1 -0
  119. package/dist/esm/math/AbstractVector.d.ts +33 -0
  120. package/dist/esm/math/AbstractVector.js +106 -0
  121. package/dist/esm/math/AbstractVector.js.map +1 -0
  122. package/dist/esm/math/Circle.d.ts +41 -0
  123. package/dist/esm/math/Circle.js +137 -0
  124. package/dist/esm/math/Circle.js.map +1 -0
  125. package/dist/esm/math/CircleLike.d.ts +5 -0
  126. package/dist/esm/math/Collision.d.ts +28 -0
  127. package/dist/esm/math/Collision.js +13 -0
  128. package/dist/esm/math/Collision.js.map +1 -0
  129. package/dist/esm/math/Ellipse.d.ts +37 -0
  130. package/dist/esm/math/Ellipse.js +112 -0
  131. package/dist/esm/math/Ellipse.js.map +1 -0
  132. package/dist/esm/math/EllipseLike.d.ts +6 -0
  133. package/dist/esm/math/Flags.d.ts +12 -0
  134. package/dist/esm/math/Flags.js +41 -0
  135. package/dist/esm/math/Flags.js.map +1 -0
  136. package/dist/esm/math/Interval.d.ts +16 -0
  137. package/dist/esm/math/Interval.js +45 -0
  138. package/dist/esm/math/Interval.js.map +1 -0
  139. package/dist/esm/math/Line.d.ts +36 -0
  140. package/dist/esm/math/Line.js +114 -0
  141. package/dist/esm/math/Line.js.map +1 -0
  142. package/dist/esm/math/LineLike.d.ts +6 -0
  143. package/dist/esm/math/Matrix.d.ts +32 -0
  144. package/dist/esm/math/Matrix.js +134 -0
  145. package/dist/esm/math/Matrix.js.map +1 -0
  146. package/dist/esm/math/ObservableSize.d.ts +16 -0
  147. package/dist/esm/math/ObservableSize.js +56 -0
  148. package/dist/esm/math/ObservableSize.js.map +1 -0
  149. package/dist/esm/math/ObservableVector.d.ts +21 -0
  150. package/dist/esm/math/ObservableVector.js +74 -0
  151. package/dist/esm/math/ObservableVector.js.map +1 -0
  152. package/dist/esm/math/PointLike.d.ts +4 -0
  153. package/dist/esm/math/PolarVector.d.ts +8 -0
  154. package/dist/esm/math/PolarVector.js +19 -0
  155. package/dist/esm/math/PolarVector.js.map +1 -0
  156. package/dist/esm/math/Polygon.d.ts +38 -0
  157. package/dist/esm/math/Polygon.js +163 -0
  158. package/dist/esm/math/Polygon.js.map +1 -0
  159. package/dist/esm/math/PolygonLike.d.ts +6 -0
  160. package/dist/esm/math/Random.d.ts +15 -0
  161. package/dist/esm/math/Random.js +72 -0
  162. package/dist/esm/math/Random.js.map +1 -0
  163. package/dist/esm/math/Rectangle.d.ts +48 -0
  164. package/dist/esm/math/Rectangle.js +208 -0
  165. package/dist/esm/math/Rectangle.js.map +1 -0
  166. package/dist/esm/math/RectangleLike.d.ts +6 -0
  167. package/dist/esm/math/Segment.d.ts +25 -0
  168. package/dist/esm/math/Segment.js +79 -0
  169. package/dist/esm/math/Segment.js.map +1 -0
  170. package/dist/esm/math/ShapeLike.d.ts +4 -0
  171. package/dist/esm/math/Size.d.ts +24 -0
  172. package/dist/esm/math/Size.js +71 -0
  173. package/dist/esm/math/Size.js.map +1 -0
  174. package/dist/esm/math/Transformable.d.ts +47 -0
  175. package/dist/esm/math/Transformable.js +140 -0
  176. package/dist/esm/math/Transformable.js.map +1 -0
  177. package/dist/esm/math/Vector.d.ts +28 -0
  178. package/dist/esm/math/Vector.js +80 -0
  179. package/dist/esm/math/Vector.js.map +1 -0
  180. package/dist/esm/math/collision-detection.d.ts +41 -0
  181. package/dist/esm/math/collision-detection.js +394 -0
  182. package/dist/esm/math/collision-detection.js.map +1 -0
  183. package/dist/esm/math/collision-primitives.d.ts +39 -0
  184. package/dist/esm/math/collision-primitives.js +164 -0
  185. package/dist/esm/math/collision-primitives.js.map +1 -0
  186. package/dist/esm/math/geometry.d.ts +8 -0
  187. package/dist/esm/math/geometry.js +195 -0
  188. package/dist/esm/math/geometry.js.map +1 -0
  189. package/dist/esm/math/index.d.ts +27 -0
  190. package/dist/esm/math/utils.d.ts +21 -0
  191. package/dist/esm/math/utils.js +60 -0
  192. package/dist/esm/math/utils.js.map +1 -0
  193. package/dist/esm/particles/Particle.d.ts +40 -0
  194. package/dist/esm/particles/Particle.js +106 -0
  195. package/dist/esm/particles/Particle.js.map +1 -0
  196. package/dist/esm/particles/ParticleProperties.d.ts +14 -0
  197. package/dist/esm/particles/ParticleSystem.d.ts +43 -0
  198. package/dist/esm/particles/ParticleSystem.js +186 -0
  199. package/dist/esm/particles/ParticleSystem.js.map +1 -0
  200. package/dist/esm/particles/affectors/ColorAffector.d.ts +17 -0
  201. package/dist/esm/particles/affectors/ColorAffector.js +42 -0
  202. package/dist/esm/particles/affectors/ColorAffector.js.map +1 -0
  203. package/dist/esm/particles/affectors/ForceAffector.d.ts +13 -0
  204. package/dist/esm/particles/affectors/ForceAffector.js +28 -0
  205. package/dist/esm/particles/affectors/ForceAffector.js.map +1 -0
  206. package/dist/esm/particles/affectors/ParticleAffector.d.ts +6 -0
  207. package/dist/esm/particles/affectors/ScaleAffector.d.ts +13 -0
  208. package/dist/esm/particles/affectors/ScaleAffector.js +28 -0
  209. package/dist/esm/particles/affectors/ScaleAffector.js.map +1 -0
  210. package/dist/esm/particles/affectors/TorqueAffector.d.ts +12 -0
  211. package/dist/esm/particles/affectors/TorqueAffector.js +26 -0
  212. package/dist/esm/particles/affectors/TorqueAffector.js.map +1 -0
  213. package/dist/esm/particles/emitters/ParticleEmitter.d.ts +6 -0
  214. package/dist/esm/particles/emitters/ParticleOptions.d.ts +46 -0
  215. package/dist/esm/particles/emitters/ParticleOptions.js +104 -0
  216. package/dist/esm/particles/emitters/ParticleOptions.js.map +1 -0
  217. package/dist/esm/particles/emitters/UniversalEmitter.d.ts +17 -0
  218. package/dist/esm/particles/emitters/UniversalEmitter.js +45 -0
  219. package/dist/esm/particles/emitters/UniversalEmitter.js.map +1 -0
  220. package/dist/esm/particles/index.d.ts +11 -0
  221. package/dist/esm/physics/RapierPhysicsWorld.d.ts +136 -0
  222. package/dist/esm/physics/RapierPhysicsWorld.js +475 -0
  223. package/dist/esm/physics/RapierPhysicsWorld.js.map +1 -0
  224. package/dist/esm/physics/index.d.ts +1 -0
  225. package/dist/esm/rendering/CallbackRenderPass.d.ts +7 -0
  226. package/dist/esm/rendering/CallbackRenderPass.js +12 -0
  227. package/dist/esm/rendering/CallbackRenderPass.js.map +1 -0
  228. package/dist/esm/rendering/Container.d.ts +36 -0
  229. package/dist/esm/rendering/Container.js +197 -0
  230. package/dist/esm/rendering/Container.js.map +1 -0
  231. package/dist/esm/rendering/Drawable.d.ts +16 -0
  232. package/dist/esm/rendering/Drawable.js +54 -0
  233. package/dist/esm/rendering/Drawable.js.map +1 -0
  234. package/dist/esm/rendering/RenderBackendType.d.ts +4 -0
  235. package/dist/esm/rendering/RenderBackendType.js +8 -0
  236. package/dist/esm/rendering/RenderBackendType.js.map +1 -0
  237. package/dist/esm/rendering/RenderNode.d.ts +51 -0
  238. package/dist/esm/rendering/RenderNode.js +235 -0
  239. package/dist/esm/rendering/RenderNode.js.map +1 -0
  240. package/dist/esm/rendering/RenderPass.d.ts +4 -0
  241. package/dist/esm/rendering/RenderStats.d.ts +12 -0
  242. package/dist/esm/rendering/RenderStats.js +24 -0
  243. package/dist/esm/rendering/RenderStats.js.map +1 -0
  244. package/dist/esm/rendering/RenderTarget.d.ts +34 -0
  245. package/dist/esm/rendering/RenderTarget.js +109 -0
  246. package/dist/esm/rendering/RenderTarget.js.map +1 -0
  247. package/dist/esm/rendering/RenderTargetPass.d.ts +18 -0
  248. package/dist/esm/rendering/RenderTargetPass.js +31 -0
  249. package/dist/esm/rendering/RenderTargetPass.js.map +1 -0
  250. package/dist/esm/rendering/Renderer.d.ts +15 -0
  251. package/dist/esm/rendering/RendererRegistry.d.ts +43 -0
  252. package/dist/esm/rendering/RendererRegistry.js +86 -0
  253. package/dist/esm/rendering/RendererRegistry.js.map +1 -0
  254. package/dist/esm/rendering/SceneRenderRuntime.d.ts +29 -0
  255. package/dist/esm/rendering/View.d.ts +102 -0
  256. package/dist/esm/rendering/View.js +364 -0
  257. package/dist/esm/rendering/View.js.map +1 -0
  258. package/dist/esm/rendering/filters/BlurFilter.d.ts +20 -0
  259. package/dist/esm/rendering/filters/BlurFilter.js +68 -0
  260. package/dist/esm/rendering/filters/BlurFilter.js.map +1 -0
  261. package/dist/esm/rendering/filters/ColorFilter.d.ts +12 -0
  262. package/dist/esm/rendering/filters/ColorFilter.js +42 -0
  263. package/dist/esm/rendering/filters/ColorFilter.js.map +1 -0
  264. package/dist/esm/rendering/filters/Filter.d.ts +5 -0
  265. package/dist/esm/rendering/filters/Filter.js +5 -0
  266. package/dist/esm/rendering/filters/Filter.js.map +1 -0
  267. package/dist/esm/rendering/index.d.ts +52 -0
  268. package/dist/esm/rendering/primitives/CircleGeometry.d.ts +4 -0
  269. package/dist/esm/rendering/primitives/CircleGeometry.js +21 -0
  270. package/dist/esm/rendering/primitives/CircleGeometry.js.map +1 -0
  271. package/dist/esm/rendering/primitives/DrawableShape.d.ts +11 -0
  272. package/dist/esm/rendering/primitives/DrawableShape.js +21 -0
  273. package/dist/esm/rendering/primitives/DrawableShape.js.map +1 -0
  274. package/dist/esm/rendering/primitives/Geometry.d.ts +13 -0
  275. package/dist/esm/rendering/primitives/Geometry.js +16 -0
  276. package/dist/esm/rendering/primitives/Geometry.js.map +1 -0
  277. package/dist/esm/rendering/primitives/Graphics.d.ts +36 -0
  278. package/dist/esm/rendering/primitives/Graphics.js +208 -0
  279. package/dist/esm/rendering/primitives/Graphics.js.map +1 -0
  280. package/dist/esm/rendering/shader/Shader.d.ts +27 -0
  281. package/dist/esm/rendering/shader/Shader.js +63 -0
  282. package/dist/esm/rendering/shader/Shader.js.map +1 -0
  283. package/dist/esm/rendering/shader/ShaderAttribute.d.ts +9 -0
  284. package/dist/esm/rendering/shader/ShaderAttribute.js +21 -0
  285. package/dist/esm/rendering/shader/ShaderAttribute.js.map +1 -0
  286. package/dist/esm/rendering/shader/ShaderUniform.d.ts +16 -0
  287. package/dist/esm/rendering/shader/ShaderUniform.js +38 -0
  288. package/dist/esm/rendering/shader/ShaderUniform.js.map +1 -0
  289. package/dist/esm/rendering/sprite/AnimatedSprite.d.ts +43 -0
  290. package/dist/esm/rendering/sprite/AnimatedSprite.js +177 -0
  291. package/dist/esm/rendering/sprite/AnimatedSprite.js.map +1 -0
  292. package/dist/esm/rendering/sprite/Sprite.d.ts +43 -0
  293. package/dist/esm/rendering/sprite/Sprite.js +169 -0
  294. package/dist/esm/rendering/sprite/Sprite.js.map +1 -0
  295. package/dist/esm/rendering/sprite/Spritesheet.d.ts +34 -0
  296. package/dist/esm/rendering/sprite/Spritesheet.js +88 -0
  297. package/dist/esm/rendering/sprite/Spritesheet.js.map +1 -0
  298. package/dist/esm/rendering/text/Text.d.ts +26 -0
  299. package/dist/esm/rendering/text/Text.js +130 -0
  300. package/dist/esm/rendering/text/Text.js.map +1 -0
  301. package/dist/esm/rendering/text/TextStyle.d.ts +65 -0
  302. package/dist/esm/rendering/text/TextStyle.js +192 -0
  303. package/dist/esm/rendering/text/TextStyle.js.map +1 -0
  304. package/dist/esm/rendering/texture/RenderTexture.d.ts +36 -0
  305. package/dist/esm/rendering/texture/RenderTexture.js +123 -0
  306. package/dist/esm/rendering/texture/RenderTexture.js.map +1 -0
  307. package/dist/esm/rendering/texture/Sampler.d.ts +29 -0
  308. package/dist/esm/rendering/texture/Sampler.js +76 -0
  309. package/dist/esm/rendering/texture/Sampler.js.map +1 -0
  310. package/dist/esm/rendering/texture/Texture.d.ts +52 -0
  311. package/dist/esm/rendering/texture/Texture.js +173 -0
  312. package/dist/esm/rendering/texture/Texture.js.map +1 -0
  313. package/dist/esm/rendering/types.d.ts +68 -0
  314. package/dist/esm/rendering/types.js +79 -0
  315. package/dist/esm/rendering/types.js.map +1 -0
  316. package/dist/esm/rendering/utils.d.ts +9 -0
  317. package/dist/esm/rendering/utils.js +39 -0
  318. package/dist/esm/rendering/utils.js.map +1 -0
  319. package/dist/esm/rendering/video/Video.d.ts +62 -0
  320. package/dist/esm/rendering/video/Video.js +293 -0
  321. package/dist/esm/rendering/video/Video.js.map +1 -0
  322. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.d.ts +49 -0
  323. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js +175 -0
  324. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js.map +1 -0
  325. package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.d.ts +44 -0
  326. package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.js +57 -0
  327. package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.js.map +1 -0
  328. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.d.ts +11 -0
  329. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js +110 -0
  330. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js.map +1 -0
  331. package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.d.ts +26 -0
  332. package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.js +217 -0
  333. package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.js.map +1 -0
  334. package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.d.ts +26 -0
  335. package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.js +54 -0
  336. package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.js.map +1 -0
  337. package/dist/esm/rendering/webgl2/WebGl2RenderManager.d.ts +99 -0
  338. package/dist/esm/rendering/webgl2/WebGl2RenderManager.js +600 -0
  339. package/dist/esm/rendering/webgl2/WebGl2RenderManager.js.map +1 -0
  340. package/dist/esm/rendering/webgl2/WebGl2RendererRuntime.d.ts +15 -0
  341. package/dist/esm/rendering/webgl2/WebGl2ShaderBlock.d.ts +17 -0
  342. package/dist/esm/rendering/webgl2/WebGl2ShaderBlock.js +63 -0
  343. package/dist/esm/rendering/webgl2/WebGl2ShaderBlock.js.map +1 -0
  344. package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.d.ts +3 -0
  345. package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js +59 -0
  346. package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js.map +1 -0
  347. package/dist/esm/rendering/webgl2/WebGl2ShaderRuntime.d.ts +2 -0
  348. package/dist/esm/rendering/webgl2/WebGl2ShaderRuntime.js +161 -0
  349. package/dist/esm/rendering/webgl2/WebGl2ShaderRuntime.js.map +1 -0
  350. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +11 -0
  351. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +82 -0
  352. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -0
  353. package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.d.ts +40 -0
  354. package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.js +69 -0
  355. package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.js.map +1 -0
  356. package/dist/esm/rendering/webgl2/glsl/particle.frag.js +4 -0
  357. package/dist/esm/rendering/webgl2/glsl/particle.frag.js.map +1 -0
  358. package/dist/esm/rendering/webgl2/glsl/particle.vert.js +4 -0
  359. package/dist/esm/rendering/webgl2/glsl/particle.vert.js.map +1 -0
  360. package/dist/esm/rendering/webgl2/glsl/primitive.frag.js +4 -0
  361. package/dist/esm/rendering/webgl2/glsl/primitive.frag.js.map +1 -0
  362. package/dist/esm/rendering/webgl2/glsl/primitive.vert.js +4 -0
  363. package/dist/esm/rendering/webgl2/glsl/primitive.vert.js.map +1 -0
  364. package/dist/esm/rendering/webgl2/glsl/sprite.frag.js +4 -0
  365. package/dist/esm/rendering/webgl2/glsl/sprite.frag.js.map +1 -0
  366. package/dist/esm/rendering/webgl2/glsl/sprite.vert.js +4 -0
  367. package/dist/esm/rendering/webgl2/glsl/sprite.vert.js.map +1 -0
  368. package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.d.ts +28 -0
  369. package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.js +50 -0
  370. package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.js.map +1 -0
  371. package/dist/esm/rendering/webgpu/WebGpuBlendState.d.ts +6 -0
  372. package/dist/esm/rendering/webgpu/WebGpuBlendState.js +79 -0
  373. package/dist/esm/rendering/webgpu/WebGpuBlendState.js.map +1 -0
  374. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.d.ts +33 -0
  375. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +443 -0
  376. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js.map +1 -0
  377. package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.d.ts +39 -0
  378. package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.js +489 -0
  379. package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.js.map +1 -0
  380. package/dist/esm/rendering/webgpu/WebGpuRenderManager.d.ts +111 -0
  381. package/dist/esm/rendering/webgpu/WebGpuRenderManager.js +777 -0
  382. package/dist/esm/rendering/webgpu/WebGpuRenderManager.js.map +1 -0
  383. package/dist/esm/rendering/webgpu/WebGpuRendererRuntime.d.ts +8 -0
  384. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +33 -0
  385. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +528 -0
  386. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -0
  387. package/dist/esm/resources/AbstractAssetFactory.d.ts +10 -0
  388. package/dist/esm/resources/AbstractAssetFactory.js +24 -0
  389. package/dist/esm/resources/AbstractAssetFactory.js.map +1 -0
  390. package/dist/esm/resources/AssetFactory.d.ts +6 -0
  391. package/dist/esm/resources/AssetManifest.d.ts +28 -0
  392. package/dist/esm/resources/AssetManifest.js +66 -0
  393. package/dist/esm/resources/AssetManifest.js.map +1 -0
  394. package/dist/esm/resources/CacheFirstStrategy.d.ts +5 -0
  395. package/dist/esm/resources/CacheFirstStrategy.js +34 -0
  396. package/dist/esm/resources/CacheFirstStrategy.js.map +1 -0
  397. package/dist/esm/resources/CacheStore.d.ts +7 -0
  398. package/dist/esm/resources/CacheStrategy.d.ts +12 -0
  399. package/dist/esm/resources/Database.d.ts +13 -0
  400. package/dist/esm/resources/FactoryRegistry.d.ts +9 -0
  401. package/dist/esm/resources/FactoryRegistry.js +42 -0
  402. package/dist/esm/resources/FactoryRegistry.js.map +1 -0
  403. package/dist/esm/resources/IndexedDbDatabase.d.ts +21 -0
  404. package/dist/esm/resources/IndexedDbDatabase.js +143 -0
  405. package/dist/esm/resources/IndexedDbDatabase.js.map +1 -0
  406. package/dist/esm/resources/IndexedDbStore.d.ts +16 -0
  407. package/dist/esm/resources/IndexedDbStore.js +32 -0
  408. package/dist/esm/resources/IndexedDbStore.js.map +1 -0
  409. package/dist/esm/resources/Loader.d.ts +88 -0
  410. package/dist/esm/resources/Loader.js +601 -0
  411. package/dist/esm/resources/Loader.js.map +1 -0
  412. package/dist/esm/resources/NetworkOnlyStrategy.d.ts +5 -0
  413. package/dist/esm/resources/NetworkOnlyStrategy.js +12 -0
  414. package/dist/esm/resources/NetworkOnlyStrategy.js.map +1 -0
  415. package/dist/esm/resources/factories/BinaryFactory.d.ts +6 -0
  416. package/dist/esm/resources/factories/BinaryFactory.js +14 -0
  417. package/dist/esm/resources/factories/BinaryFactory.js.map +1 -0
  418. package/dist/esm/resources/factories/FontFactory.d.ts +13 -0
  419. package/dist/esm/resources/factories/FontFactory.js +36 -0
  420. package/dist/esm/resources/factories/FontFactory.js.map +1 -0
  421. package/dist/esm/resources/factories/ImageFactory.d.ts +10 -0
  422. package/dist/esm/resources/factories/ImageFactory.js +35 -0
  423. package/dist/esm/resources/factories/ImageFactory.js.map +1 -0
  424. package/dist/esm/resources/factories/JsonFactory.d.ts +6 -0
  425. package/dist/esm/resources/factories/JsonFactory.js +14 -0
  426. package/dist/esm/resources/factories/JsonFactory.js.map +1 -0
  427. package/dist/esm/resources/factories/MusicFactory.d.ts +16 -0
  428. package/dist/esm/resources/factories/MusicFactory.js +37 -0
  429. package/dist/esm/resources/factories/MusicFactory.js.map +1 -0
  430. package/dist/esm/resources/factories/SoundFactory.d.ts +14 -0
  431. package/dist/esm/resources/factories/SoundFactory.js +22 -0
  432. package/dist/esm/resources/factories/SoundFactory.js.map +1 -0
  433. package/dist/esm/resources/factories/SvgFactory.d.ts +6 -0
  434. package/dist/esm/resources/factories/SvgFactory.js +34 -0
  435. package/dist/esm/resources/factories/SvgFactory.js.map +1 -0
  436. package/dist/esm/resources/factories/TextFactory.d.ts +6 -0
  437. package/dist/esm/resources/factories/TextFactory.js +14 -0
  438. package/dist/esm/resources/factories/TextFactory.js.map +1 -0
  439. package/dist/esm/resources/factories/TextureFactory.d.ts +13 -0
  440. package/dist/esm/resources/factories/TextureFactory.js +37 -0
  441. package/dist/esm/resources/factories/TextureFactory.js.map +1 -0
  442. package/dist/esm/resources/factories/VideoFactory.d.ts +18 -0
  443. package/dist/esm/resources/factories/VideoFactory.js +40 -0
  444. package/dist/esm/resources/factories/VideoFactory.js.map +1 -0
  445. package/dist/esm/resources/factories/VttFactory.d.ts +6 -0
  446. package/dist/esm/resources/factories/VttFactory.js +57 -0
  447. package/dist/esm/resources/factories/VttFactory.js.map +1 -0
  448. package/dist/esm/resources/factories/WasmFactory.d.ts +6 -0
  449. package/dist/esm/resources/factories/WasmFactory.js +14 -0
  450. package/dist/esm/resources/factories/WasmFactory.js.map +1 -0
  451. package/dist/esm/resources/index.d.ts +26 -0
  452. package/dist/esm/resources/tokens.d.ts +30 -0
  453. package/dist/esm/resources/tokens.js +33 -0
  454. package/dist/esm/resources/tokens.js.map +1 -0
  455. package/dist/esm/resources/utils.d.ts +1 -0
  456. package/dist/esm/resources/utils.js +129 -0
  457. package/dist/esm/resources/utils.js.map +1 -0
  458. package/dist/esm/vendor/webgl-debug.js +1160 -0
  459. package/dist/esm/vendor/webgl-debug.js.map +1 -0
  460. package/dist/exo.esm.js +17111 -0
  461. package/dist/exo.esm.js.map +1 -0
  462. package/dist/exo.esm.min.js +2 -0
  463. package/dist/exo.esm.min.js.map +1 -0
  464. package/dist/exo.global.js +17328 -0
  465. package/dist/exo.global.js.map +1 -0
  466. package/dist/exo.global.min.js +2 -0
  467. package/dist/exo.global.min.js.map +1 -0
  468. package/package.json +96 -0
@@ -0,0 +1,777 @@
1
+ import { Color } from '../../core/Color.js';
2
+ import { BlendModes, WrapModes, ScaleModes } from '../types.js';
3
+ import { RenderBackendType } from '../RenderBackendType.js';
4
+ import { RendererRegistry } from '../RendererRegistry.js';
5
+ import { createRenderStats, resetRenderStats } from '../RenderStats.js';
6
+ import { RenderTarget } from '../RenderTarget.js';
7
+ import { WebGpuPrimitiveRenderer } from './WebGpuPrimitiveRenderer.js';
8
+ import { WebGpuSpriteRenderer } from './WebGpuSpriteRenderer.js';
9
+ import { WebGpuParticleRenderer } from './WebGpuParticleRenderer.js';
10
+ import { RenderTexture } from '../texture/RenderTexture.js';
11
+ import { Sprite } from '../sprite/Sprite.js';
12
+ import { DrawableShape } from '../primitives/DrawableShape.js';
13
+ import { ParticleSystem } from '../../particles/ParticleSystem.js';
14
+ import { Vector } from '../../math/Vector.js';
15
+
16
+ /// <reference types="@webgpu/types" />
17
+ const managedTextureFormat = 'rgba8unorm';
18
+ class WebGpuRenderManager {
19
+ backendType = RenderBackendType.WebGpu;
20
+ rendererRegistry = new RendererRegistry();
21
+ _canvas;
22
+ _rootRenderTarget;
23
+ _clearColor = new Color();
24
+ _textureStates = new Map();
25
+ _textureDestroyHandlers = new Map();
26
+ _renderTargetDestroyHandlers = new Map();
27
+ _temporaryRenderTextures = [];
28
+ _maskStack = [];
29
+ _maskPixelStack = [];
30
+ _maskPointA = new Vector();
31
+ _maskPointB = new Vector();
32
+ _mipmapShaderModule = null;
33
+ _mipmapBindGroupLayout = null;
34
+ _mipmapPipelineLayout = null;
35
+ _mipmapPipeline = null;
36
+ _mipmapSampler = null;
37
+ _context = null;
38
+ _device = null;
39
+ _format = null;
40
+ _initializePromise = null;
41
+ _renderTarget;
42
+ _renderer = null;
43
+ _blendMode = null;
44
+ _texture = null;
45
+ _clearRequested = false;
46
+ _hasPresentedFrame = false;
47
+ _stats = createRenderStats();
48
+ constructor(app) {
49
+ const { width, height, clearColor, } = app.options;
50
+ this._canvas = app.canvas;
51
+ this._rootRenderTarget = new RenderTarget(width, height, true);
52
+ this._renderTarget = this._rootRenderTarget;
53
+ if (clearColor) {
54
+ this._clearColor.copy(clearColor);
55
+ }
56
+ this.rendererRegistry.registerRenderer(DrawableShape, new WebGpuPrimitiveRenderer());
57
+ this.rendererRegistry.registerRenderer(Sprite, new WebGpuSpriteRenderer());
58
+ this.rendererRegistry.registerRenderer(ParticleSystem, new WebGpuParticleRenderer());
59
+ this.resize(width, height);
60
+ }
61
+ get view() {
62
+ return this._renderTarget.view;
63
+ }
64
+ get renderTarget() {
65
+ return this._renderTarget;
66
+ }
67
+ get device() {
68
+ if (this._device === null) {
69
+ throw new Error('WebGPU device is not initialized yet.');
70
+ }
71
+ return this._device;
72
+ }
73
+ get context() {
74
+ if (this._context === null) {
75
+ throw new Error('WebGPU canvas context is not initialized yet.');
76
+ }
77
+ return this._context;
78
+ }
79
+ get format() {
80
+ if (this._format === null) {
81
+ throw new Error('WebGPU canvas format is not initialized yet.');
82
+ }
83
+ return this._format;
84
+ }
85
+ get renderTargetFormat() {
86
+ return this._renderTarget === this._rootRenderTarget ? this.format : managedTextureFormat;
87
+ }
88
+ get clearRequested() {
89
+ return this._clearRequested;
90
+ }
91
+ get stats() {
92
+ return this._stats;
93
+ }
94
+ initialize() {
95
+ if (!this._initializePromise) {
96
+ this._initializePromise = this._initialize().catch((error) => {
97
+ this._initializePromise = null;
98
+ throw error;
99
+ });
100
+ }
101
+ return this._initializePromise;
102
+ }
103
+ resetStats() {
104
+ resetRenderStats(this._stats);
105
+ return this;
106
+ }
107
+ draw(drawable) {
108
+ const renderer = this.rendererRegistry.resolve(drawable);
109
+ this._setActiveRenderer(renderer);
110
+ renderer.render(drawable);
111
+ this._stats.submittedNodes++;
112
+ return this;
113
+ }
114
+ execute(pass) {
115
+ this._flushActiveRenderer();
116
+ this._stats.renderPasses++;
117
+ pass.execute(this);
118
+ return this;
119
+ }
120
+ setShader(shader) {
121
+ if (shader !== null) {
122
+ throw new Error('WebGPU shaders are not implemented yet.');
123
+ }
124
+ return this;
125
+ }
126
+ setTexture(texture, _unit) {
127
+ if (texture === null) {
128
+ this._texture = null;
129
+ return this;
130
+ }
131
+ if (texture instanceof RenderTarget && !(texture instanceof RenderTexture)) {
132
+ throw new Error('WebGPU render textures are not implemented yet.');
133
+ }
134
+ this._syncTexture(texture);
135
+ this._texture = texture;
136
+ return this;
137
+ }
138
+ setBlendMode(blendMode) {
139
+ if (blendMode === null) {
140
+ this._blendMode = null;
141
+ return this;
142
+ }
143
+ if (blendMode !== BlendModes.Normal
144
+ && blendMode !== BlendModes.Additive
145
+ && blendMode !== BlendModes.Subtract
146
+ && blendMode !== BlendModes.Multiply
147
+ && blendMode !== BlendModes.Screen) {
148
+ throw new Error(`WebGPU blend mode "${blendMode}" is not implemented yet.`);
149
+ }
150
+ this._blendMode = blendMode;
151
+ return this;
152
+ }
153
+ setVao(vao) {
154
+ if (vao !== null) {
155
+ throw new Error('WebGPU vertex array objects are not implemented yet.');
156
+ }
157
+ return this;
158
+ }
159
+ setRenderTarget(target) {
160
+ const nextRenderTarget = target ?? this._rootRenderTarget;
161
+ if (!nextRenderTarget.root && !(nextRenderTarget instanceof RenderTexture)) {
162
+ throw new Error('WebGPU currently supports only root targets and RenderTexture targets.');
163
+ }
164
+ if (this._renderTarget !== nextRenderTarget) {
165
+ this._flushActiveRenderer();
166
+ if (this._renderTarget !== this._rootRenderTarget) {
167
+ this._unsubscribeRenderTarget(this._renderTarget);
168
+ }
169
+ this._renderTarget = nextRenderTarget;
170
+ this._stats.renderTargetChanges++;
171
+ if (nextRenderTarget !== this._rootRenderTarget) {
172
+ this._subscribeRenderTarget(nextRenderTarget);
173
+ }
174
+ }
175
+ return this;
176
+ }
177
+ pushMask(maskBounds) {
178
+ this._flushActiveRenderer();
179
+ this._maskStack.push(maskBounds.clone());
180
+ const nextMask = this._toMaskPixels(maskBounds);
181
+ const previousMask = this._maskPixelStack.length > 0
182
+ ? this._maskPixelStack[this._maskPixelStack.length - 1]
183
+ : null;
184
+ const resolvedMask = previousMask ? this._intersectMasks(previousMask, nextMask) : nextMask;
185
+ this._maskPixelStack.push(resolvedMask);
186
+ return this;
187
+ }
188
+ popMask() {
189
+ if (this._maskStack.length === 0) {
190
+ return this;
191
+ }
192
+ this._flushActiveRenderer();
193
+ const removedMask = this._maskStack.pop();
194
+ if (removedMask) {
195
+ removedMask.destroy();
196
+ }
197
+ this._maskPixelStack.pop();
198
+ return this;
199
+ }
200
+ getScissorRect() {
201
+ if (this._maskPixelStack.length === 0) {
202
+ return null;
203
+ }
204
+ const mask = this._maskPixelStack[this._maskPixelStack.length - 1];
205
+ return {
206
+ x: mask.x,
207
+ y: mask.y,
208
+ width: mask.width,
209
+ height: mask.height,
210
+ };
211
+ }
212
+ acquireRenderTexture(width, height) {
213
+ for (let index = 0; index < this._temporaryRenderTextures.length; index++) {
214
+ const texture = this._temporaryRenderTextures[index];
215
+ if (texture.width === width && texture.height === height) {
216
+ this._temporaryRenderTextures.splice(index, 1);
217
+ return texture;
218
+ }
219
+ }
220
+ return new RenderTexture(width, height);
221
+ }
222
+ releaseRenderTexture(texture) {
223
+ if (this._temporaryRenderTextures.includes(texture)) {
224
+ return this;
225
+ }
226
+ texture.setView(null);
227
+ this._temporaryRenderTextures.push(texture);
228
+ return this;
229
+ }
230
+ setView(view) {
231
+ this._flushActiveRenderer();
232
+ this._renderTarget.setView(view);
233
+ return this;
234
+ }
235
+ clear(color) {
236
+ if (color) {
237
+ this._clearColor.copy(color);
238
+ }
239
+ this._clearRequested = true;
240
+ return this;
241
+ }
242
+ resize(width, height) {
243
+ this._canvas.width = width;
244
+ this._canvas.height = height;
245
+ this._rootRenderTarget.resize(width, height);
246
+ this._hasPresentedFrame = false;
247
+ return this;
248
+ }
249
+ flush() {
250
+ if (!this._device || !this._context) {
251
+ return this;
252
+ }
253
+ if (this._renderer) {
254
+ this._flushActiveRenderer();
255
+ }
256
+ else if (this._clearRequested) {
257
+ const encoder = this._device.createCommandEncoder();
258
+ const pass = encoder.beginRenderPass({
259
+ colorAttachments: [this.createColorAttachment()],
260
+ });
261
+ pass.end();
262
+ this._stats.renderPasses++;
263
+ this.submit(encoder.finish());
264
+ }
265
+ return this;
266
+ }
267
+ destroy() {
268
+ this._setActiveRenderer(null);
269
+ this.rendererRegistry.destroy();
270
+ this._destroyManagedTextures();
271
+ this._destroyTemporaryRenderTextures();
272
+ for (const mask of this._maskStack) {
273
+ mask.destroy();
274
+ }
275
+ this._maskStack.length = 0;
276
+ this._maskPixelStack.length = 0;
277
+ this._maskPointA.destroy();
278
+ this._maskPointB.destroy();
279
+ for (const target of Array.from(this._renderTargetDestroyHandlers.keys())) {
280
+ this._unsubscribeRenderTarget(target);
281
+ }
282
+ this._context?.unconfigure();
283
+ this._context = null;
284
+ this._device = null;
285
+ this._format = null;
286
+ this._initializePromise = null;
287
+ this._clearRequested = false;
288
+ this._hasPresentedFrame = false;
289
+ this._texture = null;
290
+ this._mipmapShaderModule = null;
291
+ this._mipmapBindGroupLayout = null;
292
+ this._mipmapPipelineLayout = null;
293
+ this._mipmapPipeline = null;
294
+ this._mipmapSampler = null;
295
+ this._renderTarget = this._rootRenderTarget;
296
+ this._clearColor.destroy();
297
+ this._rootRenderTarget.destroy();
298
+ }
299
+ createColorAttachment() {
300
+ const renderTarget = this._renderTarget;
301
+ let attachmentState = null;
302
+ if (renderTarget === this._rootRenderTarget) {
303
+ attachmentState = {
304
+ view: this.context.getCurrentTexture().createView(),
305
+ shouldClear: this._clearRequested || !this._hasPresentedFrame,
306
+ };
307
+ }
308
+ else if (renderTarget instanceof RenderTexture) {
309
+ const state = this._syncTexture(renderTarget);
310
+ attachmentState = {
311
+ view: state.view,
312
+ shouldClear: this._clearRequested || !state.hasContent,
313
+ };
314
+ }
315
+ else {
316
+ throw new Error('WebGPU currently supports only root targets and RenderTexture targets.');
317
+ }
318
+ this._clearRequested = false;
319
+ return {
320
+ view: attachmentState.view,
321
+ clearValue: {
322
+ r: this._clearColor.r / 255,
323
+ g: this._clearColor.g / 255,
324
+ b: this._clearColor.b / 255,
325
+ a: this._clearColor.a,
326
+ },
327
+ loadOp: attachmentState.shouldClear ? 'clear' : 'load',
328
+ storeOp: 'store',
329
+ };
330
+ }
331
+ submit(commandBuffer) {
332
+ this.device.queue.submit([commandBuffer]);
333
+ if (this._renderTarget === this._rootRenderTarget) {
334
+ this._hasPresentedFrame = true;
335
+ }
336
+ else if (this._renderTarget instanceof RenderTexture) {
337
+ const state = this._syncTexture(this._renderTarget);
338
+ state.hasContent = true;
339
+ if (state.mipLevelCount > 1) {
340
+ this._generateMipmaps(state.texture, state.mipLevelCount);
341
+ }
342
+ }
343
+ }
344
+ getTextureBinding(texture) {
345
+ const state = this._syncTexture(texture);
346
+ return {
347
+ view: state.view,
348
+ sampler: state.sampler,
349
+ };
350
+ }
351
+ shouldPremultiplyTextureSample(texture) {
352
+ return !(texture instanceof RenderTexture) && texture.premultiplyAlpha;
353
+ }
354
+ _setActiveRenderer(renderer) {
355
+ if (this._renderer !== renderer) {
356
+ this._flushActiveRenderer();
357
+ this._renderer = renderer;
358
+ }
359
+ }
360
+ _flushActiveRenderer() {
361
+ this._renderer?.flush();
362
+ }
363
+ async _initialize() {
364
+ const gpuNavigator = this._getGpuNavigator();
365
+ if (gpuNavigator === null) {
366
+ throw new Error('This browser does not support WebGPU.');
367
+ }
368
+ if (typeof gpuNavigator.gpu.requestAdapter !== 'function') {
369
+ throw new Error('WebGPU is available, but navigator.gpu.requestAdapter is not implemented.');
370
+ }
371
+ if (typeof gpuNavigator.gpu.getPreferredCanvasFormat !== 'function') {
372
+ throw new Error('WebGPU is available, but navigator.gpu.getPreferredCanvasFormat is not implemented.');
373
+ }
374
+ // Request the adapter before acquiring a WebGPU canvas context.
375
+ // getContext('webgpu') is exclusive per canvas — once it succeeds, the
376
+ // same canvas can no longer produce a WebGL2 context. Doing it the
377
+ // other way round means an unavailable adapter still locks the canvas
378
+ // and breaks the automatic WebGL2 fallback in Application.
379
+ let adapter = null;
380
+ try {
381
+ adapter = await gpuNavigator.gpu.requestAdapter();
382
+ }
383
+ catch (error) {
384
+ throw this._createInitializationError('Failed to request a WebGPU adapter.', error);
385
+ }
386
+ if (adapter === null) {
387
+ throw new Error('Could not acquire a WebGPU adapter.');
388
+ }
389
+ const context = this._canvas.getContext('webgpu');
390
+ if (context === null) {
391
+ throw new Error('Could not create WebGPU canvas context.');
392
+ }
393
+ if (typeof adapter.requestDevice !== 'function') {
394
+ throw new Error('WebGPU adapter does not expose requestDevice().');
395
+ }
396
+ let device = null;
397
+ try {
398
+ device = await adapter.requestDevice();
399
+ }
400
+ catch (error) {
401
+ throw this._createInitializationError('Failed to request a WebGPU device.', error);
402
+ }
403
+ if (device === null) {
404
+ throw new Error('Could not acquire a WebGPU device.');
405
+ }
406
+ const format = gpuNavigator.gpu.getPreferredCanvasFormat();
407
+ try {
408
+ context.configure({
409
+ device,
410
+ format,
411
+ alphaMode: 'opaque',
412
+ });
413
+ }
414
+ catch (error) {
415
+ throw this._createInitializationError('Failed to configure the WebGPU canvas context.', error);
416
+ }
417
+ this._context = context;
418
+ this._device = device;
419
+ this._format = format;
420
+ this._blendMode = BlendModes.Normal;
421
+ this._hasPresentedFrame = false;
422
+ this.rendererRegistry.connect(this);
423
+ this.resize(this._canvas.width, this._canvas.height);
424
+ return this;
425
+ }
426
+ _getGpuNavigator() {
427
+ const gpuNavigator = navigator;
428
+ return gpuNavigator.gpu ? gpuNavigator : null;
429
+ }
430
+ _createInitializationError(message, error) {
431
+ if (error instanceof Error && error.message.length > 0) {
432
+ return new Error(`${message} ${error.message}`);
433
+ }
434
+ return new Error(message);
435
+ }
436
+ _destroyManagedTextures() {
437
+ for (const texture of Array.from(this._textureStates.keys())) {
438
+ this._evictTexture(texture);
439
+ }
440
+ }
441
+ _destroyTemporaryRenderTextures() {
442
+ for (const texture of this._temporaryRenderTextures) {
443
+ texture.destroy();
444
+ }
445
+ this._temporaryRenderTextures.length = 0;
446
+ }
447
+ _getTextureState(texture) {
448
+ let state = this._textureStates.get(texture);
449
+ if (!state) {
450
+ const gpuTexture = this.device.createTexture({
451
+ size: {
452
+ width: Math.max(texture.width, 1),
453
+ height: Math.max(texture.height, 1),
454
+ },
455
+ format: managedTextureFormat,
456
+ mipLevelCount: this._getMipLevelCount(texture),
457
+ usage: this._getTextureUsage(texture),
458
+ });
459
+ state = {
460
+ texture: gpuTexture,
461
+ view: gpuTexture.createView(),
462
+ sampler: this._createSampler(texture),
463
+ version: -1,
464
+ width: texture.width,
465
+ height: texture.height,
466
+ mipLevelCount: this._getMipLevelCount(texture),
467
+ hasContent: false,
468
+ };
469
+ const destroyHandler = () => {
470
+ this._evictTexture(texture);
471
+ };
472
+ texture.addDestroyListener(destroyHandler);
473
+ this._textureDestroyHandlers.set(texture, destroyHandler);
474
+ this._textureStates.set(texture, state);
475
+ }
476
+ return state;
477
+ }
478
+ _syncTexture(texture) {
479
+ if (!(texture instanceof RenderTexture) && (texture.source === null || texture.width === 0 || texture.height === 0)) {
480
+ throw new Error('WebGPU sprite rendering requires a texture with a valid source and non-zero dimensions.');
481
+ }
482
+ const state = this._getTextureState(texture);
483
+ const textureVersion = texture instanceof RenderTexture ? texture.textureVersion : texture.version;
484
+ const mipLevelCount = this._getMipLevelCount(texture);
485
+ if (state.version !== textureVersion) {
486
+ if (state.width !== texture.width || state.height !== texture.height || state.mipLevelCount !== mipLevelCount) {
487
+ state.texture.destroy();
488
+ const resizedTexture = this.device.createTexture({
489
+ size: {
490
+ width: texture.width,
491
+ height: texture.height,
492
+ },
493
+ format: managedTextureFormat,
494
+ mipLevelCount,
495
+ usage: this._getTextureUsage(texture),
496
+ });
497
+ state.texture = resizedTexture;
498
+ state.view = resizedTexture.createView();
499
+ state.width = texture.width;
500
+ state.height = texture.height;
501
+ state.mipLevelCount = mipLevelCount;
502
+ state.hasContent = false;
503
+ }
504
+ state.sampler = this._createSampler(texture);
505
+ if (!(texture instanceof RenderTexture)) {
506
+ const source = texture.source;
507
+ this.device.queue.copyExternalImageToTexture({
508
+ source,
509
+ flipY: false,
510
+ }, {
511
+ texture: state.texture,
512
+ }, {
513
+ width: texture.width,
514
+ height: texture.height,
515
+ });
516
+ if (state.mipLevelCount > 1) {
517
+ this._generateMipmaps(state.texture, state.mipLevelCount);
518
+ }
519
+ }
520
+ state.version = textureVersion;
521
+ }
522
+ return state;
523
+ }
524
+ _evictTexture(texture) {
525
+ const state = this._textureStates.get(texture);
526
+ const destroyHandler = this._textureDestroyHandlers.get(texture);
527
+ if (destroyHandler) {
528
+ texture.removeDestroyListener(destroyHandler);
529
+ this._textureDestroyHandlers.delete(texture);
530
+ }
531
+ if (state) {
532
+ state.texture.destroy();
533
+ this._textureStates.delete(texture);
534
+ }
535
+ if (this._texture === texture) {
536
+ this._texture = null;
537
+ }
538
+ }
539
+ _subscribeRenderTarget(target) {
540
+ if (!this._renderTargetDestroyHandlers.has(target)) {
541
+ const destroyHandler = () => {
542
+ if (this._renderTarget === target) {
543
+ this._renderTarget = this._rootRenderTarget;
544
+ }
545
+ this._renderTargetDestroyHandlers.delete(target);
546
+ };
547
+ target.addDestroyListener(destroyHandler);
548
+ this._renderTargetDestroyHandlers.set(target, destroyHandler);
549
+ }
550
+ }
551
+ _unsubscribeRenderTarget(target) {
552
+ const destroyHandler = this._renderTargetDestroyHandlers.get(target);
553
+ if (destroyHandler) {
554
+ target.removeDestroyListener(destroyHandler);
555
+ this._renderTargetDestroyHandlers.delete(target);
556
+ }
557
+ }
558
+ _toMaskPixels(maskBounds) {
559
+ const topLeft = this._renderTarget.mapCoordsToPixel(this._maskPointA.set(maskBounds.left, maskBounds.top));
560
+ const bottomRight = this._renderTarget.mapCoordsToPixel(this._maskPointB.set(maskBounds.right, maskBounds.bottom));
561
+ const minX = Math.min(topLeft.x, bottomRight.x);
562
+ const maxX = Math.max(topLeft.x, bottomRight.x);
563
+ const minY = Math.min(topLeft.y, bottomRight.y);
564
+ const maxY = Math.max(topLeft.y, bottomRight.y);
565
+ const targetWidth = this._renderTarget.width;
566
+ const targetHeight = this._renderTarget.height;
567
+ const x = Math.max(0, Math.min(targetWidth, Math.floor(minX)));
568
+ const right = Math.max(0, Math.min(targetWidth, Math.ceil(maxX)));
569
+ const y = Math.max(0, Math.min(targetHeight, Math.floor(minY)));
570
+ const bottom = Math.max(0, Math.min(targetHeight, Math.ceil(maxY)));
571
+ const width = Math.max(0, right - x);
572
+ const height = Math.max(0, bottom - y);
573
+ return { x, y, width, height };
574
+ }
575
+ _intersectMasks(first, second) {
576
+ const left = Math.max(first.x, second.x);
577
+ const top = Math.max(first.y, second.y);
578
+ const right = Math.min(first.x + first.width, second.x + second.width);
579
+ const bottom = Math.min(first.y + first.height, second.y + second.height);
580
+ return {
581
+ x: left,
582
+ y: top,
583
+ width: Math.max(0, right - left),
584
+ height: Math.max(0, bottom - top),
585
+ };
586
+ }
587
+ _createSampler(texture) {
588
+ return this.device.createSampler({
589
+ addressModeU: this._getAddressMode(texture.wrapMode),
590
+ addressModeV: this._getAddressMode(texture.wrapMode),
591
+ magFilter: this._getFilterMode(texture.scaleMode),
592
+ minFilter: this._getFilterMode(texture.scaleMode),
593
+ mipmapFilter: this._getMipmapFilterMode(texture.scaleMode),
594
+ });
595
+ }
596
+ _getTextureUsage(texture) {
597
+ const mipmapUsage = this._getMipLevelCount(texture) > 1 ? GPUTextureUsage.RENDER_ATTACHMENT : 0;
598
+ if (texture instanceof RenderTexture) {
599
+ return GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT | mipmapUsage;
600
+ }
601
+ return GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING | mipmapUsage;
602
+ }
603
+ _getAddressMode(wrapMode) {
604
+ switch (wrapMode) {
605
+ case WrapModes.Repeat:
606
+ return 'repeat';
607
+ case WrapModes.MirroredRepeat:
608
+ return 'mirror-repeat';
609
+ default:
610
+ return 'clamp-to-edge';
611
+ }
612
+ }
613
+ _getFilterMode(scaleMode) {
614
+ switch (scaleMode) {
615
+ case ScaleModes.Nearest:
616
+ case ScaleModes.NearestMipmapNearest:
617
+ case ScaleModes.NearestMipmapLinear:
618
+ return 'nearest';
619
+ default:
620
+ return 'linear';
621
+ }
622
+ }
623
+ _getMipmapFilterMode(scaleMode) {
624
+ switch (scaleMode) {
625
+ case ScaleModes.NearestMipmapLinear:
626
+ case ScaleModes.LinearMipmapLinear:
627
+ return 'linear';
628
+ default:
629
+ return 'nearest';
630
+ }
631
+ }
632
+ _getMipLevelCount(texture) {
633
+ if (!texture.generateMipMap) {
634
+ return 1;
635
+ }
636
+ const maxSize = Math.max(texture.width, texture.height);
637
+ if (maxSize <= 1) {
638
+ return 1;
639
+ }
640
+ return Math.floor(Math.log2(maxSize)) + 1;
641
+ }
642
+ _generateMipmaps(texture, mipLevelCount) {
643
+ if (mipLevelCount <= 1) {
644
+ return;
645
+ }
646
+ const resources = this._getMipmapResources();
647
+ const encoder = this.device.createCommandEncoder();
648
+ for (let mipLevel = 1; mipLevel < mipLevelCount; mipLevel++) {
649
+ const bindGroup = this.device.createBindGroup({
650
+ layout: resources.bindGroupLayout,
651
+ entries: [{
652
+ binding: 0,
653
+ resource: texture.createView({
654
+ baseMipLevel: mipLevel - 1,
655
+ mipLevelCount: 1,
656
+ }),
657
+ }, {
658
+ binding: 1,
659
+ resource: resources.sampler,
660
+ }],
661
+ });
662
+ const pass = encoder.beginRenderPass({
663
+ colorAttachments: [{
664
+ view: texture.createView({
665
+ baseMipLevel: mipLevel,
666
+ mipLevelCount: 1,
667
+ }),
668
+ clearValue: { r: 0, g: 0, b: 0, a: 0 },
669
+ loadOp: 'clear',
670
+ storeOp: 'store',
671
+ }],
672
+ });
673
+ pass.setPipeline(resources.pipeline);
674
+ pass.setBindGroup(0, bindGroup);
675
+ pass.draw(3);
676
+ pass.end();
677
+ }
678
+ this.device.queue.submit([encoder.finish()]);
679
+ }
680
+ _getMipmapResources() {
681
+ if (this._mipmapShaderModule === null || this._mipmapBindGroupLayout === null || this._mipmapPipelineLayout === null || this._mipmapPipeline === null || this._mipmapSampler === null) {
682
+ this._mipmapShaderModule = this.device.createShaderModule({
683
+ code: `
684
+ struct VertexOutput {
685
+ @builtin(position) position: vec4<f32>,
686
+ @location(0) texcoord: vec2<f32>,
687
+ };
688
+
689
+ @group(0) @binding(0)
690
+ var sourceTexture: texture_2d<f32>;
691
+ @group(0) @binding(1)
692
+ var sourceSampler: sampler;
693
+
694
+ @vertex
695
+ fn vertexMain(@builtin(vertex_index) vertexIndex: u32) -> VertexOutput {
696
+ var positions = array<vec2<f32>, 3>(
697
+ vec2<f32>(-1.0, -1.0),
698
+ vec2<f32>(3.0, -1.0),
699
+ vec2<f32>(-1.0, 3.0)
700
+ );
701
+ // Y is flipped vs the position array: NDC Y points up, but texture UV
702
+ // Y points down (UV (0,0) is the top-left of the source). Matching the
703
+ // two ensures that the output texture's top-left pixel samples from the
704
+ // source's top-left, so every mip level has the same orientation as the
705
+ // level above it. Prior to this, odd mip levels were rendered upside
706
+ // down, producing visible texture flips at view-size doublings.
707
+ var texcoords = array<vec2<f32>, 3>(
708
+ vec2<f32>(0.0, 1.0),
709
+ vec2<f32>(2.0, 1.0),
710
+ vec2<f32>(0.0, -1.0)
711
+ );
712
+ var output: VertexOutput;
713
+
714
+ output.position = vec4<f32>(positions[vertexIndex], 0.0, 1.0);
715
+ output.texcoord = texcoords[vertexIndex];
716
+
717
+ return output;
718
+ }
719
+
720
+ @fragment
721
+ fn fragmentMain(input: VertexOutput) -> @location(0) vec4<f32> {
722
+ return textureSample(sourceTexture, sourceSampler, input.texcoord);
723
+ }
724
+ `,
725
+ });
726
+ this._mipmapBindGroupLayout = this.device.createBindGroupLayout({
727
+ entries: [{
728
+ binding: 0,
729
+ visibility: GPUShaderStage.FRAGMENT,
730
+ texture: {
731
+ sampleType: 'float',
732
+ },
733
+ }, {
734
+ binding: 1,
735
+ visibility: GPUShaderStage.FRAGMENT,
736
+ sampler: {
737
+ type: 'filtering',
738
+ },
739
+ }],
740
+ });
741
+ this._mipmapPipelineLayout = this.device.createPipelineLayout({
742
+ bindGroupLayouts: [this._mipmapBindGroupLayout],
743
+ });
744
+ this._mipmapPipeline = this.device.createRenderPipeline({
745
+ layout: this._mipmapPipelineLayout,
746
+ vertex: {
747
+ module: this._mipmapShaderModule,
748
+ entryPoint: 'vertexMain',
749
+ },
750
+ fragment: {
751
+ module: this._mipmapShaderModule,
752
+ entryPoint: 'fragmentMain',
753
+ targets: [{
754
+ format: managedTextureFormat,
755
+ writeMask: GPUColorWrite.ALL,
756
+ }],
757
+ },
758
+ primitive: {
759
+ topology: 'triangle-list',
760
+ },
761
+ });
762
+ this._mipmapSampler = this.device.createSampler({
763
+ minFilter: 'linear',
764
+ magFilter: 'linear',
765
+ mipmapFilter: 'nearest',
766
+ });
767
+ }
768
+ return {
769
+ bindGroupLayout: this._mipmapBindGroupLayout,
770
+ pipeline: this._mipmapPipeline,
771
+ sampler: this._mipmapSampler,
772
+ };
773
+ }
774
+ }
775
+
776
+ export { WebGpuRenderManager };
777
+ //# sourceMappingURL=WebGpuRenderManager.js.map