@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
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { Drawable } from '../Drawable.js';
|
|
2
|
+
import { buildPixelSnapContext, snapQuadsInto } from '../pixelSnap.js';
|
|
3
|
+
import { TextureRegion } from '../texture/TextureRegion.js';
|
|
4
|
+
import { normalizeInsets, validateSlices, validateBorder, normalizeModes, equalInsets, equalModes, buildNineSliceQuads } from './nineSlice.js';
|
|
5
|
+
|
|
6
|
+
function validateSizeInput(width, height) {
|
|
7
|
+
if (!Number.isFinite(width) || !Number.isFinite(height)) {
|
|
8
|
+
throw new Error(`NineSliceSprite: width and height must be finite numbers (got ${width}, ${height}).`);
|
|
9
|
+
}
|
|
10
|
+
if (width < 0) {
|
|
11
|
+
throw new Error(`NineSliceSprite: width must be non-negative (got ${width}).`);
|
|
12
|
+
}
|
|
13
|
+
if (height < 0) {
|
|
14
|
+
throw new Error(`NineSliceSprite: height must be non-negative (got ${height}).`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* A scalable nine-slice (9-patch) sprite.
|
|
19
|
+
* Corners stay pixel-perfect; edges/center fill by stretch, repeat, or mirror-repeat.
|
|
20
|
+
* @stable
|
|
21
|
+
*/
|
|
22
|
+
class NineSliceSprite extends Drawable {
|
|
23
|
+
_region;
|
|
24
|
+
_slices;
|
|
25
|
+
_border;
|
|
26
|
+
_width;
|
|
27
|
+
_height;
|
|
28
|
+
_modes;
|
|
29
|
+
_quads = [];
|
|
30
|
+
_geometryDirty = true;
|
|
31
|
+
_renderQuads = [];
|
|
32
|
+
constructor(texture, options) {
|
|
33
|
+
super();
|
|
34
|
+
this._region = texture instanceof TextureRegion
|
|
35
|
+
? texture
|
|
36
|
+
: new TextureRegion(texture, {
|
|
37
|
+
x: 0,
|
|
38
|
+
y: 0,
|
|
39
|
+
width: texture.width,
|
|
40
|
+
height: texture.height,
|
|
41
|
+
});
|
|
42
|
+
const region = this._region;
|
|
43
|
+
// Validate and own slices
|
|
44
|
+
const rawSlices = normalizeInsets(options.slices);
|
|
45
|
+
validateSlices(rawSlices, region.width, region.height);
|
|
46
|
+
this._slices = rawSlices;
|
|
47
|
+
// Validate and own border
|
|
48
|
+
const rawBorder = options.border !== undefined
|
|
49
|
+
? normalizeInsets(options.border)
|
|
50
|
+
: normalizeInsets(options.slices);
|
|
51
|
+
validateBorder(rawBorder);
|
|
52
|
+
this._border = rawBorder;
|
|
53
|
+
// Validate and own size
|
|
54
|
+
const width = options.width ?? region.width;
|
|
55
|
+
const height = options.height ?? region.height;
|
|
56
|
+
validateSizeInput(width, height);
|
|
57
|
+
this._width = width;
|
|
58
|
+
this._height = height;
|
|
59
|
+
// Copy and freeze modes
|
|
60
|
+
this._modes = normalizeModes(options.modes);
|
|
61
|
+
}
|
|
62
|
+
// -----------------------------------------------------------------------
|
|
63
|
+
// Public read-only accessors (engine-owned, frozen)
|
|
64
|
+
// -----------------------------------------------------------------------
|
|
65
|
+
/** The TextureRegion this nine-slice samples from. */
|
|
66
|
+
get region() {
|
|
67
|
+
return this._region;
|
|
68
|
+
}
|
|
69
|
+
/** Convenience accessor: the texture underlying the region. */
|
|
70
|
+
get texture() {
|
|
71
|
+
return this._region.texture;
|
|
72
|
+
}
|
|
73
|
+
/** The engine-owned, frozen source slice insets. */
|
|
74
|
+
get slices() {
|
|
75
|
+
return this._slices;
|
|
76
|
+
}
|
|
77
|
+
/** The engine-owned, frozen destination border insets. */
|
|
78
|
+
get border() {
|
|
79
|
+
return this._border;
|
|
80
|
+
}
|
|
81
|
+
/** The engine-owned, frozen edge/center fill modes. */
|
|
82
|
+
get modes() {
|
|
83
|
+
return this._modes;
|
|
84
|
+
}
|
|
85
|
+
// -----------------------------------------------------------------------
|
|
86
|
+
// Width / Height (with atomic validation)
|
|
87
|
+
// -----------------------------------------------------------------------
|
|
88
|
+
/** Destination width in local units. */
|
|
89
|
+
get width() {
|
|
90
|
+
return this._width;
|
|
91
|
+
}
|
|
92
|
+
set width(value) {
|
|
93
|
+
this.setSize(value, this._height);
|
|
94
|
+
}
|
|
95
|
+
/** Destination height in local units. */
|
|
96
|
+
get height() {
|
|
97
|
+
return this._height;
|
|
98
|
+
}
|
|
99
|
+
set height(value) {
|
|
100
|
+
this.setSize(this._width, value);
|
|
101
|
+
}
|
|
102
|
+
// -----------------------------------------------------------------------
|
|
103
|
+
// Mutators
|
|
104
|
+
// -----------------------------------------------------------------------
|
|
105
|
+
/** Set destination size. Fails atomically — prior state is preserved on invalid input. */
|
|
106
|
+
setSize(width, height) {
|
|
107
|
+
validateSizeInput(width, height);
|
|
108
|
+
if (this._width !== width || this._height !== height) {
|
|
109
|
+
this._width = width;
|
|
110
|
+
this._height = height;
|
|
111
|
+
this._geometryDirty = true;
|
|
112
|
+
this.invalidateCache();
|
|
113
|
+
}
|
|
114
|
+
return this;
|
|
115
|
+
}
|
|
116
|
+
/** Update the SOURCE-space slice insets. Fails atomically. No-ops on equivalent values. */
|
|
117
|
+
setSlices(slices) {
|
|
118
|
+
const region = this._region;
|
|
119
|
+
const normalized = normalizeInsets(slices);
|
|
120
|
+
validateSlices(normalized, region.width, region.height);
|
|
121
|
+
if (equalInsets(normalized, this._slices)) {
|
|
122
|
+
return this;
|
|
123
|
+
}
|
|
124
|
+
this._slices = normalized;
|
|
125
|
+
this._geometryDirty = true;
|
|
126
|
+
this.invalidateCache();
|
|
127
|
+
return this;
|
|
128
|
+
}
|
|
129
|
+
/** Update the DESTINATION border sizes. Fails atomically. No-ops on equivalent values. */
|
|
130
|
+
setBorder(border) {
|
|
131
|
+
const normalized = normalizeInsets(border);
|
|
132
|
+
validateBorder(normalized);
|
|
133
|
+
if (equalInsets(normalized, this._border)) {
|
|
134
|
+
return this;
|
|
135
|
+
}
|
|
136
|
+
this._border = normalized;
|
|
137
|
+
this._geometryDirty = true;
|
|
138
|
+
this.invalidateCache();
|
|
139
|
+
return this;
|
|
140
|
+
}
|
|
141
|
+
/** Update the edge/center fill modes. Input is copied, validated, and frozen. No-ops on equivalent values. */
|
|
142
|
+
setModes(modes) {
|
|
143
|
+
const normalized = normalizeModes(modes);
|
|
144
|
+
if (equalModes(normalized, this._modes)) {
|
|
145
|
+
return this;
|
|
146
|
+
}
|
|
147
|
+
this._modes = normalized;
|
|
148
|
+
this._geometryDirty = true;
|
|
149
|
+
this.invalidateCache();
|
|
150
|
+
return this;
|
|
151
|
+
}
|
|
152
|
+
// -----------------------------------------------------------------------
|
|
153
|
+
// Bounds
|
|
154
|
+
// -----------------------------------------------------------------------
|
|
155
|
+
getLocalBounds() {
|
|
156
|
+
const bounds = super.getLocalBounds();
|
|
157
|
+
bounds.set(0, 0, this._width, this._height);
|
|
158
|
+
return bounds;
|
|
159
|
+
}
|
|
160
|
+
// -----------------------------------------------------------------------
|
|
161
|
+
// Internal geometry (for renderers)
|
|
162
|
+
// -----------------------------------------------------------------------
|
|
163
|
+
/**
|
|
164
|
+
* Lazily-built geometry quads. Each quad describes one rendered sub-region
|
|
165
|
+
* in local space with its corresponding UV bounds.
|
|
166
|
+
* @internal
|
|
167
|
+
*/
|
|
168
|
+
get quads() {
|
|
169
|
+
if (this._geometryDirty) {
|
|
170
|
+
this._rebuildGeometry();
|
|
171
|
+
}
|
|
172
|
+
return this._quads;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Render-time quads for the active pass. In `'geometry'` pixel-snap mode (and
|
|
176
|
+
* only when the combined node+view transform is axis-aligned) the shared
|
|
177
|
+
* boundary plan is snapped to the render target's device-pixel grid via the
|
|
178
|
+
* common {@link snapQuadsInto} helper, so every corner/edge/center quad reuses
|
|
179
|
+
* the exact same snapped boundary value and no seams can open. The content
|
|
180
|
+
* quad cache ({@link quads}) is never rebuilt by snapping — camera movement
|
|
181
|
+
* reuses it — and snapped quads are written into a reused buffer. Returns the
|
|
182
|
+
* unsnapped content quads for `'none'`/`'position'` or under a rotation/skew
|
|
183
|
+
* downgrade.
|
|
184
|
+
* @internal
|
|
185
|
+
*/
|
|
186
|
+
getRenderQuads(view, targetPxWidth, targetPxHeight) {
|
|
187
|
+
const base = this.quads;
|
|
188
|
+
if (base.length === 0) {
|
|
189
|
+
return base;
|
|
190
|
+
}
|
|
191
|
+
const ctx = buildPixelSnapContext(this.getGlobalTransform(), view, targetPxWidth, targetPxHeight);
|
|
192
|
+
if (!ctx.axisAligned) {
|
|
193
|
+
return base;
|
|
194
|
+
}
|
|
195
|
+
return snapQuadsInto(base, ctx, this._renderQuads);
|
|
196
|
+
}
|
|
197
|
+
// -----------------------------------------------------------------------
|
|
198
|
+
// Private helpers
|
|
199
|
+
// -----------------------------------------------------------------------
|
|
200
|
+
_rebuildGeometry() {
|
|
201
|
+
this._quads = buildNineSliceQuads(this._region, this._slices, this._border, this._width, this._height, this._modes);
|
|
202
|
+
this._geometryDirty = false;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export { NineSliceSprite };
|
|
207
|
+
//# sourceMappingURL=NineSliceSprite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NineSliceSprite.js","sources":["../../../../../src/rendering/sprite/NineSliceSprite.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import type { Rectangle } from '#math/Rectangle';
|
|
2
|
+
import { Drawable } from '#rendering/Drawable';
|
|
3
|
+
import type { RepeatFit, RepeatMode } from '#rendering/texture/repeat';
|
|
4
|
+
import type { Texture } from '#rendering/texture/Texture';
|
|
5
|
+
import { TextureRegion } from '#rendering/texture/TextureRegion';
|
|
6
|
+
import type { View } from '#rendering/View';
|
|
7
|
+
import type { RepeatingSpriteOptions, RepeatingSpriteQuad } from './repeatingSpritePlan';
|
|
8
|
+
/**
|
|
9
|
+
* A sprite that fills its destination by repeating, mirroring, or stretching
|
|
10
|
+
* a source texture or atlas region.
|
|
11
|
+
*
|
|
12
|
+
* Supports independent per-axis modes (`modeX`, `modeY`) and fit strategies
|
|
13
|
+
* (`fitX`, `fitY`).
|
|
14
|
+
*
|
|
15
|
+
* ## Internal rendering strategy (selected automatically)
|
|
16
|
+
*
|
|
17
|
+
* | Source type | Internal path |
|
|
18
|
+
* |-------------------|-------------------------------------------------------|
|
|
19
|
+
* | Bare `Texture` | **Shader path** — one quad, GPU sampler repeat wrap. |
|
|
20
|
+
* | `TextureRegion` | **Geometry path** — Cartesian-product quads, clamped. |
|
|
21
|
+
*
|
|
22
|
+
* The public class identity and API do not change based on which path the
|
|
23
|
+
* renderer uses.
|
|
24
|
+
*
|
|
25
|
+
* @stable
|
|
26
|
+
*/
|
|
27
|
+
export declare class RepeatingSprite extends Drawable {
|
|
28
|
+
private readonly _source;
|
|
29
|
+
private readonly _region;
|
|
30
|
+
private _width;
|
|
31
|
+
private _height;
|
|
32
|
+
private _modeX;
|
|
33
|
+
private _modeY;
|
|
34
|
+
private _fitX;
|
|
35
|
+
private _fitY;
|
|
36
|
+
private _offsetX;
|
|
37
|
+
private _offsetY;
|
|
38
|
+
private _quads;
|
|
39
|
+
private _geometryDirty;
|
|
40
|
+
private readonly _renderQuads;
|
|
41
|
+
constructor(source: Texture | TextureRegion, options?: RepeatingSpriteOptions);
|
|
42
|
+
/** The original source passed to the constructor. */
|
|
43
|
+
get source(): Texture | TextureRegion;
|
|
44
|
+
/** TextureRegion wrapping the source (bare Texture sources auto-wrapped). */
|
|
45
|
+
get region(): TextureRegion;
|
|
46
|
+
/** Convenience accessor: the underlying Texture. */
|
|
47
|
+
get texture(): Texture;
|
|
48
|
+
/** Destination width in local units. */
|
|
49
|
+
get width(): number;
|
|
50
|
+
set width(value: number);
|
|
51
|
+
/** Destination height in local units. */
|
|
52
|
+
get height(): number;
|
|
53
|
+
set height(value: number);
|
|
54
|
+
/** Horizontal repeat mode. */
|
|
55
|
+
get modeX(): RepeatMode;
|
|
56
|
+
set modeX(value: RepeatMode);
|
|
57
|
+
/** Vertical repeat mode. */
|
|
58
|
+
get modeY(): RepeatMode;
|
|
59
|
+
set modeY(value: RepeatMode);
|
|
60
|
+
/** Horizontal fit mode (how partial repeats are resolved). */
|
|
61
|
+
get fitX(): RepeatFit;
|
|
62
|
+
set fitX(value: RepeatFit);
|
|
63
|
+
/** Vertical fit mode (how partial repeats are resolved). */
|
|
64
|
+
get fitY(): RepeatFit;
|
|
65
|
+
set fitY(value: RepeatFit);
|
|
66
|
+
/**
|
|
67
|
+
* Horizontal scroll offset in source-pixel units.
|
|
68
|
+
*
|
|
69
|
+
* On the shader path (bare `Texture` source), changing the offset does
|
|
70
|
+
* **not** trigger a geometry rebuild — the value is forwarded as
|
|
71
|
+
* per-instance data at render time. On the geometry path
|
|
72
|
+
* (`TextureRegion` source), offset changes mark quads dirty.
|
|
73
|
+
*/
|
|
74
|
+
get offsetX(): number;
|
|
75
|
+
set offsetX(value: number);
|
|
76
|
+
/** Vertical scroll offset in source-pixel units. See {@link offsetX}. */
|
|
77
|
+
get offsetY(): number;
|
|
78
|
+
set offsetY(value: number);
|
|
79
|
+
/** Set destination size atomically. Preserves prior state on invalid input. */
|
|
80
|
+
setSize(width: number, height: number): this;
|
|
81
|
+
/**
|
|
82
|
+
* Set scroll offset atomically in source-pixel units.
|
|
83
|
+
* On the shader path this does not rebuild geometry.
|
|
84
|
+
* On the geometry path this marks geometry dirty.
|
|
85
|
+
*/
|
|
86
|
+
setOffset(offsetX: number, offsetY: number): this;
|
|
87
|
+
getLocalBounds(): Rectangle;
|
|
88
|
+
/**
|
|
89
|
+
* Rendering strategy determined by the source type:
|
|
90
|
+
* - `'shader'` — bare `Texture`; renderer uses GPU sampler wrap.
|
|
91
|
+
* - `'geometry'` — `TextureRegion`; renderer builds repeat quads.
|
|
92
|
+
* @internal
|
|
93
|
+
*/
|
|
94
|
+
get resolvedStrategy(): 'shader' | 'geometry';
|
|
95
|
+
/**
|
|
96
|
+
* Lazily-built geometry quads for the geometry path.
|
|
97
|
+
* Returns an empty array on the shader path.
|
|
98
|
+
* @internal
|
|
99
|
+
*/
|
|
100
|
+
get quads(): readonly RepeatingSpriteQuad[];
|
|
101
|
+
/**
|
|
102
|
+
* Render-time quads for the **geometry strategy**, device-pixel-snapped in
|
|
103
|
+
* `'geometry'` pixel-snap mode (axis-aligned only). Like NineSlice, every
|
|
104
|
+
* shared repeat-segment boundary is snapped once by {@link snapQuadsInto}, so
|
|
105
|
+
* adjacent segments stay gap-free; the content cache ({@link quads}) is never
|
|
106
|
+
* rebuilt by snapping. Returns the unsnapped quads otherwise.
|
|
107
|
+
* @internal
|
|
108
|
+
*/
|
|
109
|
+
getRenderQuads(view: View, targetPxWidth: number, targetPxHeight: number): readonly RepeatingSpriteQuad[];
|
|
110
|
+
/**
|
|
111
|
+
* Render-time destination bounds for the **shader strategy**, written into
|
|
112
|
+
* `out`. In `'geometry'` pixel-snap mode (axis-aligned only) the destination
|
|
113
|
+
* quad edges are snapped to the device grid; repetition stays shader-based, so
|
|
114
|
+
* only the outer rectangle moves. Returns the logical local bounds otherwise.
|
|
115
|
+
* @internal
|
|
116
|
+
*/
|
|
117
|
+
getRenderBounds(view: View, targetPxWidth: number, targetPxHeight: number, out: Rectangle): Rectangle;
|
|
118
|
+
private _rebuildGeometry;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=RepeatingSprite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RepeatingSprite.d.ts","sourceRoot":"","sources":["../../../../src/rendering/sprite/RepeatingSprite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { Drawable } from '../Drawable.js';
|
|
2
|
+
import { buildPixelSnapContext, snapQuadsInto, snapBoundsInto } from '../pixelSnap.js';
|
|
3
|
+
import { TextureRegion } from '../texture/TextureRegion.js';
|
|
4
|
+
import { validateMode, validateFit, validateOffset, validateSizeInput, buildRepeatingSpriteQuads } from './repeatingSpritePlan.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A sprite that fills its destination by repeating, mirroring, or stretching
|
|
8
|
+
* a source texture or atlas region.
|
|
9
|
+
*
|
|
10
|
+
* Supports independent per-axis modes (`modeX`, `modeY`) and fit strategies
|
|
11
|
+
* (`fitX`, `fitY`).
|
|
12
|
+
*
|
|
13
|
+
* ## Internal rendering strategy (selected automatically)
|
|
14
|
+
*
|
|
15
|
+
* | Source type | Internal path |
|
|
16
|
+
* |-------------------|-------------------------------------------------------|
|
|
17
|
+
* | Bare `Texture` | **Shader path** — one quad, GPU sampler repeat wrap. |
|
|
18
|
+
* | `TextureRegion` | **Geometry path** — Cartesian-product quads, clamped. |
|
|
19
|
+
*
|
|
20
|
+
* The public class identity and API do not change based on which path the
|
|
21
|
+
* renderer uses.
|
|
22
|
+
*
|
|
23
|
+
* @stable
|
|
24
|
+
*/
|
|
25
|
+
class RepeatingSprite extends Drawable {
|
|
26
|
+
_source;
|
|
27
|
+
_region;
|
|
28
|
+
_width;
|
|
29
|
+
_height;
|
|
30
|
+
_modeX;
|
|
31
|
+
_modeY;
|
|
32
|
+
_fitX;
|
|
33
|
+
_fitY;
|
|
34
|
+
_offsetX;
|
|
35
|
+
_offsetY;
|
|
36
|
+
_quads = [];
|
|
37
|
+
_geometryDirty = true;
|
|
38
|
+
_renderQuads = [];
|
|
39
|
+
constructor(source, options) {
|
|
40
|
+
super();
|
|
41
|
+
this._source = source;
|
|
42
|
+
this._region = source instanceof TextureRegion
|
|
43
|
+
? source
|
|
44
|
+
: new TextureRegion(source, { x: 0, y: 0, width: source.width, height: source.height });
|
|
45
|
+
const region = this._region;
|
|
46
|
+
const opts = options ?? {};
|
|
47
|
+
const modeX = opts.modeX ?? 'repeat';
|
|
48
|
+
const modeY = opts.modeY ?? 'repeat';
|
|
49
|
+
validateMode(modeX, 'modeX');
|
|
50
|
+
validateMode(modeY, 'modeY');
|
|
51
|
+
this._modeX = modeX;
|
|
52
|
+
this._modeY = modeY;
|
|
53
|
+
const fitX = opts.fitX ?? 'round';
|
|
54
|
+
const fitY = opts.fitY ?? 'round';
|
|
55
|
+
validateFit(fitX, 'fitX');
|
|
56
|
+
validateFit(fitY, 'fitY');
|
|
57
|
+
this._fitX = fitX;
|
|
58
|
+
this._fitY = fitY;
|
|
59
|
+
const offsetX = opts.offsetX ?? 0;
|
|
60
|
+
const offsetY = opts.offsetY ?? 0;
|
|
61
|
+
validateOffset(offsetX, 'offsetX');
|
|
62
|
+
validateOffset(offsetY, 'offsetY');
|
|
63
|
+
this._offsetX = offsetX;
|
|
64
|
+
this._offsetY = offsetY;
|
|
65
|
+
const width = opts.width ?? region.width;
|
|
66
|
+
const height = opts.height ?? region.height;
|
|
67
|
+
validateSizeInput(width, height);
|
|
68
|
+
this._width = width;
|
|
69
|
+
this._height = height;
|
|
70
|
+
}
|
|
71
|
+
// -----------------------------------------------------------------------
|
|
72
|
+
// Accessors
|
|
73
|
+
// -----------------------------------------------------------------------
|
|
74
|
+
/** The original source passed to the constructor. */
|
|
75
|
+
get source() {
|
|
76
|
+
return this._source;
|
|
77
|
+
}
|
|
78
|
+
/** TextureRegion wrapping the source (bare Texture sources auto-wrapped). */
|
|
79
|
+
get region() {
|
|
80
|
+
return this._region;
|
|
81
|
+
}
|
|
82
|
+
/** Convenience accessor: the underlying Texture. */
|
|
83
|
+
get texture() {
|
|
84
|
+
return this._region.texture;
|
|
85
|
+
}
|
|
86
|
+
/** Destination width in local units. */
|
|
87
|
+
get width() {
|
|
88
|
+
return this._width;
|
|
89
|
+
}
|
|
90
|
+
set width(value) {
|
|
91
|
+
this.setSize(value, this._height);
|
|
92
|
+
}
|
|
93
|
+
/** Destination height in local units. */
|
|
94
|
+
get height() {
|
|
95
|
+
return this._height;
|
|
96
|
+
}
|
|
97
|
+
set height(value) {
|
|
98
|
+
this.setSize(this._width, value);
|
|
99
|
+
}
|
|
100
|
+
/** Horizontal repeat mode. */
|
|
101
|
+
get modeX() {
|
|
102
|
+
return this._modeX;
|
|
103
|
+
}
|
|
104
|
+
set modeX(value) {
|
|
105
|
+
validateMode(value, 'modeX');
|
|
106
|
+
if (this._modeX !== value) {
|
|
107
|
+
this._modeX = value;
|
|
108
|
+
this._geometryDirty = true;
|
|
109
|
+
this.invalidateCache();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/** Vertical repeat mode. */
|
|
113
|
+
get modeY() {
|
|
114
|
+
return this._modeY;
|
|
115
|
+
}
|
|
116
|
+
set modeY(value) {
|
|
117
|
+
validateMode(value, 'modeY');
|
|
118
|
+
if (this._modeY !== value) {
|
|
119
|
+
this._modeY = value;
|
|
120
|
+
this._geometryDirty = true;
|
|
121
|
+
this.invalidateCache();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** Horizontal fit mode (how partial repeats are resolved). */
|
|
125
|
+
get fitX() {
|
|
126
|
+
return this._fitX;
|
|
127
|
+
}
|
|
128
|
+
set fitX(value) {
|
|
129
|
+
validateFit(value, 'fitX');
|
|
130
|
+
if (this._fitX !== value) {
|
|
131
|
+
this._fitX = value;
|
|
132
|
+
this._geometryDirty = true;
|
|
133
|
+
this.invalidateCache();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/** Vertical fit mode (how partial repeats are resolved). */
|
|
137
|
+
get fitY() {
|
|
138
|
+
return this._fitY;
|
|
139
|
+
}
|
|
140
|
+
set fitY(value) {
|
|
141
|
+
validateFit(value, 'fitY');
|
|
142
|
+
if (this._fitY !== value) {
|
|
143
|
+
this._fitY = value;
|
|
144
|
+
this._geometryDirty = true;
|
|
145
|
+
this.invalidateCache();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Horizontal scroll offset in source-pixel units.
|
|
150
|
+
*
|
|
151
|
+
* On the shader path (bare `Texture` source), changing the offset does
|
|
152
|
+
* **not** trigger a geometry rebuild — the value is forwarded as
|
|
153
|
+
* per-instance data at render time. On the geometry path
|
|
154
|
+
* (`TextureRegion` source), offset changes mark quads dirty.
|
|
155
|
+
*/
|
|
156
|
+
get offsetX() {
|
|
157
|
+
return this._offsetX;
|
|
158
|
+
}
|
|
159
|
+
set offsetX(value) {
|
|
160
|
+
this.setOffset(value, this._offsetY);
|
|
161
|
+
}
|
|
162
|
+
/** Vertical scroll offset in source-pixel units. See {@link offsetX}. */
|
|
163
|
+
get offsetY() {
|
|
164
|
+
return this._offsetY;
|
|
165
|
+
}
|
|
166
|
+
set offsetY(value) {
|
|
167
|
+
this.setOffset(this._offsetX, value);
|
|
168
|
+
}
|
|
169
|
+
// -----------------------------------------------------------------------
|
|
170
|
+
// Fluent mutators
|
|
171
|
+
// -----------------------------------------------------------------------
|
|
172
|
+
/** Set destination size atomically. Preserves prior state on invalid input. */
|
|
173
|
+
setSize(width, height) {
|
|
174
|
+
validateSizeInput(width, height);
|
|
175
|
+
if (this._width !== width || this._height !== height) {
|
|
176
|
+
this._width = width;
|
|
177
|
+
this._height = height;
|
|
178
|
+
this._geometryDirty = true;
|
|
179
|
+
this.invalidateCache();
|
|
180
|
+
}
|
|
181
|
+
return this;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Set scroll offset atomically in source-pixel units.
|
|
185
|
+
* On the shader path this does not rebuild geometry.
|
|
186
|
+
* On the geometry path this marks geometry dirty.
|
|
187
|
+
*/
|
|
188
|
+
setOffset(offsetX, offsetY) {
|
|
189
|
+
validateOffset(offsetX, 'offsetX');
|
|
190
|
+
validateOffset(offsetY, 'offsetY');
|
|
191
|
+
if (this._offsetX !== offsetX || this._offsetY !== offsetY) {
|
|
192
|
+
this._offsetX = offsetX;
|
|
193
|
+
this._offsetY = offsetY;
|
|
194
|
+
if (this.resolvedStrategy === 'geometry') {
|
|
195
|
+
this._geometryDirty = true;
|
|
196
|
+
}
|
|
197
|
+
this.invalidateCache();
|
|
198
|
+
}
|
|
199
|
+
return this;
|
|
200
|
+
}
|
|
201
|
+
// -----------------------------------------------------------------------
|
|
202
|
+
// Bounds
|
|
203
|
+
// -----------------------------------------------------------------------
|
|
204
|
+
getLocalBounds() {
|
|
205
|
+
const bounds = super.getLocalBounds();
|
|
206
|
+
bounds.set(0, 0, this._width, this._height);
|
|
207
|
+
return bounds;
|
|
208
|
+
}
|
|
209
|
+
// -----------------------------------------------------------------------
|
|
210
|
+
// Internal renderer interface
|
|
211
|
+
// -----------------------------------------------------------------------
|
|
212
|
+
/**
|
|
213
|
+
* Rendering strategy determined by the source type:
|
|
214
|
+
* - `'shader'` — bare `Texture`; renderer uses GPU sampler wrap.
|
|
215
|
+
* - `'geometry'` — `TextureRegion`; renderer builds repeat quads.
|
|
216
|
+
* @internal
|
|
217
|
+
*/
|
|
218
|
+
get resolvedStrategy() {
|
|
219
|
+
return this._source instanceof TextureRegion ? 'geometry' : 'shader';
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Lazily-built geometry quads for the geometry path.
|
|
223
|
+
* Returns an empty array on the shader path.
|
|
224
|
+
* @internal
|
|
225
|
+
*/
|
|
226
|
+
get quads() {
|
|
227
|
+
if (this.resolvedStrategy === 'geometry' && this._geometryDirty) {
|
|
228
|
+
this._rebuildGeometry();
|
|
229
|
+
}
|
|
230
|
+
return this._quads;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Render-time quads for the **geometry strategy**, device-pixel-snapped in
|
|
234
|
+
* `'geometry'` pixel-snap mode (axis-aligned only). Like NineSlice, every
|
|
235
|
+
* shared repeat-segment boundary is snapped once by {@link snapQuadsInto}, so
|
|
236
|
+
* adjacent segments stay gap-free; the content cache ({@link quads}) is never
|
|
237
|
+
* rebuilt by snapping. Returns the unsnapped quads otherwise.
|
|
238
|
+
* @internal
|
|
239
|
+
*/
|
|
240
|
+
getRenderQuads(view, targetPxWidth, targetPxHeight) {
|
|
241
|
+
const base = this.quads;
|
|
242
|
+
if (this.pixelSnapMode !== 'geometry' || base.length === 0) {
|
|
243
|
+
return base;
|
|
244
|
+
}
|
|
245
|
+
const ctx = buildPixelSnapContext(this.getGlobalTransform(), view, targetPxWidth, targetPxHeight);
|
|
246
|
+
if (!ctx.axisAligned) {
|
|
247
|
+
return base;
|
|
248
|
+
}
|
|
249
|
+
return snapQuadsInto(base, ctx, this._renderQuads);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Render-time destination bounds for the **shader strategy**, written into
|
|
253
|
+
* `out`. In `'geometry'` pixel-snap mode (axis-aligned only) the destination
|
|
254
|
+
* quad edges are snapped to the device grid; repetition stays shader-based, so
|
|
255
|
+
* only the outer rectangle moves. Returns the logical local bounds otherwise.
|
|
256
|
+
* @internal
|
|
257
|
+
*/
|
|
258
|
+
getRenderBounds(view, targetPxWidth, targetPxHeight, out) {
|
|
259
|
+
const base = this.getLocalBounds();
|
|
260
|
+
if (this.pixelSnapMode !== 'geometry') {
|
|
261
|
+
return base;
|
|
262
|
+
}
|
|
263
|
+
const ctx = buildPixelSnapContext(this.getGlobalTransform(), view, targetPxWidth, targetPxHeight);
|
|
264
|
+
if (!ctx.axisAligned) {
|
|
265
|
+
return base;
|
|
266
|
+
}
|
|
267
|
+
return snapBoundsInto(base, ctx, out);
|
|
268
|
+
}
|
|
269
|
+
// -----------------------------------------------------------------------
|
|
270
|
+
// Private helpers
|
|
271
|
+
// -----------------------------------------------------------------------
|
|
272
|
+
_rebuildGeometry() {
|
|
273
|
+
this._quads = buildRepeatingSpriteQuads(this._region, this._width, this._height, this._modeX, this._modeY, this._fitX, this._fitY, this._offsetX, this._offsetY);
|
|
274
|
+
this._geometryDirty = false;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export { RepeatingSprite };
|
|
279
|
+
//# sourceMappingURL=RepeatingSprite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RepeatingSprite.js","sources":["../../../../../src/rendering/sprite/RepeatingSprite.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { Drawable } from '#rendering/Drawable';
|
|
|
5
5
|
import type { SpriteMaterial } from '#rendering/material/SpriteMaterial';
|
|
6
6
|
import type { RenderTexture } from '#rendering/texture/RenderTexture';
|
|
7
7
|
import type { Texture } from '#rendering/texture/Texture';
|
|
8
|
+
import type { View } from '#rendering/View';
|
|
8
9
|
/**
|
|
9
10
|
* Internal dirty-flag bitmask used by {@link Sprite} to lazily recompute
|
|
10
11
|
* derived data (vertices, normals, texture coordinates, bounding boxes).
|
|
@@ -72,6 +73,18 @@ export declare class Sprite extends Drawable {
|
|
|
72
73
|
* (TL, TR, BR, BL). Cached until the transform is invalidated.
|
|
73
74
|
*/
|
|
74
75
|
get vertices(): Float32Array;
|
|
76
|
+
/**
|
|
77
|
+
* Local-space quad bounds for the active pass, written into `out`. In
|
|
78
|
+
* `'geometry'` pixel-snap mode (and only when the combined node+view transform
|
|
79
|
+
* is axis-aligned) the quad edges are snapped to the render target's
|
|
80
|
+
* device-pixel grid via the shared {@link snapLocalBoundary} helper — combined
|
|
81
|
+
* with the device-snapped origin from the transform seam, all four corners
|
|
82
|
+
* land on whole device pixels. The logical local bounds (used by collision /
|
|
83
|
+
* `getBounds`) are never changed. Returns the unsnapped local bounds for
|
|
84
|
+
* `'none'`/`'position'` or under a rotation/skew downgrade.
|
|
85
|
+
* @internal
|
|
86
|
+
*/
|
|
87
|
+
getRenderBounds(view: View, targetPxWidth: number, targetPxHeight: number, out: Rectangle): Rectangle;
|
|
75
88
|
/**
|
|
76
89
|
* Packed UV coordinates for the four quad corners, encoded as two
|
|
77
90
|
* 16-bit fixed-point values per element (low 16 bits = U, high 16 bits = V,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sprite.d.ts","sourceRoot":"","sources":["../../../../src/rendering/sprite/Sprite.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Sprite.d.ts","sourceRoot":"","sources":["../../../../src/rendering/sprite/Sprite.ts"],"names":[],"mappings":"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"}
|