@codexo/exojs 0.9.0 → 0.11.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 (242) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/README.md +14 -14
  3. package/dist/esm/core/Application.d.ts +25 -6
  4. package/dist/esm/core/Application.js +42 -8
  5. package/dist/esm/core/Application.js.map +1 -1
  6. package/dist/esm/core/Perf.d.ts +23 -0
  7. package/dist/esm/core/Perf.js +49 -0
  8. package/dist/esm/core/Perf.js.map +1 -0
  9. package/dist/esm/core/Scene.d.ts +8 -8
  10. package/dist/esm/core/Scene.js +7 -7
  11. package/dist/esm/core/Scene.js.map +1 -1
  12. package/dist/esm/core/SceneManager.js +2 -2
  13. package/dist/esm/core/SceneManager.js.map +1 -1
  14. package/dist/esm/core/SceneNode.d.ts +0 -3
  15. package/dist/esm/core/SceneNode.js +0 -9
  16. package/dist/esm/core/SceneNode.js.map +1 -1
  17. package/dist/esm/core/capabilities.d.ts +2 -0
  18. package/dist/esm/core/capabilities.js +15 -0
  19. package/dist/esm/core/capabilities.js.map +1 -1
  20. package/dist/esm/core/dev.d.ts +21 -0
  21. package/dist/esm/core/dev.js +18 -0
  22. package/dist/esm/core/dev.js.map +1 -0
  23. package/dist/esm/core/index.d.ts +1 -0
  24. package/dist/esm/core/types.d.ts +1 -1
  25. package/dist/esm/core/utils.d.ts +12 -0
  26. package/dist/esm/core/utils.js +18 -1
  27. package/dist/esm/core/utils.js.map +1 -1
  28. package/dist/esm/index.js +14 -3
  29. package/dist/esm/index.js.map +1 -1
  30. package/dist/esm/particles/ParticleSystem.d.ts +8 -5
  31. package/dist/esm/particles/ParticleSystem.js +9 -5
  32. package/dist/esm/particles/ParticleSystem.js.map +1 -1
  33. package/dist/esm/particles/distributions/{Gradient.d.ts → ColorGradient.d.ts} +5 -5
  34. package/dist/esm/particles/distributions/{Gradient.js → ColorGradient.js} +5 -5
  35. package/dist/esm/particles/distributions/ColorGradient.js.map +1 -0
  36. package/dist/esm/particles/distributions/Distribution.d.ts +2 -2
  37. package/dist/esm/particles/distributions/index.d.ts +2 -2
  38. package/dist/esm/particles/gpu/ParticleGpuState.js +1 -1
  39. package/dist/esm/particles/modules/AlphaFadeOverLifetime.d.ts +2 -2
  40. package/dist/esm/particles/modules/AlphaFadeOverLifetime.js +5 -1
  41. package/dist/esm/particles/modules/AlphaFadeOverLifetime.js.map +1 -1
  42. package/dist/esm/particles/modules/ColorOverLifetime.d.ts +3 -3
  43. package/dist/esm/particles/modules/ColorOverLifetime.js.map +1 -1
  44. package/dist/esm/particles/modules/ColorOverSpeed.d.ts +3 -3
  45. package/dist/esm/particles/modules/ColorOverSpeed.js.map +1 -1
  46. package/dist/esm/particles/modules/UpdateModule.d.ts +2 -2
  47. package/dist/esm/particles/modules/UpdateModule.js +1 -1
  48. package/dist/esm/particles/modules/WgslContribution.d.ts +2 -2
  49. package/dist/esm/rendering/Camera.d.ts +33 -0
  50. package/dist/esm/rendering/Camera.js +38 -0
  51. package/dist/esm/rendering/Camera.js.map +1 -0
  52. package/dist/esm/rendering/Container.d.ts +5 -24
  53. package/dist/esm/rendering/Container.js +8 -71
  54. package/dist/esm/rendering/Container.js.map +1 -1
  55. package/dist/esm/rendering/Drawable.d.ts +8 -10
  56. package/dist/esm/rendering/Drawable.js +12 -20
  57. package/dist/esm/rendering/Drawable.js.map +1 -1
  58. package/dist/esm/rendering/RenderBackend.d.ts +18 -0
  59. package/dist/esm/rendering/RenderNode.d.ts +81 -8
  60. package/dist/esm/rendering/RenderNode.js +121 -144
  61. package/dist/esm/rendering/RenderNode.js.map +1 -1
  62. package/dist/esm/rendering/RenderTarget.d.ts +13 -0
  63. package/dist/esm/rendering/RenderTarget.js +13 -0
  64. package/dist/esm/rendering/RenderTarget.js.map +1 -1
  65. package/dist/esm/rendering/RenderTargetPass.js +17 -0
  66. package/dist/esm/rendering/RenderTargetPass.js.map +1 -1
  67. package/dist/esm/rendering/RenderingContext.d.ts +87 -0
  68. package/dist/esm/rendering/RenderingContext.js +157 -0
  69. package/dist/esm/rendering/RenderingContext.js.map +1 -0
  70. package/dist/esm/rendering/TransformBuffer.d.ts +82 -0
  71. package/dist/esm/rendering/TransformBuffer.js +180 -0
  72. package/dist/esm/rendering/TransformBuffer.js.map +1 -0
  73. package/dist/esm/rendering/filters/WebGpuShaderFilter.js +5 -12
  74. package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -1
  75. package/dist/esm/rendering/geometry/Geometry.d.ts +40 -0
  76. package/dist/esm/rendering/geometry/Geometry.js +228 -0
  77. package/dist/esm/rendering/geometry/Geometry.js.map +1 -0
  78. package/dist/esm/rendering/geometry/GeometryAttribute.d.ts +32 -0
  79. package/dist/esm/rendering/geometry/QuadGeometry.d.ts +5 -0
  80. package/dist/esm/rendering/gradient/Gradient.d.ts +67 -0
  81. package/dist/esm/rendering/gradient/Gradient.js +160 -0
  82. package/dist/esm/rendering/gradient/Gradient.js.map +1 -0
  83. package/dist/esm/rendering/gradient/LinearGradient.d.ts +18 -0
  84. package/dist/esm/rendering/gradient/LinearGradient.js +49 -0
  85. package/dist/esm/rendering/gradient/LinearGradient.js.map +1 -0
  86. package/dist/esm/rendering/gradient/RadialGradient.d.ts +18 -0
  87. package/dist/esm/rendering/gradient/RadialGradient.js +44 -0
  88. package/dist/esm/rendering/gradient/RadialGradient.js.map +1 -0
  89. package/dist/esm/rendering/index.d.ts +16 -2
  90. package/dist/esm/rendering/material/Material.d.ts +114 -0
  91. package/dist/esm/rendering/material/Material.js +111 -0
  92. package/dist/esm/rendering/material/Material.js.map +1 -0
  93. package/dist/esm/rendering/material/MaterialKey.d.ts +18 -0
  94. package/dist/esm/rendering/material/MaterialKey.js +82 -0
  95. package/dist/esm/rendering/material/MaterialKey.js.map +1 -0
  96. package/dist/esm/rendering/material/MeshMaterial.d.ts +16 -0
  97. package/dist/esm/rendering/material/MeshMaterial.js +21 -0
  98. package/dist/esm/rendering/material/MeshMaterial.js.map +1 -0
  99. package/dist/esm/rendering/{mesh/MeshShader.d.ts → material/ShaderSource.d.ts} +29 -62
  100. package/dist/esm/rendering/{mesh/MeshShader.js → material/ShaderSource.js} +35 -62
  101. package/dist/esm/rendering/material/ShaderSource.js.map +1 -0
  102. package/dist/esm/rendering/material/SpriteMaterial.d.ts +15 -0
  103. package/dist/esm/rendering/material/SpriteMaterial.js +20 -0
  104. package/dist/esm/rendering/material/SpriteMaterial.js.map +1 -0
  105. package/dist/esm/rendering/mesh/Mesh.d.ts +29 -12
  106. package/dist/esm/rendering/mesh/Mesh.js +122 -3
  107. package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
  108. package/dist/esm/rendering/pass/RenderPassCoordinator.d.ts +63 -0
  109. package/dist/esm/rendering/pass/RenderPassDescriptor.d.ts +48 -0
  110. package/dist/esm/rendering/pass/RenderPassDescriptor.js +16 -0
  111. package/dist/esm/rendering/pass/RenderPassDescriptor.js.map +1 -0
  112. package/dist/esm/rendering/plan/RenderCommand.d.ts +86 -0
  113. package/dist/esm/rendering/plan/RenderCommand.js +127 -0
  114. package/dist/esm/rendering/plan/RenderCommand.js.map +1 -0
  115. package/dist/esm/rendering/plan/RenderEffectExecutor.d.ts +10 -0
  116. package/dist/esm/rendering/plan/RenderEffectExecutor.js +159 -0
  117. package/dist/esm/rendering/plan/RenderEffectExecutor.js.map +1 -0
  118. package/dist/esm/rendering/plan/RenderInstruction.d.ts +51 -0
  119. package/dist/esm/rendering/plan/RenderInstruction.js +45 -0
  120. package/dist/esm/rendering/plan/RenderInstruction.js.map +1 -0
  121. package/dist/esm/rendering/plan/RenderPlan.d.ts +23 -0
  122. package/dist/esm/rendering/plan/RenderPlan.js +12 -0
  123. package/dist/esm/rendering/plan/RenderPlan.js.map +1 -0
  124. package/dist/esm/rendering/plan/RenderPlanBuilder.d.ts +31 -0
  125. package/dist/esm/rendering/plan/RenderPlanBuilder.js +242 -0
  126. package/dist/esm/rendering/plan/RenderPlanBuilder.js.map +1 -0
  127. package/dist/esm/rendering/plan/RenderPlanOptimizer.d.ts +10 -0
  128. package/dist/esm/rendering/plan/RenderPlanOptimizer.js +180 -0
  129. package/dist/esm/rendering/plan/RenderPlanOptimizer.js.map +1 -0
  130. package/dist/esm/rendering/plan/RenderPlanPlayer.d.ts +13 -0
  131. package/dist/esm/rendering/plan/RenderPlanPlayer.js +107 -0
  132. package/dist/esm/rendering/plan/RenderPlanPlayer.js.map +1 -0
  133. package/dist/esm/rendering/plan/RenderScope.d.ts +70 -0
  134. package/dist/esm/rendering/plan/RenderScope.js +16 -0
  135. package/dist/esm/rendering/plan/RenderScope.js.map +1 -0
  136. package/dist/esm/rendering/plan/playRenderTree.d.ts +4 -0
  137. package/dist/esm/rendering/plan/playRenderTree.js +19 -0
  138. package/dist/esm/rendering/plan/playRenderTree.js.map +1 -0
  139. package/dist/esm/rendering/primitives/Graphics.d.ts +70 -5
  140. package/dist/esm/rendering/primitives/Graphics.js +172 -14
  141. package/dist/esm/rendering/primitives/Graphics.js.map +1 -1
  142. package/dist/esm/rendering/sprite/Sprite.d.ts +22 -1
  143. package/dist/esm/rendering/sprite/Sprite.js +33 -2
  144. package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
  145. package/dist/esm/rendering/sprite/spriteMaterialSources.d.ts +41 -0
  146. package/dist/esm/rendering/sprite/spriteMaterialSources.js +149 -0
  147. package/dist/esm/rendering/sprite/spriteMaterialSources.js.map +1 -0
  148. package/dist/esm/rendering/text/BitmapText.d.ts +2 -0
  149. package/dist/esm/rendering/text/BitmapText.js +8 -1
  150. package/dist/esm/rendering/text/BitmapText.js.map +1 -1
  151. package/dist/esm/rendering/text/BmFont.js +3 -0
  152. package/dist/esm/rendering/text/BmFont.js.map +1 -1
  153. package/dist/esm/rendering/text/GlyphSdf.d.ts +14 -0
  154. package/dist/esm/rendering/text/GlyphSdf.js +41 -11
  155. package/dist/esm/rendering/text/GlyphSdf.js.map +1 -1
  156. package/dist/esm/rendering/text/TextStyle.d.ts +6 -1
  157. package/dist/esm/rendering/text/TextStyle.js +1 -1
  158. package/dist/esm/rendering/text/TextStyle.js.map +1 -1
  159. package/dist/esm/rendering/texture/DataTexture.d.ts +5 -0
  160. package/dist/esm/rendering/texture/DataTexture.js +7 -0
  161. package/dist/esm/rendering/texture/DataTexture.js.map +1 -1
  162. package/dist/esm/rendering/texture/RenderTexture.js.map +1 -1
  163. package/dist/esm/rendering/video/Video.d.ts +3 -7
  164. package/dist/esm/rendering/video/Video.js +3 -8
  165. package/dist/esm/rendering/video/Video.js.map +1 -1
  166. package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +62 -0
  167. package/dist/esm/rendering/webgl2/WebGl2Backend.js +352 -21
  168. package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
  169. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.d.ts +22 -2
  170. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +404 -112
  171. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -1
  172. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.d.ts +8 -0
  173. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js +8 -0
  174. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js.map +1 -1
  175. package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.d.ts +57 -0
  176. package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js +79 -0
  177. package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js.map +1 -0
  178. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +14 -0
  179. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +257 -78
  180. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
  181. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.d.ts +34 -0
  182. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js +169 -0
  183. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js.map +1 -0
  184. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.d.ts +7 -0
  185. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js +11 -0
  186. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js.map +1 -1
  187. package/dist/esm/rendering/webgl2/glsl/mesh.frag.js +1 -1
  188. package/dist/esm/rendering/webgl2/glsl/mesh.vert.js +1 -1
  189. package/dist/esm/rendering/webgl2/glsl/sprite.vert.js +1 -1
  190. package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js +4 -0
  191. package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js.map +1 -0
  192. package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js +4 -0
  193. package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js.map +1 -0
  194. package/dist/esm/rendering/webgl2/glsl/text-color.frag.js +1 -1
  195. package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +63 -0
  196. package/dist/esm/rendering/webgpu/WebGpuBackend.js +180 -19
  197. package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
  198. package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js +22 -17
  199. package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js.map +1 -1
  200. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +24 -0
  201. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +524 -98
  202. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
  203. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.d.ts +7 -0
  204. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +24 -22
  205. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js.map +1 -1
  206. package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.d.ts +141 -0
  207. package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js +270 -0
  208. package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js.map +1 -0
  209. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +25 -1
  210. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +430 -76
  211. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
  212. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.d.ts +57 -0
  213. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js +257 -0
  214. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js.map +1 -0
  215. package/dist/esm/rendering/webgpu/WebGpuStencilState.d.ts +14 -0
  216. package/dist/esm/rendering/webgpu/WebGpuStencilState.js +36 -0
  217. package/dist/esm/rendering/webgpu/WebGpuStencilState.js.map +1 -0
  218. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.d.ts +7 -0
  219. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js +30 -19
  220. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js.map +1 -1
  221. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts +48 -0
  222. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js +103 -0
  223. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js.map +1 -0
  224. package/dist/esm/resources/JsonStore.d.ts +18 -0
  225. package/dist/esm/resources/JsonStore.js +62 -0
  226. package/dist/esm/resources/JsonStore.js.map +1 -0
  227. package/dist/esm/resources/Loader.js +1 -1
  228. package/dist/esm/resources/Loader.js.map +1 -1
  229. package/dist/esm/resources/factories/ImageFactory.d.ts +14 -8
  230. package/dist/esm/resources/factories/ImageFactory.js +13 -6
  231. package/dist/esm/resources/factories/ImageFactory.js.map +1 -1
  232. package/dist/esm/resources/factories/TextureFactory.d.ts +4 -4
  233. package/dist/esm/resources/factories/TextureFactory.js +8 -4
  234. package/dist/esm/resources/factories/TextureFactory.js.map +1 -1
  235. package/dist/esm/resources/index.d.ts +1 -0
  236. package/dist/exo.esm.js +6326 -2350
  237. package/dist/exo.esm.js.map +1 -1
  238. package/package.json +34 -24
  239. package/dist/esm/particles/distributions/Gradient.js.map +0 -1
  240. package/dist/esm/rendering/mesh/MeshShader.js.map +0 -1
  241. package/dist/esm/vendor/webgl-debug.js +0 -1160
  242. package/dist/esm/vendor/webgl-debug.js.map +0 -1
