@codexo/exojs 0.12.0 → 0.13.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 (101) hide show
  1. package/CHANGELOG.md +125 -0
  2. package/dist/esm/core/BuildInfo.js +2 -2
  3. package/dist/esm/extensions/Extension.d.ts +39 -7
  4. package/dist/esm/extensions/Extension.d.ts.map +1 -1
  5. package/dist/esm/extensions/ExtensionRegistry.d.ts.map +1 -1
  6. package/dist/esm/extensions/ExtensionRegistry.js.map +1 -1
  7. package/dist/esm/extensions/snapshot.d.ts +12 -2
  8. package/dist/esm/extensions/snapshot.d.ts.map +1 -1
  9. package/dist/esm/extensions/snapshot.js +43 -14
  10. package/dist/esm/extensions/snapshot.js.map +1 -1
  11. package/dist/esm/index.js +8 -0
  12. package/dist/esm/index.js.map +1 -1
  13. package/dist/esm/rendering/Drawable.d.ts +23 -0
  14. package/dist/esm/rendering/Drawable.d.ts.map +1 -1
  15. package/dist/esm/rendering/Drawable.js +34 -0
  16. package/dist/esm/rendering/Drawable.js.map +1 -1
  17. package/dist/esm/rendering/coreRendererBindings.d.ts.map +1 -1
  18. package/dist/esm/rendering/coreRendererBindings.js +22 -0
  19. package/dist/esm/rendering/coreRendererBindings.js.map +1 -1
  20. package/dist/esm/rendering/index.d.ts +13 -0
  21. package/dist/esm/rendering/index.d.ts.map +1 -1
  22. package/dist/esm/rendering/pixelSnap.d.ts +219 -0
  23. package/dist/esm/rendering/pixelSnap.d.ts.map +1 -0
  24. package/dist/esm/rendering/pixelSnap.js +186 -0
  25. package/dist/esm/rendering/pixelSnap.js.map +1 -0
  26. package/dist/esm/rendering/plan/RenderPlanPlayer.d.ts.map +1 -1
  27. package/dist/esm/rendering/plan/RenderPlanPlayer.js +21 -1
  28. package/dist/esm/rendering/plan/RenderPlanPlayer.js.map +1 -1
  29. package/dist/esm/rendering/sprite/NineSliceSprite.d.ts +69 -0
  30. package/dist/esm/rendering/sprite/NineSliceSprite.d.ts.map +1 -0
  31. package/dist/esm/rendering/sprite/NineSliceSprite.js +207 -0
  32. package/dist/esm/rendering/sprite/NineSliceSprite.js.map +1 -0
  33. package/dist/esm/rendering/sprite/RepeatingSprite.d.ts +120 -0
  34. package/dist/esm/rendering/sprite/RepeatingSprite.d.ts.map +1 -0
  35. package/dist/esm/rendering/sprite/RepeatingSprite.js +279 -0
  36. package/dist/esm/rendering/sprite/RepeatingSprite.js.map +1 -0
  37. package/dist/esm/rendering/sprite/Sprite.d.ts +13 -0
  38. package/dist/esm/rendering/sprite/Sprite.d.ts.map +1 -1
  39. package/dist/esm/rendering/sprite/Sprite.js +23 -0
  40. package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
  41. package/dist/esm/rendering/sprite/nineSlice.d.ts +53 -0
  42. package/dist/esm/rendering/sprite/nineSlice.d.ts.map +1 -0
  43. package/dist/esm/rendering/sprite/nineSlice.js +340 -0
  44. package/dist/esm/rendering/sprite/nineSlice.js.map +1 -0
  45. package/dist/esm/rendering/sprite/repeatingSpritePlan.d.ts +57 -0
  46. package/dist/esm/rendering/sprite/repeatingSpritePlan.d.ts.map +1 -0
  47. package/dist/esm/rendering/sprite/repeatingSpritePlan.js +156 -0
  48. package/dist/esm/rendering/sprite/repeatingSpritePlan.js.map +1 -0
  49. package/dist/esm/rendering/texture/TextureRegion.d.ts +100 -0
  50. package/dist/esm/rendering/texture/TextureRegion.d.ts.map +1 -0
  51. package/dist/esm/rendering/texture/TextureRegion.js +144 -0
  52. package/dist/esm/rendering/texture/TextureRegion.js.map +1 -0
  53. package/dist/esm/rendering/texture/repeat.d.ts +96 -0
  54. package/dist/esm/rendering/texture/repeat.d.ts.map +1 -0
  55. package/dist/esm/rendering/texture/repeat.js +158 -0
  56. package/dist/esm/rendering/texture/repeat.js.map +1 -0
  57. package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +20 -0
  58. package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts.map +1 -1
  59. package/dist/esm/rendering/webgl2/WebGl2Backend.js +31 -2
  60. package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
  61. package/dist/esm/rendering/webgl2/WebGl2NineSliceSpriteRenderer.d.ts +32 -0
  62. package/dist/esm/rendering/webgl2/WebGl2NineSliceSpriteRenderer.d.ts.map +1 -0
  63. package/dist/esm/rendering/webgl2/WebGl2NineSliceSpriteRenderer.js +308 -0
  64. package/dist/esm/rendering/webgl2/WebGl2NineSliceSpriteRenderer.js.map +1 -0
  65. package/dist/esm/rendering/webgl2/WebGl2RepeatingSpriteRenderer.d.ts +49 -0
  66. package/dist/esm/rendering/webgl2/WebGl2RepeatingSpriteRenderer.d.ts.map +1 -0
  67. package/dist/esm/rendering/webgl2/WebGl2RepeatingSpriteRenderer.js +535 -0
  68. package/dist/esm/rendering/webgl2/WebGl2RepeatingSpriteRenderer.js.map +1 -0
  69. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +9 -0
  70. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts.map +1 -1
  71. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +22 -2
  72. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
  73. package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +21 -1
  74. package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts.map +1 -1
  75. package/dist/esm/rendering/webgpu/WebGpuBackend.js +29 -2
  76. package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
  77. package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.d.ts +36 -0
  78. package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.d.ts.map +1 -0
  79. package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.js +358 -0
  80. package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.js.map +1 -0
  81. package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.d.ts +52 -0
  82. package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.d.ts.map +1 -0
  83. package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.js +556 -0
  84. package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.js.map +1 -0
  85. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +9 -0
  86. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts.map +1 -1
  87. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +22 -2
  88. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
  89. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts +3 -2
  90. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts.map +1 -1
  91. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js +4 -4
  92. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js.map +1 -1
  93. package/dist/esm/rendering.d.ts +1 -0
  94. package/dist/esm/rendering.d.ts.map +1 -1
  95. package/dist/esm/resources/Loader.d.ts +36 -8
  96. package/dist/esm/resources/Loader.d.ts.map +1 -1
  97. package/dist/esm/resources/Loader.js +30 -11
  98. package/dist/esm/resources/Loader.js.map +1 -1
  99. package/dist/exo.esm.js +3449 -59
  100. package/dist/exo.esm.js.map +1 -1
  101. package/package.json +10 -3
package/CHANGELOG.md CHANGED
@@ -12,6 +12,131 @@ merged pull requests and commits since the previous tag (each with its commit /
12
12
  PR link); `pnpm release:notes` then renders that section into the published
13
13
  GitHub release with a `PREVIOUS_TAG...CURRENT_TAG` compare link.
14
14
 
