@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.
- package/CHANGELOG.md +125 -0
- package/dist/esm/core/BuildInfo.js +2 -2
- package/dist/esm/extensions/Extension.d.ts +39 -7
- package/dist/esm/extensions/Extension.d.ts.map +1 -1
- package/dist/esm/extensions/ExtensionRegistry.d.ts.map +1 -1
- package/dist/esm/extensions/ExtensionRegistry.js.map +1 -1
- package/dist/esm/extensions/snapshot.d.ts +12 -2
- package/dist/esm/extensions/snapshot.d.ts.map +1 -1
- package/dist/esm/extensions/snapshot.js +43 -14
- package/dist/esm/extensions/snapshot.js.map +1 -1
- package/dist/esm/index.js +8 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/rendering/Drawable.d.ts +23 -0
- package/dist/esm/rendering/Drawable.d.ts.map +1 -1
- package/dist/esm/rendering/Drawable.js +34 -0
- package/dist/esm/rendering/Drawable.js.map +1 -1
- package/dist/esm/rendering/coreRendererBindings.d.ts.map +1 -1
- package/dist/esm/rendering/coreRendererBindings.js +22 -0
- package/dist/esm/rendering/coreRendererBindings.js.map +1 -1
- package/dist/esm/rendering/index.d.ts +13 -0
- package/dist/esm/rendering/index.d.ts.map +1 -1
- package/dist/esm/rendering/pixelSnap.d.ts +219 -0
- package/dist/esm/rendering/pixelSnap.d.ts.map +1 -0
- package/dist/esm/rendering/pixelSnap.js +186 -0
- package/dist/esm/rendering/pixelSnap.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlanPlayer.d.ts.map +1 -1
- package/dist/esm/rendering/plan/RenderPlanPlayer.js +21 -1
- package/dist/esm/rendering/plan/RenderPlanPlayer.js.map +1 -1
- package/dist/esm/rendering/sprite/NineSliceSprite.d.ts +69 -0
- package/dist/esm/rendering/sprite/NineSliceSprite.d.ts.map +1 -0
- package/dist/esm/rendering/sprite/NineSliceSprite.js +207 -0
- package/dist/esm/rendering/sprite/NineSliceSprite.js.map +1 -0
- package/dist/esm/rendering/sprite/RepeatingSprite.d.ts +120 -0
- package/dist/esm/rendering/sprite/RepeatingSprite.d.ts.map +1 -0
- package/dist/esm/rendering/sprite/RepeatingSprite.js +279 -0
- package/dist/esm/rendering/sprite/RepeatingSprite.js.map +1 -0
- package/dist/esm/rendering/sprite/Sprite.d.ts +13 -0
- package/dist/esm/rendering/sprite/Sprite.d.ts.map +1 -1
- package/dist/esm/rendering/sprite/Sprite.js +23 -0
- package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
- package/dist/esm/rendering/sprite/nineSlice.d.ts +53 -0
- package/dist/esm/rendering/sprite/nineSlice.d.ts.map +1 -0
- package/dist/esm/rendering/sprite/nineSlice.js +340 -0
- package/dist/esm/rendering/sprite/nineSlice.js.map +1 -0
- package/dist/esm/rendering/sprite/repeatingSpritePlan.d.ts +57 -0
- package/dist/esm/rendering/sprite/repeatingSpritePlan.d.ts.map +1 -0
- package/dist/esm/rendering/sprite/repeatingSpritePlan.js +156 -0
- package/dist/esm/rendering/sprite/repeatingSpritePlan.js.map +1 -0
- package/dist/esm/rendering/texture/TextureRegion.d.ts +100 -0
- package/dist/esm/rendering/texture/TextureRegion.d.ts.map +1 -0
- package/dist/esm/rendering/texture/TextureRegion.js +144 -0
- package/dist/esm/rendering/texture/TextureRegion.js.map +1 -0
- package/dist/esm/rendering/texture/repeat.d.ts +96 -0
- package/dist/esm/rendering/texture/repeat.d.ts.map +1 -0
- package/dist/esm/rendering/texture/repeat.js +158 -0
- package/dist/esm/rendering/texture/repeat.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +20 -0
- package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2Backend.js +31 -2
- package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2NineSliceSpriteRenderer.d.ts +32 -0
- package/dist/esm/rendering/webgl2/WebGl2NineSliceSpriteRenderer.d.ts.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2NineSliceSpriteRenderer.js +308 -0
- package/dist/esm/rendering/webgl2/WebGl2NineSliceSpriteRenderer.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2RepeatingSpriteRenderer.d.ts +49 -0
- package/dist/esm/rendering/webgl2/WebGl2RepeatingSpriteRenderer.d.ts.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2RepeatingSpriteRenderer.js +535 -0
- package/dist/esm/rendering/webgl2/WebGl2RepeatingSpriteRenderer.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +9 -0
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +22 -2
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +21 -1
- package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuBackend.js +29 -2
- package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.d.ts +36 -0
- package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.d.ts.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.js +358 -0
- package/dist/esm/rendering/webgpu/WebGpuNineSliceSpriteRenderer.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.d.ts +52 -0
- package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.d.ts.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.js +556 -0
- package/dist/esm/rendering/webgpu/WebGpuRepeatingSpriteRenderer.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +9 -0
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +22 -2
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts +3 -2
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js +4 -4
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js.map +1 -1
- package/dist/esm/rendering.d.ts +1 -0
- package/dist/esm/rendering.d.ts.map +1 -1
- package/dist/esm/resources/Loader.d.ts +36 -8
- package/dist/esm/resources/Loader.d.ts.map +1 -1
- package/dist/esm/resources/Loader.js +30 -11
- package/dist/esm/resources/Loader.js.map +1 -1
- package/dist/exo.esm.js +3449 -59
- package/dist/exo.esm.js.map +1 -1
- 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,
|
|
@@ -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?:
|
|
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
|
-
|
|
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
|
|
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,
|
|
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;
|
|
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
|
-
*
|
|
11
|
-
*
|
|
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
|
|
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
|
-
*
|
|
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
|
|
18
|
-
const
|
|
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
|
|
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(
|
|
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;
|
|
1
|
+
{"version":3,"file":"snapshot.js","sources":["../../../../src/extensions/snapshot.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
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';
|
package/dist/esm/index.js.map
CHANGED
|
@@ -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;
|
|
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":"
|
|
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;
|
|
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":"
|
|
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;;;;"}
|