@@ -1,15 +1,18 @@
1
+ let nextShaderSourceId = 1;
1
2
  /**
2
- * Custom shader pair attached to a {@link Mesh}.
3
+ * Immutable shader source pair shared by {@link Material} instances.
3
4
  *
4
- * One `MeshShader` instance can be shared across many meshes; renderers
5
- * cache compiled programs/pipelines on the instance reference. Call
6
- * {@link destroy} when the shader is no longer needed to release the
7
- * cached GPU resources on every backend the shader was used on.
5
+ * `ShaderSource` owns only the GLSL/WGSL text and its stable identity;
6
+ * it carries no uniform/texture state (that lives on the {@link Material}).
7
+ * One `ShaderSource` can back many materials, and renderers key their
8
+ * compiled program/pipeline caches on the source identity exposed via
9
+ * {@link id}.
8
10
  *
9
11
  * # Vertex layout
10
12
  *
11
- * The vertex layout is fixed and shared with the default mesh shader,
12
- * so custom vertex shaders MUST pin the standard attribute locations:
13
+ * The vertex layout for the mesh path is fixed and shared with the default
14
+ * mesh material, so custom vertex shaders MUST pin the standard attribute
15
+ * locations:
13
16
  *
14
17
  * ## GLSL (location-qualified)
15
18
  *
@@ -31,16 +34,16 @@
31
34
  *
32
35
  * # Auto-bound uniforms
33
36
  *
34
- * The renderer auto-binds these when the shader declares them. Declared
35
- * but unused is fine; absent is fine too. Both backends carry the same
36
- * logical uniforms, only the binding scheme differs.
37
+ * Renderers auto-bind these when the source declares them. Declared but
38
+ * unused is fine; absent is fine too. Both backends carry the same logical
39
+ * uniforms, only the binding scheme differs.
37
40
  *
38
41
  * ## GLSL
39
42
  *
40
43
  * ```glsl
41
44
  * uniform mat3 u_projection; // active view's projection
42
- * uniform mat3 u_translation; // mesh's global transform
43
- * uniform vec4 u_tint; // mesh.tint as RGBA in 0..1
45
+ * uniform mat3 u_translation; // drawable's global transform
46
+ * uniform vec4 u_tint; // tint as RGBA in 0..1
44
47
  * uniform sampler2D u_texture; // bound to texture slot 0
45
48
  * ```
46
49
  *
@@ -61,8 +64,9 @@
61
64
  *
62
65
  * # User uniforms
63
66
  *
64
- * Anything in {@link uniforms} is set after the auto-binds. `Texture`/
65
- * `RenderTexture` values claim slots 1..N (slot 0 belongs to the mesh).
67
+ * Anything in {@link Material.uniforms} is set after the auto-binds.
68
+ * `Texture`/`RenderTexture` values claim slots 1..N (slot 0 belongs to the
69
+ * drawable's own texture).
66
70
  *
67
71
  * ## WGSL user-uniform contract
68
72
  *
@@ -74,46 +78,37 @@
74
78
  * in declaration order, alongside its sampler at `@binding(N+1)`.
75
79
  * @advanced
76
80
  */