15
+ ## [0.13.0] - 2026-06-13
16
+
17
+ The scalable-sprites and tilemap release. `TextureRegion`, `NineSliceSprite`,
18
+ and `RepeatingSprite` bring nine-slice and tiled-repeat rendering to both
19
+ backends. `@codexo/exojs-tilemap` is introduced as a generic, format-independent
20
+ tilemap runtime foundation. `@codexo/exojs-tiled` is expanded from its v0.12
21
+ stub into the parsed Tiled source adapter and runtime conversion layer.
22
+
23
+ ### Added
24
+
25
+ - **Scalable sprites.** `NineSliceSprite` renders a texture subdivided into
26
+ nine regions (four corners, four edges, and a centre) with per-edge repeat
27
+ modes (`stretch`, `repeat`, `mirror-repeat`) and size fits (`clip`, `round`).
28
+ Dedicated WebGL2 and WebGPU instanced renderers batch by texture and blend
29
+ mode. Source slices and destination borders are independently configured
30
+ through `edgeFit` and `centerFit` (#110).
31
+
32
+ - **`RepeatingSprite`** tiles a `Texture` or `TextureRegion` across a target
33
+ area with independent `modeX`/`modeY` (`stretch`, `repeat`, `mirror-repeat`)
34
+ and `fitX`/`fitY` (`clip`, `round`). A bare `Texture` uses the shader/sampler
35
+ path; a `TextureRegion` uses the geometry path. Dedicated WebGL2 and WebGPU
36
+ renderers batch by texture and blend mode; sampler and strategy changes
37
+ create additional batch boundaries (#111).
38
+
39
+ - **`TextureRegion`.** An immutable structural type identifying a sub-rectangle
40
+ of a `Texture` without duplicating GPU resources. Used by nine-slice and
41
+ repeating sprites, tilemap tiles, and any consumer that operates on a
42
+ sub-area of an atlas (#109).
43
+
44
+ - **Render-only pixel snapping.** `Drawable.pixelSnapMode` accepts `none`,
45
+ `position`, or `geometry`, snapping only the visual transform without
46
+ disturbing the logical model. The effective mode degrades automatically for
47
+ non-axis-aligned sprites (#116).
48
+
49
+ - **TransformBuffer upload coalescing.** `RenderPlanPlayer` prepares all
50
+ transforms for a render scope before draw execution. The first renderer
51
+ flush uploads the stable transform range; subsequent flushes reuse it
52
+ through the hash guard, eliminating repeated uploads of growing ranges
53
+ within a scope (#118).
54
+
55
+ - **Renderer performance benchmark harness.** Structural metric sweep for
56
+ `Sprite`, `NineSliceSprite`, `RepeatingSprite`, and `Tilemap` renderers
57
+ (WebGL2, recording fake GL context for deterministic GPU-free metrics).
58
+ Profiling mode gated behind `EXOJS_PERF_PROFILE` (#117).
59
+
60
+ - **`@codexo/exojs-tilemap` — generic tilemap runtime.** `TileMap` manages
61
+ tilesets, layers, and mutation. `TileLayer` holds a sparse packed-tile array
62
+ with configurable chunk dimensions (default 32×32). `TileSet` indexes tile
63
+ definitions by local ID. Scene-graph nodes (`TileMapNode`, `TileLayerNode`)
64
+ provide per-pixel positioning with `Container` children, chunk-level culling,
65
+ and `TileMapBand` for actor interleaving. `TileMapView` maps layer selections
66
+ to bands declaratively. Chunk rendering uses instanced WebGL2 and WebGPU
67
+ renderers batched by compatible state and tileset texture. `ReadonlyTileChunk`
68
+ is the public immutable chunk view (#112, #114, #115).
69
+
70
+ - **`@codexo/exojs-tiled` — Tiled map format adapter.** Loads finite orthogonal
71
+ TMJ/TSJ maps through `Loader.load(TileMap, 'map.tmj')` for a ready-to-use
72
+ runtime `TileMap` or `Loader.load(TiledMap, 'map.tmj')` for the structured,
73
+ dependency-resolved source model. `TiledMap` resolves external tileset
74
+ references, validates the source against the Tiled schema, and exposes
75
+ `toTileMap()` for synchronous runtime conversion. Supports multiple tilesets
76
+ (external and embedded), tile flip flags, custom properties, and sub-URL
77
+ resolution. Ships `tiledExtension` for one-line setup (#113).
78
+
79
+ - **Extension descriptor dependencies.** The `Extension` interface accepts
80
+ `dependencies?: readonly Extension[]`. Each dependency references another
81
+ extension descriptor object. Dependencies are materialised before dependents;
82
+ the snapshot resolver deduplicates the same descriptor object, rejects
83
+ same-ID/different-object conflicts, and detects cycles. This ensures
84
+ `@codexo/exojs-tiled`'s tilemap foundation is loaded before Tiled bindings
85
+ are registered (#107).
86
+
87
+ - **Typed declarative asset bindings.** `AssetBinding<Result, Options>` and
88
+ `AssetHandler<Result, Options>` carry typed result and option generics.
89
+ Handlers may provide `getIdentityKey(request)` to define deterministic
90
+ result-sensitive cache identity. The `Loader.load(type, path)` overloads
91
+ return the declared `Result` type without manual casting (#108).
92
+
93
+ ### Fixed
94
+
95
+ - **Extension package CI path coverage.** A PR touching only extension-package
96
+ source no longer skips the unit, package-verify, and browser lanes (#120).
97
+
98
+ - **Package ESLint hardening.** Extension package source files are linted
99
+ with typed `@typescript-eslint` rules through `projectService`, resolving
100
+ the prior exit-code-2 crash. Package lint is enforced in CI alongside root
101
+ lint. Genuine import-sorting and type-annotation lint defects in extension
102
+ tests are fixed.
103
+
104
+ - **API documentation synchronisation.** `site/scripts/build-api.ts` now
105
+ processes `@codexo/exojs-tilemap` alongside the other official extension
106
+ packages. The `tilemap` subsystem appears in the API index and content
107
+ collection schema. A deterministic `docs:api:check` command verifies that
108
+ committed API docs match a fresh generation from source.
109
+
110
+ ### Known Limitations
111
+
112
+ - **Infinite Tiled maps** are parsed but not converted to runtime `TileMap`
113
+ instances (internal chunk grid requires finite bounds).
114
+ - **Object/image/group layers** parse correctly but do not produce rendered
115
+ scene nodes — only tile layers are converted.
116
+ - **Tilemap atlas bleeding** may occur at tile edges with linear or mipmap
117
+ texture filtering when atlas tile regions lack sufficient padding or
118
+ extrusion, causing neighbouring texel bleeding.
119
+ - **No runtime autotiling.** Tiled terrain/wang sets are not evaluated.
120
+ - **Single-texture batching.** NineSlice, RepeatingSprite, and Tilemap
121
+ renderers support different textures, but they do not combine several
122
+ textures into a single multi-texture draw batch. Texture changes therefore
123
+ create batch boundaries. For RepeatingSprite, sampler and strategy changes
124
+ also create batch boundaries. For Tilemap, batches are grouped by compatible
125
+ state and tileset texture.
126
+
127
+ ### Package Graph
128
+
129
+ After this release the published lockstep package set is:
130
+
131
+ ```
132
+ @codexo/exojs 0.13.0
133
+ @codexo/exojs-particles 0.13.0 (peer @codexo/exojs 0.13.x)
134
+ @codexo/exojs-tilemap 0.13.0 (peer @codexo/exojs 0.13.x)
135
+ @codexo/exojs-tiled 0.13.0 (peer @codexo/exojs 0.13.x, dep @codexo/exojs-tilemap 0.13.0)
136
+ ```
137
+
138
+ `create-exo-app` is independently versioned and not in engine lockstep.
139
+
15
140
  ## [0.12.0] - 2026-06-09
16
141
 
17
142
  The rendering-architecture and extension-system release. A composable,
@@ -1,6 +1,6 @@
1
1
  const buildInfo = Object.freeze({
2
- version: "0.12.0",
3
- revision: "599bc56",
2
+ version: "0.13.0",
3
+ revision: "735089b",
4
4
  development: false,
5
5
  });
6
6
 
@@ -4,12 +4,17 @@ import type { DrawableConstructor, Renderer } from '#rendering/Renderer';
4
4
  import type { AssetConstructor } from '#resources/FactoryRegistry';
5
5
  import type { AssetLoaderContext, Loader } from '#resources/Loader';
6
6
  /**
7
- * Per-load request passed to {@link AssetHandler.load}.
7
+ * Per-load request passed to {@link AssetHandler.load} and
8
+ * {@link AssetHandler.getIdentityKey}.
9
+ *
10
+ * `Options` is `undefined` by default — a handler without typed options receives
11
+ * `request.options: undefined`. A handler with typed options receives
12
+ * `request.options: Options | undefined` (options remain optional even when typed).
8
13
  * @advanced
9
14
  */
10
- export interface AssetLoadRequest {
15
+ export interface AssetLoadRequest<Options = undefined> {
11
16
  readonly source: string;
12
- readonly options?: Readonly<Record<string, unknown>>;
17
+ readonly options?: Options;
13
18
  }
14
19
  /**
15
20
  * A loader-local instance produced by {@link AssetBinding.create}; owned and destroyed
@@ -18,8 +23,26 @@ export interface AssetLoadRequest {
18
23
  * NOT by this handler or the asset returned by `load`.
19
24
  * @advanced
20
25
  */
21
- export interface AssetHandler<Result = unknown> {
22
- load(request: AssetLoadRequest, context: AssetLoaderContext): Promise<Result>;
26
+ export interface AssetHandler<Result = unknown, Options = undefined> {
27
+ /**
28
+ * Returns the deterministic identity key used for in-flight deduplication and
29
+ * loaded-resource reuse (and cache/resource-store identity where applicable).
30
+ *
31
+ * Include every option that **changes the produced resource** (format, locale,
32
+ * variant, color space, decoding mode, strictness when it affects output).
33
+ * Exclude control-only values that do not alter the resource (callbacks,
34
+ * `AbortSignal`, logger, request priority, timeout).
35
+ *
36
+ * Do **not** use `JSON.stringify(request.options)` — property-order instability,
37
+ * control-only field inclusion, and unbounded key size make it unsuitable.
38
+ * Explicitly select the identity-relevant fields instead.
39
+ *
40
+ * The Loader namespaces the key with the asset type, so the returned string may
41
+ * be type-local. Omit this hook to use the default (source-only) identity.
42
+ * @advanced
43
+ */
44
+ getIdentityKey?(request: AssetLoadRequest<Options>): string;
45
+ load(request: AssetLoadRequest<Options>, context: AssetLoaderContext): Promise<Result>;
23
46
  destroy?(): void;
24
47
  }
25
48
  /**
@@ -41,9 +64,17 @@ export interface RendererBinding<Target extends Drawable = Drawable> {
41
64
  * `create(loader)` is called once per Loader at Application construction, producing
42
65
  * an {@link AssetHandler} instance that the Loader owns for its entire lifetime.
43
66
  * The handler may hold loader-local state (Workers, WASM modules, parsed caches).
67
+ *
68
+ * `Result` is the produced asset instance type (e.g. `TileMap`). `Options` is the
69
+ * typed options object, defaulting to `undefined` (no options). The runtime `type`
70
+ * field must be a constructor that produces `Result`; the handler returned by
71
+ * `create` must also produce `Result` — both relationships are enforced by TypeScript.
72
+ *
73
+ * Use `satisfies AssetBinding<MyAsset, MyLoadOptions>` on an object literal to get
74
+ * typed options in the handler and enforce the result type without repeating it.
44
75
  * @advanced
45
76
  */
46
- export interface AssetBinding<Result = unknown> {
77
+ export interface AssetBinding<Result = unknown, Options = undefined> {
47
78
  readonly type: AssetConstructor<Result>;
48
79
  /**
49
80
  * Config-map type names that resolve to this handler, e.g. `['tiledMap']`.
@@ -53,7 +84,7 @@ export interface AssetBinding<Result = unknown> {
53
84
  */
54
85
  readonly typeNames?: readonly string[];
55
86
  readonly extensions?: readonly string[];
56
- create(loader: Loader): AssetHandler<Result>;
87
+ create(loader: Loader): AssetHandler<Result, Options>;
57
88
  }
58
89
  /**
59
90
  * An ExoJS extension: an immutable descriptor that contributes renderer bindings
@@ -64,6 +95,7 @@ export interface AssetBinding<Result = unknown> {
64
95
  */
65
96
  export interface Extension {
66
97
  readonly id: string;
98
+ readonly dependencies?: readonly Extension[];
67
99
  readonly renderers?: readonly RendererBinding[];
68
100
  readonly assets?: readonly AssetBinding[];
69
101
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Extension.d.ts","sourceRoot":"","sources":["../../../src/extensions/Extension.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEpE;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtD;AAED;;;;;;GAMG;AACH,MAAM,WAAW,YAAY,CAAC,MAAM,GAAG,OAAO;IAC5C,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9E,OAAO,CAAC,IAAI,IAAI,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe,CAAC,MAAM,SAAS,QAAQ,GAAG,QAAQ;IACjE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7D,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CAC7E;AAED;;;;;;GAMG;AACH,MAAM,WAAW,YAAY,CAAC,MAAM,GAAG,OAAO;IAC5C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACxC;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;CAC9C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IAChD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;CAC3C"}
1
+ {"version":3,"file":"Extension.d.ts","sourceRoot":"","sources":["../../../src/extensions/Extension.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEpE;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB,CAAC,OAAO,GAAG,SAAS;IACnD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,YAAY,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,SAAS;IACjE;;;;;;;;;;;;;;;;OAgBG;IACH,cAAc,CAAC,CAAC,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;IAC5D,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvF,OAAO,CAAC,IAAI,IAAI,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe,CAAC,MAAM,SAAS,QAAQ,GAAG,QAAQ;IACjE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7D,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CAC7E;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,YAAY,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,SAAS;IACjE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACxC;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvD;AAED;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IAChD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;CAC3C"}
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionRegistry.d.ts","sourceRoot":"","sources":["../../../src/extensions/ExtensionRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAOnE,uEAAuE;AACvE,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C;AAED,gBAAgB;AAChB,wBAAgB,yBAAyB,IAAI,iBAAiB,CAS7D;AAED;;;;;;;;GAQG;AACH,qBAAa,iBAAiB;IAC5B,OAAO;IAEP;;;;OAIG;WACW,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAyClD,8DAA8D;WAChD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAItC,0DAA0D;WAC5C,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,SAAS;IAI9D;;;;OAIG;WACW,IAAI,IAAI,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;CAGzD"}
1
+ {"version":3,"file":"ExtensionRegistry.d.ts","sourceRoot":"","sources":["../../../src/extensions/ExtensionRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAiB,KAAK,iBAAiB,EAAmB,MAAM,YAAY,CAAC;AAOpF,uEAAuE;AACvE,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C;AAED,gBAAgB;AAChB,wBAAgB,yBAAyB,IAAI,iBAAiB,CAS7D;AAED;;;;;;;;GAQG;AACH,qBAAa,iBAAiB;IAC5B,OAAO;IAEP;;;;OAIG;WACW,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAoBlD,8DAA8D;WAChD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAItC,0DAA0D;WAC5C,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,SAAS;IAI9D;;;;OAIG;WACW,IAAI,IAAI,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;CAGzD"}
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionRegistry.js","sources":["../../../../src/extensions/ExtensionRegistry.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAGA;AACA,IAAI,KAAK,GAAG,IAAI,GAAG,EAAqB;AACxC,IAAI,SAAS,GAAG,CAAC;AACjB,IAAI,MAAqE;AASzE;SACgB,yBAAyB,GAAA;AACvC,IAAA,IAAI,MAAM,EAAE,QAAQ,KAAK,SAAS,EAAE;QAClC,OAAO,MAAM,CAAC,QAAQ;IACxB;AAEA,IAAA,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACnD,MAAM,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE;AAE1C,IAAA,OAAO,QAAQ;AACjB;AAEA;;;;;;;;AAQG;MACU,iBAAiB,CAAA;AAC5B,IAAA,WAAA,GAAA,EAAuB;AAEvB;;;;AAIG;IACI,OAAO,QAAQ,CAAC,SAAoB,EAAA;QACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;AAExC,QAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,IAAI,QAAQ,KAAK,SAAS;gBAAE;AAC5B,YAAA,MAAM,IAAI,KAAK,CACb,yBAAyB,SAAS,CAAC,EAAE,CAAA,qDAAA,CAAuD;AAC1F,gBAAA,CAAA,wGAAA,CAA0G,CAC7G;QACH;QAEA,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC;AAClC,QAAA,SAAS,EAAE;QACX,MAAM,GAAG,SAAS;IA0BpB;;IAGO,OAAO,GAAG,CAAC,EAAU,EAAA;AAC1B,QAAA,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACtB;;IAGO,OAAO,GAAG,CAAC,EAAU,EAAA;AAC1B,QAAA,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACtB;AAEA;;;;AAIG;AACI,IAAA,OAAO,IAAI,GAAA;AAChB,QAAA,OAAO,yBAAyB,EAAE,CAAC,UAAU;IAC/C;AACD;;;;"}
1
+ {"version":3,"file":"ExtensionRegistry.js","sources":["../../../../src/extensions/ExtensionRegistry.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAGA;AACA,IAAI,KAAK,GAAG,IAAI,GAAG,EAAqB;AACxC,IAAI,SAAS,GAAG,CAAC;AACjB,IAAI,MAAqE;AASzE;SACgB,yBAAyB,GAAA;AACvC,IAAA,IAAI,MAAM,EAAE,QAAQ,KAAK,SAAS,EAAE;QAClC,OAAO,MAAM,CAAC,QAAQ;IACxB;AAEA,IAAA,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACnD,MAAM,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE;AAE1C,IAAA,OAAO,QAAQ;AACjB;AAEA;;;;;;;;AAQG;MACU,iBAAiB,CAAA;AAC5B,IAAA,WAAA,GAAA,EAAuB;AAEvB;;;;AAIG;IACI,OAAO,QAAQ,CAAC,SAAoB,EAAA;QACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;AAExC,QAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,IAAI,QAAQ,KAAK,SAAS;gBAAE;AAC5B,YAAA,MAAM,IAAI,KAAK,CACb,yBAAyB,SAAS,CAAC,EAAE,CAAA,qDAAA,CAAuD;AAC1F,gBAAA,CAAA,wGAAA,CAA0G,CAC7G;QACH;QAEA,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC;AAClC,QAAA,SAAS,EAAE;QACX,MAAM,GAAG,SAAS;IAKpB;;IAGO,OAAO,GAAG,CAAC,EAAU,EAAA;AAC1B,QAAA,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACtB;;IAGO,OAAO,GAAG,CAAC,EAAU,EAAA;AAC1B,QAAA,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACtB;AAEA;;;;AAIG;AACI,IAAA,OAAO,IAAI,GAAA;AAChB,QAAA,OAAO,yBAAyB,EAAE,CAAC,UAAU;IAC/C;AACD;;;;"}
@@ -7,8 +7,18 @@ export interface ExtensionSnapshot {
7
7
  declare const emptySnapshot: ExtensionSnapshot;
8
8
  export { emptySnapshot as EMPTY_SNAPSHOT };
9
9
  /**
10
- * Flatten an ordered extension list into a snapshot.
11
- * De-duplicates same-id/same-object entries; throws on same-id/different-object.
10
+ * Freeze an extension descriptor and its nested arrays in development builds.
11
+ * Idempotent safe to call on already-frozen descriptors.
12
+ * Called from buildSnapshot (every visited extension) so global and local
13
+ * descriptors receive consistent treatment.
14
+ * @param ext — the descriptor to freeze
15
+ * @internal
16
+ */
17
+ export declare function freezeExtension(ext: Extension): void;
18
+ /**
19
+ * Flatten an ordered extension list into a snapshot using stable depth-first
20
+ * post-order traversal. Dependencies are materialised before their dependents.
21
+ * De-duplicates same-object entries; throws on same-id/different-object or cycles.
12
22
  * Binding-level conflicts are checked per Application at materialisation time.
13
23
  * @internal
14
24
  */
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../../src/extensions/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG5E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;CAC1C;AAGD,QAAA,MAAM,aAAa,EAAE,iBAInB,CAAC;AAEH,OAAO,EAAE,aAAa,IAAI,cAAc,EAAE,CAAC;AAE3C;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,iBAAiB,CAuC5E"}
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../../src/extensions/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG5E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;CAC1C;AAGD,QAAA,MAAM,aAAa,EAAE,iBAInB,CAAC;AAEH,OAAO,EAAE,aAAa,IAAI,cAAc,EAAE,CAAC;AAE3C;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAmCpD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,iBAAiB,CA+E5E"}
@@ -5,8 +5,9 @@ const emptySnapshot = Object.freeze({
5
5
  assets: Object.freeze([]),
6
6
  });
7
7
  /**
8
- * Flatten an ordered extension list into a snapshot.
9
- * De-duplicates same-id/same-object entries; throws on same-id/different-object.
8
+ * Flatten an ordered extension list into a snapshot using stable depth-first
9
+ * post-order traversal. Dependencies are materialised before their dependents.
10
+ * De-duplicates same-object entries; throws on same-id/different-object or cycles.
10
11
  * Binding-level conflicts are checked per Application at materialisation time.
11
12
  * @internal
12
13
  */
@@ -14,19 +15,47 @@ function buildSnapshot(input) {
14
15
  if (input.length === 0) {
15
16
  return emptySnapshot;
16
17
  }
17
- const seenById = new Map();
18
- const extensions = [];
18
+ const byId = new Map();
19
+ const visiting = new Set();
20
+ const visited = new Set();
21
+ const stack = [];
22
+ const ordered = [];
23
+ function visit(ext) {
24
+ // (1) Reserve ID + mismatch check FIRST — before dependency traversal.
25
+ // This catches nested same-id/different-object descriptors immediately.
26
+ const existing = byId.get(ext.id);
27
+ if (existing !== undefined && existing !== ext) {
28
+ throw new Error(`Extension "${ext.id}" was provided by multiple descriptor objects.`);
29
+ }
30
+ if (existing === undefined) {
31
+ byId.set(ext.id, ext);
32
+ }
33
+ // (2) Already fully processed — diamond / shared dependency.
34
+ if (visited.has(ext))
35
+ return;
36
+ // (3) Back-edge in current DFS stack — cycle.
37
+ if (visiting.has(ext)) {
38
+ const cyclePath = [...stack.slice(stack.indexOf(ext)), ext].map(e => e.id).join(' → ');
39
+ throw new Error(`Extension dependency cycle detected: ${cyclePath}`);
40
+ }
41
+ // (4) Recurse into dependencies (post-order: deps before this extension).
42
+ visiting.add(ext);
43
+ stack.push(ext);
44
+ for (const dep of ext.dependencies ?? []) {
45
+ visit(dep);
46
+ }
47
+ stack.pop();
48
+ visiting.delete(ext);
49
+ // (5) Finalise — remove from in-progress, mark as fully processed, push to output.
50
+ visited.add(ext);
51
+ ordered.push(ext);
52
+ }
53
+ for (const ext of input)
54
+ visit(ext);
55
+ // Flatten in topological (post-order) order — deps before dependents.
19
56
  const renderers = [];
20
57
  const assets = [];
21
- for (const ext of input) {
22
- const existing = seenById.get(ext.id);
23
- if (existing !== undefined) {
24
- if (existing === ext)
25
- continue;
26
- throw new Error(`Duplicate extension id "${ext.id}" with a different descriptor in the provided extensions list.`);
27
- }
28
- seenById.set(ext.id, ext);
29
- extensions.push(ext);
58
+ for (const ext of ordered) {
30
59
  if (ext.renderers) {
31
60
  for (const binding of ext.renderers) {
32
61
  renderers.push(binding);
@@ -39,7 +68,7 @@ function buildSnapshot(input) {
39
68
  }
40
69
  }
41
70
  return Object.freeze({
42
- extensions: Object.freeze(extensions),
71
+ extensions: Object.freeze(ordered),
43
72
  renderers: Object.freeze(renderers),
44
73
  assets: Object.freeze(assets),
45
74
  });
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.js","sources":["../../../../src/extensions/snapshot.ts"],"sourcesContent":[null],"names":[],"mappings":"AASA;AACA,MAAM,aAAa,GAAsB,MAAM,CAAC,MAAM,CAAC;AACrD,IAAA,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AAC7B,IAAA,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AAC5B,IAAA,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AAC1B,CAAA;AAID;;;;;AAKG;AACG,SAAU,aAAa,CAAC,KAA2B,EAAA;AACvD,IAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,QAAA,OAAO,aAAa;IACtB;AAEA,IAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqB;IAC7C,MAAM,UAAU,GAAgB,EAAE;IAClC,MAAM,SAAS,GAAsB,EAAE;IACvC,MAAM,MAAM,GAAmB,EAAE;AAEjC,IAAA,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;QACvB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;AAErC,QAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,IAAI,QAAQ,KAAK,GAAG;gBAAE;YACtB,MAAM,IAAI,KAAK,CAAC,CAAA,wBAAA,EAA2B,GAAG,CAAC,EAAE,CAAA,8DAAA,CAAgE,CAAC;QACpH;QAEA,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;AACzB,QAAA,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;AAEpB,QAAA,IAAI,GAAG,CAAC,SAAS,EAAE;AACjB,YAAA,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,SAAS,EAAE;AACnC,gBAAA,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;YACzB;QACF;AAEA,QAAA,IAAI,GAAG,CAAC,MAAM,EAAE;AACd,YAAA,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE;AAChC,gBAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YACtB;QACF;IACF;IAEA,OAAO,MAAM,CAAC,MAAM,CAAC;AACnB,QAAA,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;AACrC,QAAA,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;AACnC,QAAA,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;AAC9B,KAAA,CAAC;AACJ;;;;"}
1
+ {"version":3,"file":"snapshot.js","sources":["../../../../src/extensions/snapshot.ts"],"sourcesContent":[null],"names":[],"mappings":"AASA;AACA,MAAM,aAAa,GAAsB,MAAM,CAAC,MAAM,CAAC;AACrD,IAAA,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AAC7B,IAAA,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AAC5B,IAAA,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AAC1B,CAAA;AAiDD;;;;;;AAMG;AACG,SAAU,aAAa,CAAC,KAA2B,EAAA;AACvD,IAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,QAAA,OAAO,aAAa;IACtB;AAEA,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAqB;AACzC,IAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAa;AACrC,IAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAa;IACpC,MAAM,KAAK,GAAgB,EAAE;IAC7B,MAAM,OAAO,GAAgB,EAAE;IAE/B,SAAS,KAAK,CAAC,GAAc,EAAA;;;QAG3B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAEjC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,GAAG,EAAE;YAC9C,MAAM,IAAI,KAAK,CAAC,CAAA,WAAA,EAAc,GAAG,CAAC,EAAE,CAAA,8CAAA,CAAgD,CAAC;QACvF;AAEA,QAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC;QACvB;;AAGA,QAAA,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE;;AAGtB,QAAA,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACrB,YAAA,MAAM,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;AACtF,YAAA,MAAM,IAAI,KAAK,CAAC,wCAAwC,SAAS,CAAA,CAAE,CAAC;QACtE;;AAGA,QAAA,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;AACjB,QAAA,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;QAEf,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,YAAY,IAAI,EAAE,EAAE;YACxC,KAAK,CAAC,GAAG,CAAC;QACZ;QAEA,KAAK,CAAC,GAAG,EAAE;AACX,QAAA,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC;;AAGpB,QAAA,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;AAChB,QAAA,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;IAMnB;IAEA,KAAK,MAAM,GAAG,IAAI,KAAK;QAAE,KAAK,CAAC,GAAG,CAAC;;IAGnC,MAAM,SAAS,GAAsB,EAAE;IACvC,MAAM,MAAM,GAAmB,EAAE;AAEjC,IAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AACzB,QAAA,IAAI,GAAG,CAAC,SAAS,EAAE;AACjB,YAAA,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,SAAS,EAAE;AACnC,gBAAA,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;YACzB;QACF;AAEA,QAAA,IAAI,GAAG,CAAC,MAAM,EAAE;AACd,YAAA,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE;AAChC,gBAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YACtB;QACF;IACF;IAEA,OAAO,MAAM,CAAC,MAAM,CAAC;AACnB,QAAA,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;AAClC,QAAA,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;AACnC,QAAA,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;AAC9B,KAAA,CAAC;AACJ;;;;"}
package/dist/esm/index.js CHANGED
@@ -121,6 +121,8 @@ export { ShaderAttribute } from './rendering/shader/ShaderAttribute.js';
121
121
  export { ShaderUniform } from './rendering/shader/ShaderUniform.js';
122
122
  export { upgradeFragmentShaderToGl300 } from './rendering/shader/upgradeFragmentShaderToGl300.js';
123
123
  export { AnimatedSprite } from './rendering/sprite/AnimatedSprite.js';
124
+ export { NineSliceSprite } from './rendering/sprite/NineSliceSprite.js';
125
+ export { RepeatingSprite } from './rendering/sprite/RepeatingSprite.js';
124
126
  export { Sprite, SpriteFlags } from './rendering/sprite/Sprite.js';
125
127
  export { Spritesheet } from './rendering/sprite/Spritesheet.js';
126
128
  export { AbstractText } from './rendering/text/AbstractText.js';
@@ -134,14 +136,18 @@ export { buildTextPageQuads, layoutText, measureText } from './rendering/text/Te
134
136
  export { TextStyle } from './rendering/text/TextStyle.js';
135
137
  export { DataTexture } from './rendering/texture/DataTexture.js';
136
138
  export { RenderTexture } from './rendering/texture/RenderTexture.js';
139
+ export { planRepeat } from './rendering/texture/repeat.js';
137
140
  export { Sampler } from './rendering/texture/Sampler.js';
138
141
  export { Texture } from './rendering/texture/Texture.js';
142
+ export { TextureRegion } from './rendering/texture/TextureRegion.js';
139
143
  export { Video } from './rendering/video/Video.js';
140
144
  export { AbstractWebGl2BatchedRenderer } from './rendering/webgl2/AbstractWebGl2BatchedRenderer.js';
141
145
  export { AbstractWebGl2Renderer } from './rendering/webgl2/AbstractWebGl2Renderer.js';
142
146
  export { WebGl2Backend } from './rendering/webgl2/WebGl2Backend.js';
143
147
  export { WebGl2MeshRenderer } from './rendering/webgl2/WebGl2MeshRenderer.js';
148
+ export { WebGl2NineSliceSpriteRenderer } from './rendering/webgl2/WebGl2NineSliceSpriteRenderer.js';
144
149
  export { WebGl2RenderBuffer } from './rendering/webgl2/WebGl2RenderBuffer.js';
150
+ export { WebGl2RepeatingSpriteRenderer } from './rendering/webgl2/WebGl2RepeatingSpriteRenderer.js';
145
151
  export { WebGl2ShaderBlock } from './rendering/webgl2/WebGl2ShaderBlock.js';
146
152
  export { webGl2PrimitiveArrayConstructors, webGl2PrimitiveByteSizeMapping, webGl2PrimitiveTypeNames } from './rendering/webgl2/WebGl2ShaderMappings.js';
147
153
  export { createWebGl2ShaderProgram } from './rendering/webgl2/WebGl2ShaderProgram.js';
@@ -154,6 +160,8 @@ export { WebGpuStorageBuffer } from './rendering/webgpu/compute/WebGpuStorageBuf
154
160
  export { WebGpuBackend } from './rendering/webgpu/WebGpuBackend.js';
155
161
  export { getWebGpuBlendState } from './rendering/webgpu/WebGpuBlendState.js';
156
162
  export { WebGpuMeshRenderer } from './rendering/webgpu/WebGpuMeshRenderer.js';
163
+ export { WebGpuNineSliceSpriteRenderer } from './rendering/webgpu/WebGpuNineSliceSpriteRenderer.js';
164
+ export { WebGpuRepeatingSpriteRenderer } from './rendering/webgpu/WebGpuRepeatingSpriteRenderer.js';
157
165
  export { WebGpuSpriteRenderer } from './rendering/webgpu/WebGpuSpriteRenderer.js';
158
166
  export { WebGpuTextRenderer } from './rendering/webgpu/WebGpuTextRenderer.js';
159
167
  export { AbstractAssetFactory } from './resources/AbstractAssetFactory.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,5 +1,6 @@
1
1
  import { Color } from '#core/Color';
2
2
  import type { RenderPlanBuilder } from '#rendering/plan/RenderPlanBuilder';
3
+ import { type PixelSnapMode } from './pixelSnap';
3
4
  import { RenderNode } from './RenderNode';
4
5
  import { BlendModes } from './types';
5
6
  /**
@@ -12,10 +13,32 @@ import { BlendModes } from './types';
12
13
  export declare class Drawable extends RenderNode {
13
14
  private _tint;
14
15
  private _blendMode;
16
+ private _pixelSnapMode;
15
17
  get tint(): Color;
16
18
  set tint(tint: Color);
17
19
  get blendMode(): BlendModes;
18
20
  set blendMode(blendMode: BlendModes);
21
+ /**
22
+ * Render-only pixel-snapping policy for this drawable. Aligns the rendered
23
+ * origin (`'position'`) or origin plus shared geometry boundaries
24
+ * (`'geometry'`) to the active render target's device-pixel grid. Purely
25
+ * visual: logical `x`/`y`, transforms, bounds, collision, tween and physics
26
+ * state are never affected, and {@link getBounds}/{@link getGlobalTransform}
27
+ * keep returning logical values.
28
+ *
29
+ * `'geometry'` is guaranteed only for axis-aligned transforms; rotation or
30
+ * skew (on this node, an ancestor, or the view) downgrade it to `'position'`
31
+ * for the affected frame, with no logical-state change. Snapping targets
32
+ * device pixels (× view scale × pixel ratio), not integer world units.
33
+ *
34
+ * Setting the current value is a no-op. Setting a value outside the
35
+ * {@link PixelSnapMode} union throws and leaves the prior mode unchanged.
36
+ *
37
+ * @default 'none'
38
+ * @stable
39
+ */
40
+ get pixelSnapMode(): PixelSnapMode;
41
+ set pixelSnapMode(mode: PixelSnapMode);
19
42
  /**
20
43
  * Set the tint colour by copying `color` into the internal {@link Color} instance.
21
44
  * Invalidates the render cache so the change is picked up on the next frame.
@@ -1 +1 @@
1
- {"version":3,"file":"Drawable.d.ts","sourceRoot":"","sources":["../../../src/rendering/Drawable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC;;;;;;GAMG;AACH,qBAAa,QAAS,SAAQ,UAAU;IACtC,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,UAAU,CAAiC;IAEnD,IAAW,IAAI,IAAI,KAAK,CAEvB;IAED,IAAW,IAAI,CAAC,IAAI,EAAE,KAAK,EAE1B;IAED,IAAW,SAAS,IAAI,UAAU,CAEjC;IAED,IAAW,SAAS,CAAC,SAAS,EAAE,UAAU,EAEzC;IAED;;;OAGG;IACI,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IASlC;;;OAGG;IACI,YAAY,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI;IAShD,gBAAgB;cACG,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAIpE,gBAAgB;IACA,wBAAwB,IAAI,OAAO;IAInD,gBAAgB;IACA,uBAAuB,IAAI,UAAU;IAIrC,OAAO,IAAI,IAAI;CAKhC"}
1
+ {"version":3,"file":"Drawable.d.ts","sourceRoot":"","sources":["../../../src/rendering/Drawable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAE3E,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC;;;;;;GAMG;AACH,qBAAa,QAAS,SAAQ,UAAU;IACtC,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,cAAc,CAAyB;IAE/C,IAAW,IAAI,IAAI,KAAK,CAEvB;IAED,IAAW,IAAI,CAAC,IAAI,EAAE,KAAK,EAE1B;IAED,IAAW,SAAS,IAAI,UAAU,CAEjC;IAED,IAAW,SAAS,CAAC,SAAS,EAAE,UAAU,EAEzC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,IAAW,aAAa,IAAI,aAAa,CAExC;IAED,IAAW,aAAa,CAAC,IAAI,EAAE,aAAa,EAW3C;IAED;;;OAGG;IACI,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IASlC;;;OAGG;IACI,YAAY,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI;IAShD,gBAAgB;cACG,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAIpE,gBAAgB;IACA,wBAAwB,IAAI,OAAO;IAInD,gBAAgB;IACA,uBAAuB,IAAI,UAAU;IAIrC,OAAO,IAAI,IAAI;CAKhC"}
@@ -1,4 +1,5 @@
1
1
  import { Color } from '../core/Color.js';
2
+ import { isPixelSnapMode } from './pixelSnap.js';
2
3
  import { RenderNode } from './RenderNode.js';
3
4
  import { BlendModes } from './types.js';
4
5
 
@@ -12,6 +13,7 @@ import { BlendModes } from './types.js';
12
13
  class Drawable extends RenderNode {
13
14
  _tint = Color.white.clone();
14
15
  _blendMode = BlendModes.Normal;
16
+ _pixelSnapMode = 'none';
15
17
  get tint() {
16
18
  return this._tint;
17
19
  }
@@ -24,6 +26,38 @@ class Drawable extends RenderNode {
24
26
  set blendMode(blendMode) {
25
27
  this.setBlendMode(blendMode);
26
28
  }
29
+ /**
30
+ * Render-only pixel-snapping policy for this drawable. Aligns the rendered
31
+ * origin (`'position'`) or origin plus shared geometry boundaries
32
+ * (`'geometry'`) to the active render target's device-pixel grid. Purely
33
+ * visual: logical `x`/`y`, transforms, bounds, collision, tween and physics
34
+ * state are never affected, and {@link getBounds}/{@link getGlobalTransform}
35
+ * keep returning logical values.
36
+ *
37
+ * `'geometry'` is guaranteed only for axis-aligned transforms; rotation or
38
+ * skew (on this node, an ancestor, or the view) downgrade it to `'position'`
39
+ * for the affected frame, with no logical-state change. Snapping targets
40
+ * device pixels (× view scale × pixel ratio), not integer world units.
41
+ *
42
+ * Setting the current value is a no-op. Setting a value outside the
43
+ * {@link PixelSnapMode} union throws and leaves the prior mode unchanged.
44
+ *
45
+ * @default 'none'
46
+ * @stable
47
+ */
48
+ get pixelSnapMode() {
49
+ return this._pixelSnapMode;
50
+ }
51
+ set pixelSnapMode(mode) {
52
+ if (mode === this._pixelSnapMode) {
53
+ return;
54
+ }
55
+ if (!isPixelSnapMode(mode)) {
56
+ throw new Error(`Drawable.pixelSnapMode must be 'none', 'position', or 'geometry' (got ${String(mode)}).`);
57
+ }
58
+ this._pixelSnapMode = mode;
59
+ this.invalidateCache();
60
+ }
27
61
  /**
28
62
  * Set the tint colour by copying `color` into the internal {@link Color} instance.
29
63
  * Invalidates the render cache so the change is picked up on the next frame.
@@ -1 +1 @@
1
- {"version":3,"file":"Drawable.js","sources":["../../../../src/rendering/Drawable.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAMA;;;;;;AAMG;AACG,MAAO,QAAS,SAAQ,UAAU,CAAA;AAC9B,IAAA,KAAK,GAAU,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;AAClC,IAAA,UAAU,GAAe,UAAU,CAAC,MAAM;AAElD,IAAA,IAAW,IAAI,GAAA;QACb,OAAO,IAAI,CAAC,KAAK;IACnB;IAEA,IAAW,IAAI,CAAC,IAAW,EAAA;AACzB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IACpB;AAEA,IAAA,IAAW,SAAS,GAAA;QAClB,OAAO,IAAI,CAAC,UAAU;IACxB;IAEA,IAAW,SAAS,CAAC,SAAqB,EAAA;AACxC,QAAA,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;IAC9B;AAEA;;;AAGG;AACI,IAAA,OAAO,CAAC,KAAY,EAAA;QACzB,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YACtB,IAAI,CAAC,eAAe,EAAE;QACxB;AAEA,QAAA,OAAO,IAAI;IACb;AAEA;;;AAGG;AACI,IAAA,YAAY,CAAC,SAAqB,EAAA;AACvC,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE;AACjC,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS;YAC3B,IAAI,CAAC,eAAe,EAAE;QACxB;AAEA,QAAA,OAAO,IAAI;IACb;;AAGmB,IAAA,eAAe,CAAC,OAA0B,EAAA;AAC3D,QAAA,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;IACxB;;IAGgB,wBAAwB,GAAA;AACtC,QAAA,OAAO,IAAI;IACb;;IAGgB,uBAAuB,GAAA;QACrC,OAAO,IAAI,CAAC,UAAU;IACxB;IAEgB,OAAO,GAAA;QACrB,KAAK,CAAC,OAAO,EAAE;AAEf,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;IACtB;AACD;;;;"}
1
+ {"version":3,"file":"Drawable.js","sources":["../../../../src/rendering/Drawable.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAOA;;;;;;AAMG;AACG,MAAO,QAAS,SAAQ,UAAU,CAAA;AAC9B,IAAA,KAAK,GAAU,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;AAClC,IAAA,UAAU,GAAe,UAAU,CAAC,MAAM;IAC1C,cAAc,GAAkB,MAAM;AAE9C,IAAA,IAAW,IAAI,GAAA;QACb,OAAO,IAAI,CAAC,KAAK;IACnB;IAEA,IAAW,IAAI,CAAC,IAAW,EAAA;AACzB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IACpB;AAEA,IAAA,IAAW,SAAS,GAAA;QAClB,OAAO,IAAI,CAAC,UAAU;IACxB;IAEA,IAAW,SAAS,CAAC,SAAqB,EAAA;AACxC,QAAA,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;IAC9B;AAEA;;;;;;;;;;;;;;;;;;AAkBG;AACH,IAAA,IAAW,aAAa,GAAA;QACtB,OAAO,IAAI,CAAC,cAAc;IAC5B;IAEA,IAAW,aAAa,CAAC,IAAmB,EAAA;AAC1C,QAAA,IAAI,IAAI,KAAK,IAAI,CAAC,cAAc,EAAE;YAChC;QACF;AAEA,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;YAC1B,MAAM,IAAI,KAAK,CAAC,CAAA,sEAAA,EAAyE,MAAM,CAAC,IAAI,CAAC,CAAA,EAAA,CAAI,CAAC;QAC5G;AAEA,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC1B,IAAI,CAAC,eAAe,EAAE;IACxB;AAEA;;;AAGG;AACI,IAAA,OAAO,CAAC,KAAY,EAAA;QACzB,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YACtB,IAAI,CAAC,eAAe,EAAE;QACxB;AAEA,QAAA,OAAO,IAAI;IACb;AAEA;;;AAGG;AACI,IAAA,YAAY,CAAC,SAAqB,EAAA;AACvC,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE;AACjC,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS;YAC3B,IAAI,CAAC,eAAe,EAAE;QACxB;AAEA,QAAA,OAAO,IAAI;IACb;;AAGmB,IAAA,eAAe,CAAC,OAA0B,EAAA;AAC3D,QAAA,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;IACxB;;IAGgB,wBAAwB,GAAA;AACtC,QAAA,OAAO,IAAI;IACb;;IAGgB,uBAAuB,GAAA;QACrC,OAAO,IAAI,CAAC,UAAU;IACxB;IAEgB,OAAO,GAAA;QACrB,KAAK,CAAC,OAAO,EAAE;AAEf,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;IACtB;AACD;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"coreRendererBindings.d.ts","sourceRoot":"","sources":["../../../src/rendering/coreRendererBindings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAe7D;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,2BAA2B,GAAG,eAAe,EAAE,CAiCjG"}
1
+ {"version":3,"file":"coreRendererBindings.d.ts","sourceRoot":"","sources":["../../../src/rendering/coreRendererBindings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAqB7D;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,2BAA2B,GAAG,eAAe,EAAE,CAiDjG"}
@@ -1,11 +1,17 @@
1
1
  import { Mesh } from './mesh/Mesh.js';
2
+ import { NineSliceSprite } from './sprite/NineSliceSprite.js';
3
+ import { RepeatingSprite } from './sprite/RepeatingSprite.js';
2
4
  import { Sprite } from './sprite/Sprite.js';
3
5
  import { BitmapText } from './text/BitmapText.js';
4
6
  import { Text } from './text/Text.js';
5
7
  import { WebGl2MeshRenderer } from './webgl2/WebGl2MeshRenderer.js';
8
+ import { WebGl2NineSliceSpriteRenderer } from './webgl2/WebGl2NineSliceSpriteRenderer.js';
9
+ import { WebGl2RepeatingSpriteRenderer } from './webgl2/WebGl2RepeatingSpriteRenderer.js';
6
10
  import { WebGl2SpriteRenderer } from './webgl2/WebGl2SpriteRenderer.js';
7
11
  import { WebGl2TextRenderer } from './webgl2/WebGl2TextRenderer.js';
8
12
  import { WebGpuMeshRenderer } from './webgpu/WebGpuMeshRenderer.js';
13
+ import { WebGpuNineSliceSpriteRenderer } from './webgpu/WebGpuNineSliceSpriteRenderer.js';
14
+ import { WebGpuRepeatingSpriteRenderer } from './webgpu/WebGpuRepeatingSpriteRenderer.js';
9
15
  import { WebGpuSpriteRenderer } from './webgpu/WebGpuSpriteRenderer.js';
10
16
  import { WebGpuTextRenderer } from './webgpu/WebGpuTextRenderer.js';
11
17
  import { RenderBackendType } from './RenderBackendType.js';
@@ -30,6 +36,14 @@ function buildCoreRendererBindings(options) {
30
36
  [RenderBackendType.WebGl2]: () => new WebGl2TextRenderer(),
31
37
  [RenderBackendType.WebGpu]: () => new WebGpuTextRenderer(),
32
38
  };
39
+ const nineSliceRenderers = {
40
+ [RenderBackendType.WebGl2]: () => new WebGl2NineSliceSpriteRenderer(spriteRendererBatchSize),
41
+ [RenderBackendType.WebGpu]: () => new WebGpuNineSliceSpriteRenderer(),
42
+ };
43
+ const repeatingSpriteRenderers = {
44
+ [RenderBackendType.WebGl2]: () => new WebGl2RepeatingSpriteRenderer(spriteRendererBatchSize),
45
+ [RenderBackendType.WebGpu]: () => new WebGpuRepeatingSpriteRenderer(),
46
+ };
33
47
  return [
34
48
  {
35
49
  targets: [Sprite],
@@ -44,6 +58,14 @@ function buildCoreRendererBindings(options) {
44
58
  targets: [Text, BitmapText],
45
59
  create: backend => textRenderers[backend.backendType]?.(),
46
60
  },
61
+ {
62
+ targets: [NineSliceSprite],
63
+ create: backend => nineSliceRenderers[backend.backendType]?.(),
64
+ },
65
+ {
66
+ targets: [RepeatingSprite],
67
+ create: backend => repeatingSpriteRenderers[backend.backendType]?.(),
68
+ },
47
69
  ];
48
70
  }
49
71
 
@@ -1 +1 @@
1
- {"version":3,"file":"coreRendererBindings.js","sources":["../../../../src/rendering/coreRendererBindings.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;AAgBA;;;;;AAKG;AACG,SAAU,yBAAyB,CAAC,OAAoC,EAAA;AAC5E,IAAA,MAAM,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,IAAI,IAAI;AAIvE,IAAA,MAAM,eAAe,GAAuB;AAC1C,QAAA,CAAC,iBAAiB,CAAC,MAAM,GAAG,MAAM,IAAI,oBAAoB,CAAC,uBAAuB,CAAC;QACnF,CAAC,iBAAiB,CAAC,MAAM,GAAG,MAAM,IAAI,oBAAoB,EAAE;KAC7D;AACD,IAAA,MAAM,aAAa,GAAuB;QACxC,CAAC,iBAAiB,CAAC,MAAM,GAAG,MAAM,IAAI,kBAAkB,EAAE;QAC1D,CAAC,iBAAiB,CAAC,MAAM,GAAG,MAAM,IAAI,kBAAkB,EAAE;KAC3D;AACD,IAAA,MAAM,aAAa,GAAuB;QACxC,CAAC,iBAAiB,CAAC,MAAM,GAAG,MAAM,IAAI,kBAAkB,EAAE;QAC1D,CAAC,iBAAiB,CAAC,MAAM,GAAG,MAAM,IAAI,kBAAkB,EAAE;KAC3D;IAED,OAAO;AACL,QAAA;YACE,OAAO,EAAE,CAAC,MAAM,CAAC;AACjB,YAAA,MAAM,EAAE,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI;AAC5D,SAAA;AACD,QAAA;YACE,OAAO,EAAE,CAAC,IAAI,CAAC;AACf,YAAA,MAAM,EAAE,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI;AAC1D,SAAA;AACD,QAAA;;AAEE,YAAA,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC;AAC3B,YAAA,MAAM,EAAE,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI;AAC1D,SAAA;KACF;AACH;;;;"}
1
+ {"version":3,"file":"coreRendererBindings.js","sources":["../../../../src/rendering/coreRendererBindings.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAsBA;;;;;AAKG;AACG,SAAU,yBAAyB,CAAC,OAAoC,EAAA;AAC5E,IAAA,MAAM,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,IAAI,IAAI;AAIvE,IAAA,MAAM,eAAe,GAAuB;AAC1C,QAAA,CAAC,iBAAiB,CAAC,MAAM,GAAG,MAAM,IAAI,oBAAoB,CAAC,uBAAuB,CAAC;QACnF,CAAC,iBAAiB,CAAC,MAAM,GAAG,MAAM,IAAI,oBAAoB,EAAE;KAC7D;AACD,IAAA,MAAM,aAAa,GAAuB;QACxC,CAAC,iBAAiB,CAAC,MAAM,GAAG,MAAM,IAAI,kBAAkB,EAAE;QAC1D,CAAC,iBAAiB,CAAC,MAAM,GAAG,MAAM,IAAI,kBAAkB,EAAE;KAC3D;AACD,IAAA,MAAM,aAAa,GAAuB;QACxC,CAAC,iBAAiB,CAAC,MAAM,GAAG,MAAM,IAAI,kBAAkB,EAAE;QAC1D,CAAC,iBAAiB,CAAC,MAAM,GAAG,MAAM,IAAI,kBAAkB,EAAE;KAC3D;AACD,IAAA,MAAM,kBAAkB,GAAuB;AAC7C,QAAA,CAAC,iBAAiB,CAAC,MAAM,GAAG,MAAM,IAAI,6BAA6B,CAAC,uBAAuB,CAAC;QAC5F,CAAC,iBAAiB,CAAC,MAAM,GAAG,MAAM,IAAI,6BAA6B,EAAE;KACtE;AACD,IAAA,MAAM,wBAAwB,GAAuB;AACnD,QAAA,CAAC,iBAAiB,CAAC,MAAM,GAAG,MAAM,IAAI,6BAA6B,CAAC,uBAAuB,CAAC;QAC5F,CAAC,iBAAiB,CAAC,MAAM,GAAG,MAAM,IAAI,6BAA6B,EAAE;KACtE;IAED,OAAO;AACL,QAAA;YACE,OAAO,EAAE,CAAC,MAAM,CAAC;AACjB,YAAA,MAAM,EAAE,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI;AAC5D,SAAA;AACD,QAAA;YACE,OAAO,EAAE,CAAC,IAAI,CAAC;AACf,YAAA,MAAM,EAAE,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI;AAC1D,SAAA;AACD,QAAA;;AAEE,YAAA,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC;AAC3B,YAAA,MAAM,EAAE,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI;AAC1D,SAAA;AACD,QAAA;YACE,OAAO,EAAE,CAAC,eAAe,CAAC;AAC1B,YAAA,MAAM,EAAE,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI;AAC/D,SAAA;AACD,QAAA;YACE,OAAO,EAAE,CAAC,eAAe,CAAC;AAC1B,YAAA,MAAM,EAAE,OAAO,IAAI,wBAAwB,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI;AACrE,SAAA;KACF;AACH;;;;"}