77
- class MeshShader {
78
- /**
79
- * Mutable user uniform values. Mutate between frames to drive animated
80
- * effects; the renderer reads from this map every draw.
81
- *
82
- * shader.uniforms.uTime = performance.now() / 1000;
83
- * shader.uniforms.uColor = [1, 0.5, 0, 1];
84
- */
85
- uniforms;
81
+ class ShaderSource {
86
82
  /** GLSL source pair for the WebGL2 backend, or `null` if not provided. */
87
83
  glsl;
88
84
  /** WGSL source for the WebGPU backend, or `null` if not provided. */
89
85
  wgsl;
90
- _disposeCallbacks = new Set();
86
+ _id;
91
87
  constructor(options) {
92
88
  if (options.glsl === undefined && options.wgsl === undefined) {
93
- throw new Error('MeshShader requires at least one of `glsl` or `wgsl`.');
89
+ throw new Error('ShaderSource requires at least one of `glsl` or `wgsl`.');
94
90
  }
95
91
  if (options.glsl !== undefined) {
96
92
  if (typeof options.glsl.vertex !== 'string' || options.glsl.vertex.length === 0) {
97
- throw new Error('MeshShader.glsl.vertex must be a non-empty string.');
93
+ throw new Error('ShaderSource.glsl.vertex must be a non-empty string.');
98
94
  }
99
95
  if (typeof options.glsl.fragment !== 'string' || options.glsl.fragment.length === 0) {
100
- throw new Error('MeshShader.glsl.fragment must be a non-empty string.');
96
+ throw new Error('ShaderSource.glsl.fragment must be a non-empty string.');
101
97
  }
102
98
  }
103
99
  if (options.wgsl !== undefined && (typeof options.wgsl !== 'string' || options.wgsl.length === 0)) {
104
- throw new Error('MeshShader.wgsl must be a non-empty string.');
100
+ throw new Error('ShaderSource.wgsl must be a non-empty string.');
105
101
  }
106
102
  this.glsl = options.glsl ?? null;
107
103
  this.wgsl = options.wgsl ?? null;
108
- this.uniforms = { ...(options.uniforms ?? {}) };
104
+ this._id = nextShaderSourceId++;
109
105
  }
110
106
  /**
111
- * Convenience setter equivalent to `shader.uniforms[name] = value`.
112
- * Provided for symmetry with engine APIs that prefer explicit methods
113
- * over property mutation.
107
+ * Stable per-instance identity. Identical `id` same compiled program/
108
+ * pipeline can be reused. Monotonic across the session; never reused.
114
109
  */
115
- setUniform(name, value) {
116
- this.uniforms[name] = value;
110
+ get id() {
111
+ return this._id;
117
112
  }
118
113
  /**
119
114
  * Reflect declared uniforms from each language's source. Returns a per-
@@ -124,8 +119,9 @@ class MeshShader {
124
119
  *
125
120
  * Reflection is best-effort and intended for CI drift-checks and editor
126
121
  * tooling, not for runtime uniform binding decisions. The renderers do
127
- * NOT consult this map; they bind uniforms by name from {@link uniforms}
128
- * and let the underlying API resolve declared-but-unused entries.
122
+ * NOT consult this map; they bind uniforms by name from
123
+ * {@link Material.uniforms} and let the underlying API resolve declared-
124
+ * but-unused entries.
129
125
  */
130
126
  getDeclaredUniforms() {
131
127
  return {
@@ -164,29 +160,6 @@ class MeshShader {
164
160
  }
165
161
  return { onlyInGlsl, onlyInWgsl };
166
162
  }
167
- /**
168
- * Release GPU resources cached against this `MeshShader` on every
169
- * backend that has compiled it. Safe to call multiple times. After
170
- * destroy, the shader can still be re-used — renderers will recompile
171
- * on next draw — but typical usage is to drop the reference.
172
- */
173
- destroy() {
174
- for (const callback of this._disposeCallbacks) {
175
- callback();
176
- }
177
- this._disposeCallbacks.clear();
178
- }
179
- /**
180
- * Internal hook for renderers to register a per-shader-instance cleanup
181
- * callback (release compiled program, pipeline, or bind groups). The
182
- * callback fires on {@link destroy}; renderers MUST also tolerate the
183
- * shader being garbage-collected without destroy ever being called.
184
- *
185
- * @internal
186
- */
187
- _onDispose(callback) {
188
- this._disposeCallbacks.add(callback);
189
- }
190
163
  }
191
164
  const autoBoundUniformNames = new Set(['u_projection', 'u_translation', 'u_tint', 'u_texture', 'u_mesh']);
192
165
  const glslUniformPattern = /\buniform\s+(?:mediump\s+|highp\s+|lowp\s+|)(\w+)\s+(\w+)[^;]*;/g;
@@ -194,7 +167,7 @@ const wgslUserUniformPattern = /@group\(\s*2\s*\)\s*@binding\(\s*\d+\s*\)\s*var(
194
167
  /**
195
168
  * Strip line and block comments from a shader source so the uniform
196
169
  * regexes don't match commented-out declarations. Conservative: works
197
- * for both GLSL and WGSL syntax (both use `//` and `/* ... *\/`).
170
+ * for both GLSL and WGSL syntax (both use `//` and block comments).
198
171
  */
199
172
  function stripComments(source) {
200
173
  return source.replaceAll(/\/\*[\s\S]*?\*\//g, '').replaceAll(/\/\/[^\n]*/g, '');
@@ -228,5 +201,5 @@ function parseWgslUniforms(source) {
228
201
  return result;
229
202
  }
230
203
 
231
- export { MeshShader };
232
- //# sourceMappingURL=MeshShader.js.map
204
+ export { ShaderSource };
205
+ //# sourceMappingURL=ShaderSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShaderSource.js","sources":["../../../../../src/rendering/material/ShaderSource.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { MaterialOptions } from './Material';
2
+ import { Material } from './Material';
3
+ /**
4
+ * Material specialization for {@link Sprite} drawables.
5
+ *
6
+ * API shell for the sprite custom-material path; the renderer integration
7
+ * and instancing contract are added in a later phase. The base texture
8
+ * stays on the sprite — this material supplies the fragment program,
9
+ * uniforms, and additional texture bindings.
10
+ * @advanced
11
+ */
12
+ export declare class SpriteMaterial extends Material {
13
+ readonly target = "sprite";
14
+ constructor(options: MaterialOptions);
15
+ }
@@ -0,0 +1,20 @@
1
+ import { Material } from './Material.js';
2
+
3
+ /**
4
+ * Material specialization for {@link Sprite} drawables.
5
+ *
6
+ * API shell for the sprite custom-material path; the renderer integration
7
+ * and instancing contract are added in a later phase. The base texture
8
+ * stays on the sprite — this material supplies the fragment program,
9
+ * uniforms, and additional texture bindings.
10
+ * @advanced
11
+ */
12
+ class SpriteMaterial extends Material {
13
+ target = 'sprite';
14
+ constructor(options) {
15
+ super(options);
16
+ }
17
+ }
18
+
19
+ export { SpriteMaterial };
20
+ //# sourceMappingURL=SpriteMaterial.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpriteMaterial.js","sources":["../../../../../src/rendering/material/SpriteMaterial.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAGA;;;;;;;;AAQG;AACG,MAAO,cAAe,SAAQ,QAAQ,CAAA;IAC1B,MAAM,GAAG,QAAQ;AAEjC,IAAA,WAAA,CAAmB,OAAwB,EAAA;QACzC,KAAK,CAAC,OAAO,CAAC;IAChB;AACD;;;;"}
@@ -1,29 +1,43 @@
1
1
  import { Drawable } from '@/rendering/Drawable';
2
- import type { MeshShader } from '@/rendering/mesh/MeshShader';
2
+ import type { Geometry } from '@/rendering/geometry/Geometry';
3
+ import type { MeshMaterial } from '@/rendering/material/MeshMaterial';
3
4
  import type { RenderTexture } from '@/rendering/texture/RenderTexture';
4
5
  import type { Texture } from '@/rendering/texture/Texture';
5
6
  /**
6
7
  * Construction-time options for a {@link Mesh}.
7
8
  *
8
- * Vertices are required and must be a flat sequence of (x, y) pairs in
9
- * local space. UVs and per-vertex colors are optional but, when present,
10
- * must match the vertex count (UVs as (u, v) pairs, colors as one
11
- * packed-RGBA8 u32 per vertex). Indices are optional if absent, the
12
- * vertex stream is drawn as a flat triangle list (3*N vertices = N
13
- * triangles). A texture is optional; a textured mesh samples it at the
14
- * supplied UVs while an untextured mesh paints solid vertex colors only.
9
+ * Provide the geometry in exactly one of two forms:
10
+ *
11
+ * - **Convenience form** a flat `vertices` array of (x, y) pairs in local
12
+ * space, with optional `uvs`, per-vertex `colors`, and `indices`. This is
13
+ * the simplest path: `new Mesh({ vertices })`.
14
+ * - **Geometry form** a {@link Geometry} object whose standard attributes
15
+ * (`a_position`/`position`, `a_texcoord`/`texcoord`, `a_color`/`color`) are
16
+ * read into the mesh: `new Mesh({ geometry })`. The geometry must use the
17
+ * `triangle-list` topology.
18
+ *
19
+ * Supplying both `vertices` and `geometry`, or neither, throws.
20
+ *
21
+ * When present, `uvs` must match the vertex count (as (u, v) pairs) and
22
+ * `colors` must supply one packed-RGBA8 u32 per vertex. `indices` are optional
23
+ * — if absent, the vertex stream is drawn as a flat triangle list (3*N
24
+ * vertices = N triangles). A texture is optional; a textured mesh samples it
25
+ * at the supplied UVs while an untextured mesh paints solid vertex colors only.
15
26
  *
16
27
  * Validation is enforced at construction; any mismatch throws.
17
28
  *
18
- * For custom shaders, see {@link MeshShader}.
29
+ * For custom shaders/uniforms/textures, attach a {@link MeshMaterial}.
19
30
  */
20
31
  export interface MeshOptions {
21
- readonly vertices: Float32Array;
32
+ readonly vertices?: Float32Array;
22
33
  readonly indices?: Uint16Array;
23
34
  readonly uvs?: Float32Array;
24
35
  readonly colors?: Uint32Array;
36
+ /** Interleaved geometry source; mutually exclusive with `vertices`. */
37
+ readonly geometry?: Geometry;
25
38
  readonly texture?: Texture | RenderTexture | null;
26
- readonly shader?: MeshShader;
39
+ /** Custom look (shader/uniforms/textures/blendMode); `null` uses the default mesh material. */
40
+ readonly material?: MeshMaterial;
27
41
  }
28
42
  /**
29
43
  * Arbitrary 2D triangle-mesh primitive.
@@ -58,7 +72,10 @@ export declare class Mesh extends Drawable {
58
72
  readonly indices: Uint16Array | null;
59
73
  readonly uvs: Float32Array | null;
60
74
  readonly colors: Uint32Array | null;
61
- readonly shader: MeshShader | null;
75
+ /** Custom material attached to this mesh, or `null` for the default mesh path. */
76
+ readonly material: MeshMaterial | null;
77
+ /** Source geometry when constructed from the geometry form, otherwise `null`. */
78
+ readonly geometry: Geometry | null;
62
79
  private _texture;
63
80
  constructor(options: MeshOptions);
64
81
  /** Number of (x, y) vertex pairs in the mesh (i.e. `vertices.length / 2`). */
@@ -33,11 +33,40 @@ class Mesh extends Drawable {
33
33
  indices;
34
34
  uvs;
35
35
  colors;
36
- shader;
36
+ /** Custom material attached to this mesh, or `null` for the default mesh path. */
37
+ material;
38
+ /** Source geometry when constructed from the geometry form, otherwise `null`. */
39
+ geometry;
37
40
  _texture;
38
41
  constructor(options) {
39
42
  super();
40
- const { vertices, indices = null, uvs = null, colors = null, texture = null, shader = null } = options;
43
+ const { texture = null, material = null } = options;
44
+ let vertices;
45
+ let indices;
46
+ let uvs;
47
+ let colors;
48
+ let geometry;
49
+ if (options.geometry !== undefined) {
50
+ if (options.vertices !== undefined) {
51
+ throw new Error('Mesh accepts either `vertices` or `geometry`, not both.');
52
+ }
53
+ geometry = options.geometry;
54
+ const data = readGeometry(geometry);
55
+ vertices = data.vertices;
56
+ uvs = data.uvs;
57
+ colors = data.colors;
58
+ indices = data.indices;
59
+ }
60
+ else {
61
+ if (options.vertices === undefined) {
62
+ throw new Error('Mesh requires either `vertices` or `geometry`.');
63
+ }
64
+ geometry = null;
65
+ vertices = options.vertices;
66
+ indices = options.indices ?? null;
67
+ uvs = options.uvs ?? null;
68
+ colors = options.colors ?? null;
69
+ }
41
70
  if (vertices.length === 0 || vertices.length % 2 !== 0) {
42
71
  throw new Error(`Mesh vertices must be a non-empty flat array of (x,y) pairs (got length ${vertices.length}).`);
43
72
  }
@@ -68,7 +97,8 @@ class Mesh extends Drawable {
68
97
  this.indices = indices;
69
98
  this.uvs = uvs;
70
99
  this.colors = colors;
71
- this.shader = shader;
100
+ this.material = material;
101
+ this.geometry = geometry;
72
102
  this._texture = texture;
73
103
  this.recomputeLocalBounds();
74
104
  }
@@ -114,6 +144,95 @@ class Mesh extends Drawable {
114
144
  return this;
115
145
  }
116
146
  }
147
+ const positionAttributeNames = new Set(['a_position', 'position']);
148
+ const texcoordAttributeNames = new Set(['a_texcoord', 'texcoord', 'a_uv', 'uv']);
149
+ const colorAttributeNames = new Set(['a_color', 'color']);
150
+ const findAttribute = (attributes, names) => attributes.find(attribute => names.has(attribute.name));
151
+ /**
152
+ * Read a {@link Geometry}'s standard mesh attributes into the flat
153
+ * `vertices`/`uvs`/`colors` arrays the mesh renderers consume. Only the
154
+ * `triangle-list` topology and the canonical attribute layout (`f32` position
155
+ * and texcoord, `u8`/`u32`/`f32` color) are supported — this is the immediate
156
+ * (non-batched) bridge; shared GPU buffers and instancing arrive later.
157
+ */
158
+ function readGeometry(geometry) {
159
+ if (geometry.topology !== 'triangle-list') {
160
+ throw new Error(`Mesh only supports triangle-list geometry (got "${geometry.topology}").`);
161
+ }
162
+ const position = findAttribute(geometry.attributes, positionAttributeNames);
163
+ if (position === undefined) {
164
+ throw new Error('Mesh geometry requires a position attribute named `a_position` or `position`.');
165
+ }
166
+ if (position.type !== 'f32' || position.size < 2) {
167
+ throw new Error('Mesh geometry position attribute must be a float vector with at least 2 components.');
168
+ }
169
+ const texcoord = findAttribute(geometry.attributes, texcoordAttributeNames);
170
+ if (texcoord !== undefined && (texcoord.type !== 'f32' || texcoord.size < 2)) {
171
+ throw new Error('Mesh geometry texcoord attribute must be a float vector with at least 2 components.');
172
+ }
173
+ const color = findAttribute(geometry.attributes, colorAttributeNames);
174
+ const vertexCount = geometry.vertexCount;
175
+ const { stride } = geometry;
176
+ const source = geometry.vertexData;
177
+ const view = source instanceof Float32Array ? new DataView(source.buffer, source.byteOffset, source.byteLength) : new DataView(source);
178
+ const vertices = new Float32Array(vertexCount * 2);
179
+ const uvs = texcoord !== undefined ? new Float32Array(vertexCount * 2) : null;
180
+ const colors = color !== undefined ? new Uint32Array(vertexCount) : null;
181
+ for (let i = 0; i < vertexCount; i++) {
182
+ const base = i * stride;
183
+ vertices[i * 2] = view.getFloat32(base + position.offset, true);
184
+ vertices[i * 2 + 1] = view.getFloat32(base + position.offset + 4, true);
185
+ if (uvs !== null && texcoord !== undefined) {
186
+ uvs[i * 2] = view.getFloat32(base + texcoord.offset, true);
187
+ uvs[i * 2 + 1] = view.getFloat32(base + texcoord.offset + 4, true);
188
+ }
189
+ if (colors !== null && color !== undefined) {
190
+ colors[i] = readPackedColor(view, base + color.offset, color);
191
+ }
192
+ }
193
+ const indices = readIndices(geometry.indices, vertexCount);
194
+ return { vertices, uvs, colors, indices };
195
+ }
196
+ /** Pack a geometry color attribute into the mesh's RGBA8 u32 representation. */
197
+ function readPackedColor(view, offset, attribute) {
198
+ if (attribute.type === 'u32' && attribute.size === 1) {
199
+ return view.getUint32(offset, true) >>> 0;
200
+ }
201
+ if (attribute.type === 'u8' && attribute.size === 4) {
202
+ const r = view.getUint8(offset);
203
+ const g = view.getUint8(offset + 1);
204
+ const b = view.getUint8(offset + 2);
205
+ const a = view.getUint8(offset + 3);
206
+ return (r | (g << 8) | (b << 16) | (a << 24)) >>> 0;
207
+ }
208
+ if (attribute.type === 'f32' && attribute.size === 4) {
209
+ const r = Math.round(clamp01(view.getFloat32(offset, true)) * 255);
210
+ const g = Math.round(clamp01(view.getFloat32(offset + 4, true)) * 255);
211
+ const b = Math.round(clamp01(view.getFloat32(offset + 8, true)) * 255);
212
+ const a = Math.round(clamp01(view.getFloat32(offset + 12, true)) * 255);
213
+ return (r | (g << 8) | (b << 16) | (a << 24)) >>> 0;
214
+ }
215
+ throw new Error('Mesh geometry color attribute must be u8x4, u32x1, or f32x4.');
216
+ }
217
+ function readIndices(indices, vertexCount) {
218
+ if (indices === null) {
219
+ return null;
220
+ }
221
+ if (indices instanceof Uint16Array) {
222
+ return indices;
223
+ }
224
+ if (vertexCount > 0xffff) {
225
+ throw new Error(`Mesh geometry with ${vertexCount} vertices exceeds the 16-bit index limit.`);
226
+ }
227
+ return Uint16Array.from(indices);
228
+ }
229
+ function clamp01(value) {
230
+ if (value < 0)
231
+ return 0;
232
+ if (value > 1)
233
+ return 1;
234
+ return value;
235
+ }
117
236
 
118
237
  export { Mesh };
119
238
  //# sourceMappingURL=Mesh.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Mesh.js","sources":["../../../../../src/rendering/mesh/Mesh.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Mesh.js","sources":["../../../../../src/rendering/mesh/Mesh.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { Matrix } from '@/math/Matrix';
2
+ import type { Rectangle } from '@/math/Rectangle';
3
+ import type { Geometry } from '../geometry/Geometry';
4
+ import type { RenderTarget } from '../RenderTarget';
5
+ import type { View } from '../View';
6
+ import type { RenderPassDescriptor, RenderPassLoad } from './RenderPassDescriptor';
7
+ /**
8
+ * Internal, backend-owned owner of render-pass lifecycle: target / view / clear
9
+ * orchestration, the scissor and stencil-clip stacks, and — on WebGPU — the
10
+ * active `GPURenderPassEncoder`.
11
+ *
12
+ * There is no public RenderPass API. This abstraction exists so the WebGL2 and
13
+ * WebGPU backends can share the orchestration shape that geometric stencil
14
+ * clipping needs, while each maps it onto its own state model: WebGL2 onto
15
+ * ambient GL state (bound framebuffer, viewport, scissor, stencil), WebGPU onto
16
+ * explicit render passes built up front with their attachments.
17
+ * @internal
18
+ */
19
+ export interface RenderPassCoordinator {
20
+ /** The target the active pass draws into (the backend root when idle). */
21
+ readonly activeTarget: RenderTarget;
22
+ /** The view the active pass renders with. */
23
+ readonly activeView: View;
24
+ /** Whether a pass is currently open. */
25
+ readonly hasActivePass: boolean;
26
+ /** Open a pass for `descriptor`, applying its target / view / clear / stencil state. */
27
+ beginPass(descriptor: RenderPassDescriptor): void;
28
+ /** Close the active pass, flushing any pending draws into it. */
29
+ endPass(): void;
30
+ /**
31
+ * Run `body` inside a child pass described by `descriptor`, restoring the
32
+ * previous target and view afterwards — even if `body` throws. Preserves the
33
+ * save / restore semantics of {@link RenderTargetPass}.
34
+ */
35
+ withChildPass(descriptor: RenderPassDescriptor, body: () => void): void;
36
+ /** Push an axis-aligned scissor rectangle; nested rectangles intersect. */
37
+ pushScissorRect(bounds: Rectangle): void;
38
+ /** Pop the most recently pushed scissor rectangle. */
39
+ popScissorRect(): void;
40
+ /** Push a geometric stencil clip — the `shape` silhouette under `transform`. */
41
+ pushStencilClip(shape: Geometry, transform: Matrix): void;
42
+ /** Pop the most recently pushed stencil clip. */
43
+ popStencilClip(): void;
44
+ /**
45
+ * Decide whether `target` should be cleared or loaded given an explicit clear
46
+ * request. Centralizes the clear-vs-load / content-preservation decision so a
47
+ * render texture's contents survive across multiple passes in one frame.
48
+ */
49
+ resolveLoad(target: RenderTarget, clearRequested: boolean): RenderPassLoad;
50
+ }
51
+ /**
52
+ * Duck-typing host for backends that own a {@link RenderPassCoordinator}.
53
+ *
54
+ * Generic, `RenderBackend`-typed orchestration code ({@link RenderTargetPass},
55
+ * {@link RenderingContext.renderTo}) reaches the coordinator through this
56
+ * optional accessor and falls back to a legacy inline target/view save-restore
57
+ * when it is absent (e.g. test stub backends), mirroring the `_beginDrawPlan?`
58
+ * hook pattern used by `RenderPlanPlayer`.
59
+ * @internal
60
+ */
61
+ export interface RenderPassCoordinatorHost {
62
+ readonly _passCoordinator: RenderPassCoordinator;
63
+ }
@@ -0,0 +1,48 @@
1
+ import type { Color } from '@/core/Color';
2
+ import type { RenderTarget } from '../RenderTarget';
3
+ import type { View } from '../View';
4
+ /**
5
+ * Whether a render pass carries a stencil attachment.
6
+ *
7
+ * WebGL2 stencil is ambient per-target GL state, so this flag is largely
8
+ * informational there; the WebGPU backend uses it to
9
+ * decide whether a pass descriptor needs a `depthStencilAttachment`.
10
+ * @internal
11
+ */
12
+ export declare enum StencilAttachmentMode {
13
+ None = 0,
14
+ Enabled = 1
15
+ }
16
+ /** Load behaviour for a pass's colour attachment. @internal */
17
+ export type RenderPassLoad = 'clear' | 'load';
18
+ /**
19
+ * Backend-agnostic description of a single render pass: which target and view
20
+ * it draws into, whether it clears or loads its colour attachment, and whether
21
+ * it carries a stencil attachment.
22
+ *
23
+ * WebGL2 maps this onto ambient framebuffer / viewport / scissor / stencil
24
+ * state; WebGPU maps it onto a `GPURenderPassEncoder`.
25
+ * @internal
26
+ */
27
+ export interface RenderPassDescriptor {
28
+ /** Target to draw into. `null` selects the backend's root (canvas) target. */
29
+ readonly target: RenderTarget | null;
30
+ /** View to render with. `null` inherits the target's current view. */
31
+ readonly view: View | null;
32
+ /** Whether the colour attachment is cleared or preserved when the pass begins. */
33
+ readonly load: RenderPassLoad;
34
+ /** Clear colour used when `load === 'clear'`. `null` keeps the backend's current clear colour. */
35
+ readonly clearColor: Color | null;
36
+ /** Whether this pass carries a stencil attachment. */
37
+ readonly stencil: StencilAttachmentMode;
38
+ }
39
+ /**
40
+ * Snapshot of the pass currently open on a {@link RenderPassCoordinator}. The
41
+ * WebGPU coordinator exposes the live encoder alongside these fields from phase
42
+ * 12D; the shared shape lives here so both backends agree on it.
43
+ * @internal
44
+ */
45
+ export interface ActiveRenderPass {
46
+ readonly view: View;
47
+ readonly stencilEnabled: boolean;
48
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Whether a render pass carries a stencil attachment.
3
+ *
4
+ * WebGL2 stencil is ambient per-target GL state, so this flag is largely
5
+ * informational there; the WebGPU backend uses it to
6
+ * decide whether a pass descriptor needs a `depthStencilAttachment`.
7
+ * @internal
8
+ */
9
+ var StencilAttachmentMode;
10
+ (function (StencilAttachmentMode) {
11
+ StencilAttachmentMode[StencilAttachmentMode["None"] = 0] = "None";
12
+ StencilAttachmentMode[StencilAttachmentMode["Enabled"] = 1] = "Enabled";
13
+ })(StencilAttachmentMode || (StencilAttachmentMode = {}));
14
+
15
+ export { StencilAttachmentMode };
16
+ //# sourceMappingURL=RenderPassDescriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenderPassDescriptor.js","sources":["../../../../../src/rendering/pass/RenderPassDescriptor.ts"],"sourcesContent":[null],"names":[],"mappings":"AAKA;;;;;;;AAOG;IACS;AAAZ,CAAA,UAAY,qBAAqB,EAAA;AAC/B,IAAA,qBAAA,CAAA,qBAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAQ;AACR,IAAA,qBAAA,CAAA,qBAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAW;AACb,CAAC,EAHW,qBAAqB,KAArB,qBAAqB,GAAA,EAAA,CAAA,CAAA;;;;"}