@flighthq/scene2d 0.3.0-next.1220.6982c21 → 0.3.0-next.1248.f867198
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/dist/displayObject.d.ts +1 -1
- package/dist/displayObject.d.ts.map +1 -1
- package/dist/displayObject.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/sprite.d.ts +3 -2
- package/dist/sprite.d.ts.map +1 -1
- package/dist/sprite.js +35 -7
- package/dist/sprite.js.map +1 -1
- package/package.json +10 -10
- package/src/sprite.test.ts +47 -23
package/dist/displayObject.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ClipRegion, Node2D, Node2DDataFactory, Node2DRuntime, Node2DRuntimeFactory, Kind, MethodsOf, NodeAny, PartialNode } from '@flighthq/types/contract';
|
|
2
2
|
export declare function createNode2D<R extends Node2DRuntime>(kind: Kind, obj?: Readonly<PartialNode<Node2D>>, createData?: Node2DDataFactory, createNode2DRuntimeFactory?: Node2DRuntimeFactory<R>): Node2D;
|
|
3
|
-
export declare function createNode2DRuntime(methods?: Readonly<Partial<MethodsOf<Node2DRuntime>>>): Node2DRuntime;
|
|
3
|
+
export declare function createNode2DRuntime(methods?: Readonly<Partial<MethodsOf<Node2DRuntime> & Pick<Node2DRuntime, 'isLocalBoundsRectangleValid'>>>): Node2DRuntime;
|
|
4
4
|
export declare function getNode2DRuntime(source: Readonly<Node2D>): Readonly<Node2DRuntime>;
|
|
5
5
|
export declare function isNode2D(node: NodeAny): node is Node2D;
|
|
6
6
|
export declare function setNode2DClip(source: Node2D, value: ClipRegion | null): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"displayObject.d.ts","sourceRoot":"","sources":["../src/displayObject.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,UAAU,EACV,MAAM,EACN,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,IAAI,EACJ,SAAS,EACT,OAAO,EAEP,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAGlC,wBAAgB,YAAY,CAAC,CAAC,SAAS,aAAa,EAClD,IAAI,EAAE,IAAI,EACV,GAAG,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EACnC,UAAU,CAAC,EAAE,iBAAiB,EAC9B,0BAA0B,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC,GACnD,MAAM,CAcR;AAED,wBAAgB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"displayObject.d.ts","sourceRoot":"","sources":["../src/displayObject.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,UAAU,EACV,MAAM,EACN,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,IAAI,EACJ,SAAS,EACT,OAAO,EAEP,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAGlC,wBAAgB,YAAY,CAAC,CAAC,SAAS,aAAa,EAClD,IAAI,EAAE,IAAI,EACV,GAAG,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EACnC,UAAU,CAAC,EAAE,iBAAiB,EAC9B,0BAA0B,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC,GACnD,MAAM,CAcR;AAED,wBAAgB,mBAAmB,CACjC,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,6BAA6B,CAAC,CAAC,CAAC,GACzG,aAAa,CAOf;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,CAElF;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,MAAM,CAEtD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAG5E;AAED,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"displayObject.js","sourceRoot":"","sources":["../src/displayObject.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,+BAA+B,EAC/B,wBAAwB,EACxB,aAAa,EACb,iBAAiB,EACjB,2BAA2B,EAC3B,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAajC,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,UAAU,YAAY,CAC1B,IAAU,EACV,GAAmC,EACnC,UAA8B,EAC9B,0BAAoD;IAEpD,MAAM,GAAG,GAAG,UAAU,CACpB,IAAI,EACJ,GAAG,EACH,UAAU,EACV,0BAA0B,IAAK,mBAAwD,CAC9E,CAAC;IACZ,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC/B,wBAAwB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACnC,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9B,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7B,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5B,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACxB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,mBAAmB,
|
|
1
|
+
{"version":3,"file":"displayObject.js","sourceRoot":"","sources":["../src/displayObject.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,+BAA+B,EAC/B,wBAAwB,EACxB,aAAa,EACb,iBAAiB,EACjB,2BAA2B,EAC3B,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAajC,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,UAAU,YAAY,CAC1B,IAAU,EACV,GAAmC,EACnC,UAA8B,EAC9B,0BAAoD;IAEpD,MAAM,GAAG,GAAG,UAAU,CACpB,IAAI,EACJ,GAAG,EACH,UAAU,EACV,0BAA0B,IAAK,mBAAwD,CAC9E,CAAC;IACZ,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC/B,wBAAwB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACnC,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9B,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7B,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5B,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACxB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAA0G;IAE1G,MAAM,GAAG,GAAG,iBAAiB,CAAC,OAAO,CAAkB,CAAC;IACxD,GAAG,CAAC,MAAM,GAAG,eAAe,CAAC;IAC7B,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;IACnB,2BAA2B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC1C,+BAA+B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACvD,OAAO,cAAc,CAAC,MAAM,CAAkB,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAa;IACpC,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,eAAe,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,KAAwB;IACpE,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC;IACpB,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { applyAnimationClipToNode2D, cloneSprite, computeSpriteLocalBoundsRectangle, computeHtmlViewLocalBoundsRectangle, createSprite, createDisplayObject, createHtmlView, createNode2D, createScene2D, enableScene2DSignals, getScene2DRoot, getScene2DSignals, isNode2D,
|
|
1
|
+
export { applyAnimationClipToNode2D, cloneSprite, computeSpriteLocalBoundsRectangle, computeHtmlViewLocalBoundsRectangle, createSprite, createDisplayObject, createHtmlView, createNode2D, createScene2D, enableScene2DSignals, getScene2DRoot, getScene2DSignals, isNode2D, setHtmlViewSize, setNode2DClip, setScene2DSize, } from './contract';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,WAAW,EACX,iCAAiC,EACjC,mCAAmC,EACnC,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,WAAW,EACX,iCAAiC,EACjC,mCAAmC,EACnC,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { applyAnimationClipToNode2D, cloneSprite, computeSpriteLocalBoundsRectangle, computeHtmlViewLocalBoundsRectangle, createSprite, createDisplayObject, createHtmlView, createNode2D, createScene2D, enableScene2DSignals, getScene2DRoot, getScene2DSignals, isNode2D,
|
|
1
|
+
export { applyAnimationClipToNode2D, cloneSprite, computeSpriteLocalBoundsRectangle, computeHtmlViewLocalBoundsRectangle, createSprite, createDisplayObject, createHtmlView, createNode2D, createScene2D, enableScene2DSignals, getScene2DRoot, getScene2DSignals, isNode2D, setHtmlViewSize, setNode2DClip, setScene2DSize, } from './contract';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,WAAW,EACX,iCAAiC,EACjC,mCAAmC,EACnC,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,WAAW,EACX,iCAAiC,EACjC,mCAAmC,EACnC,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC"}
|
package/dist/sprite.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import type { Node, PartialNode, Rectangle, Sprite, SpriteData, SpriteRuntime } from '@flighthq/types/contract';
|
|
1
|
+
import type { Node, PartialNode, Rectangle, Renderable, RendererData, RenderState, Sprite, SpriteData, SpriteRuntime } from '@flighthq/types/contract';
|
|
2
2
|
export declare function cloneSprite(source: Readonly<Sprite>): Sprite;
|
|
3
3
|
export declare function computeSpriteLocalBoundsRectangle(out: Rectangle, source: Readonly<Node>): void;
|
|
4
4
|
export declare function createSprite(obj?: Readonly<PartialNode<Sprite>>): Sprite;
|
|
5
5
|
export declare function createSpriteData(data?: Readonly<Partial<SpriteData>>): SpriteData;
|
|
6
|
+
export declare function createSpriteRendererData(_state: RenderState, source: Renderable): RendererData;
|
|
6
7
|
export declare function createSpriteRuntime(): SpriteRuntime;
|
|
7
8
|
export declare function getSpriteRuntime(source: Readonly<Sprite>): Readonly<SpriteRuntime>;
|
|
8
|
-
export declare function
|
|
9
|
+
export declare function isSpriteRendererDirty(_state: RenderState, source: Renderable, rendererData: RendererData | null): boolean;
|
|
9
10
|
//# sourceMappingURL=sprite.d.ts.map
|
package/dist/sprite.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sprite.d.ts","sourceRoot":"","sources":["../src/sprite.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,IAAI,EACJ,WAAW,EACX,SAAS,EACT,MAAM,EACN,UAAU,EACV,aAAa,
|
|
1
|
+
{"version":3,"file":"sprite.d.ts","sourceRoot":"","sources":["../src/sprite.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,IAAI,EACJ,WAAW,EACX,SAAS,EACT,UAAU,EACV,YAAY,EACZ,WAAW,EACX,MAAM,EACN,UAAU,EACV,aAAa,EAEd,MAAM,0BAA0B,CAAC;AAKlC,wBAAgB,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,CAE5D;AAED,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAQ9F;AAED,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAExE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,UAAU,CAIjF;AAID,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,YAAY,CAG9F;AAED,wBAAgB,mBAAmB,IAAI,aAAa,CAKnD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,CAElF;AAID,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,UAAU,EAClB,YAAY,EAAE,YAAY,GAAG,IAAI,GAChC,OAAO,CAST"}
|
package/dist/sprite.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createEntity } from '@flighthq/entity/contract';
|
|
2
2
|
import { getTextureHeight, getTextureWidth } from '@flighthq/texture/contract';
|
|
3
3
|
import { SpriteKind } from '@flighthq/types/contract';
|
|
4
4
|
import { createNode2D, createNode2DRuntime, getNode2DRuntime } from './displayObject';
|
|
@@ -6,9 +6,13 @@ export function cloneSprite(source) {
|
|
|
6
6
|
return createSprite({ data: { texture: source.data.texture } });
|
|
7
7
|
}
|
|
8
8
|
export function computeSpriteLocalBoundsRectangle(out, source) {
|
|
9
|
-
const
|
|
9
|
+
const sprite = source;
|
|
10
|
+
const texture = sprite.data.texture;
|
|
10
11
|
out.width = texture === null ? 0 : Math.max(0, getTextureWidth(texture)) * Math.abs(texture.uvScale.x);
|
|
11
12
|
out.height = texture === null ? 0 : Math.max(0, getTextureHeight(texture)) * Math.abs(texture.uvScale.y);
|
|
13
|
+
const runtime = getNode2DRuntime(sprite);
|
|
14
|
+
runtime.localBoundsTexture = texture;
|
|
15
|
+
runtime.localBoundsTextureVersion = texture?.version ?? -1;
|
|
12
16
|
}
|
|
13
17
|
export function createSprite(obj) {
|
|
14
18
|
return createNode2D(SpriteKind, obj, createSpriteData, createSpriteRuntime);
|
|
@@ -18,18 +22,42 @@ export function createSpriteData(data) {
|
|
|
18
22
|
texture: data?.texture ?? null,
|
|
19
23
|
};
|
|
20
24
|
}
|
|
25
|
+
// Creates the per-state identity stamp used by a Sprite renderer's optional dirty hook. The data is
|
|
26
|
+
// attached to that state's render proxy, so separate render pipelines compare independently.
|
|
27
|
+
export function createSpriteRendererData(_state, source) {
|
|
28
|
+
const texture = source.data.texture;
|
|
29
|
+
return createEntity({ textureIdentity: texture, textureVersion: texture?.version ?? -1 });
|
|
30
|
+
}
|
|
21
31
|
export function createSpriteRuntime() {
|
|
22
|
-
|
|
32
|
+
const runtime = createNode2DRuntime(defaultMethods);
|
|
33
|
+
runtime.localBoundsTexture = null;
|
|
34
|
+
runtime.localBoundsTextureVersion = -1;
|
|
35
|
+
return runtime;
|
|
23
36
|
}
|
|
24
37
|
export function getSpriteRuntime(source) {
|
|
25
38
|
return getNode2DRuntime(source);
|
|
26
39
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
40
|
+
// Detects Texture identity/version changes before requiresInvalidation can skip a Sprite. Each
|
|
41
|
+
// backend opts into this through its registered renderer; the generic walk never knows SpriteKind.
|
|
42
|
+
export function isSpriteRendererDirty(_state, source, rendererData) {
|
|
43
|
+
if (rendererData === null)
|
|
44
|
+
return false;
|
|
45
|
+
const data = rendererData;
|
|
46
|
+
const texture = source.data.texture;
|
|
47
|
+
const version = texture?.version ?? -1;
|
|
48
|
+
const dirty = data.textureIdentity !== texture || data.textureVersion !== version;
|
|
49
|
+
data.textureIdentity = texture;
|
|
50
|
+
data.textureVersion = version;
|
|
51
|
+
return dirty;
|
|
52
|
+
}
|
|
53
|
+
function isSpriteLocalBoundsRectangleValid(source) {
|
|
54
|
+
const sprite = source;
|
|
55
|
+
const runtime = getNode2DRuntime(sprite);
|
|
56
|
+
const texture = sprite.data.texture;
|
|
57
|
+
return runtime.localBoundsTexture === texture && runtime.localBoundsTextureVersion === (texture?.version ?? -1);
|
|
31
58
|
}
|
|
32
59
|
const defaultMethods = {
|
|
33
60
|
computeLocalBoundsRectangle: computeSpriteLocalBoundsRectangle,
|
|
61
|
+
isLocalBoundsRectangleValid: isSpriteLocalBoundsRectangleValid,
|
|
34
62
|
};
|
|
35
63
|
//# sourceMappingURL=sprite.js.map
|
package/dist/sprite.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sprite.js","sourceRoot":"","sources":["../src/sprite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"sprite.js","sourceRoot":"","sources":["../src/sprite.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/scene2d",
|
|
3
|
-
"version": "0.3.0-next.
|
|
3
|
+
"version": "0.3.0-next.1248.f867198",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/flighthq/flight.git",
|
|
@@ -36,15 +36,15 @@
|
|
|
36
36
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@flighthq/adjustments": "0.3.0-next.
|
|
40
|
-
"@flighthq/animation": "0.3.0-next.
|
|
41
|
-
"@flighthq/entity": "0.3.0-next.
|
|
42
|
-
"@flighthq/geometry": "0.3.0-next.
|
|
43
|
-
"@flighthq/materials": "0.3.0-next.
|
|
44
|
-
"@flighthq/node": "0.3.0-next.
|
|
45
|
-
"@flighthq/signals": "0.3.0-next.
|
|
46
|
-
"@flighthq/texture": "0.3.0-next.
|
|
47
|
-
"@flighthq/types": "0.3.0-next.
|
|
39
|
+
"@flighthq/adjustments": "0.3.0-next.1248.f867198",
|
|
40
|
+
"@flighthq/animation": "0.3.0-next.1248.f867198",
|
|
41
|
+
"@flighthq/entity": "0.3.0-next.1248.f867198",
|
|
42
|
+
"@flighthq/geometry": "0.3.0-next.1248.f867198",
|
|
43
|
+
"@flighthq/materials": "0.3.0-next.1248.f867198",
|
|
44
|
+
"@flighthq/node": "0.3.0-next.1248.f867198",
|
|
45
|
+
"@flighthq/signals": "0.3.0-next.1248.f867198",
|
|
46
|
+
"@flighthq/texture": "0.3.0-next.1248.f867198",
|
|
47
|
+
"@flighthq/types": "0.3.0-next.1248.f867198"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"typescript": "^5.3.0"
|
package/src/sprite.test.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getEntityRuntime } from '@flighthq/entity/contract';
|
|
2
2
|
import { createRectangle } from '@flighthq/geometry/contract';
|
|
3
|
+
import { getNodeLocalBoundsRectangle } from '@flighthq/node/contract';
|
|
3
4
|
import { createTexture, setTextureUvFromPixelRect } from '@flighthq/texture/contract';
|
|
4
5
|
import type { Image, Node, Sprite, SpriteRuntime } from '@flighthq/types/contract';
|
|
5
6
|
import { SpriteKind } from '@flighthq/types/contract';
|
|
@@ -9,9 +10,10 @@ import {
|
|
|
9
10
|
computeSpriteLocalBoundsRectangle,
|
|
10
11
|
createSprite,
|
|
11
12
|
createSpriteData,
|
|
13
|
+
createSpriteRendererData,
|
|
12
14
|
createSpriteRuntime,
|
|
13
15
|
getSpriteRuntime,
|
|
14
|
-
|
|
16
|
+
isSpriteRendererDirty,
|
|
15
17
|
} from './sprite';
|
|
16
18
|
|
|
17
19
|
describe('cloneSprite', () => {
|
|
@@ -79,6 +81,15 @@ describe('createSpriteData', () => {
|
|
|
79
81
|
});
|
|
80
82
|
});
|
|
81
83
|
|
|
84
|
+
describe('createSpriteRendererData', () => {
|
|
85
|
+
it('creates a clean per-state stamp for the current texture', () => {
|
|
86
|
+
const sprite = createSprite({ data: { texture: texture(16, 16) } });
|
|
87
|
+
const data = createSpriteRendererData({} as never, sprite);
|
|
88
|
+
|
|
89
|
+
expect(isSpriteRendererDirty({} as never, sprite, data)).toBe(false);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
82
93
|
describe('createSpriteRuntime', () => {
|
|
83
94
|
it('returns a non-null runtime', () => {
|
|
84
95
|
const runtime = createSpriteRuntime();
|
|
@@ -88,6 +99,13 @@ describe('createSpriteRuntime', () => {
|
|
|
88
99
|
it('uses computeSpriteLocalBoundsRectangle', () => {
|
|
89
100
|
expect(createSpriteRuntime().computeLocalBoundsRectangle).toStrictEqual(computeSpriteLocalBoundsRectangle);
|
|
90
101
|
});
|
|
102
|
+
|
|
103
|
+
it('installs the texture-aware local-bounds validity hook', () => {
|
|
104
|
+
const runtime = createSpriteRuntime();
|
|
105
|
+
expect(typeof runtime.isLocalBoundsRectangleValid).toBe('function');
|
|
106
|
+
expect(runtime.localBoundsTexture).toBeNull();
|
|
107
|
+
expect(runtime.localBoundsTextureVersion).toBe(-1);
|
|
108
|
+
});
|
|
91
109
|
});
|
|
92
110
|
|
|
93
111
|
describe('getSpriteRuntime', () => {
|
|
@@ -96,34 +114,40 @@ describe('getSpriteRuntime', () => {
|
|
|
96
114
|
});
|
|
97
115
|
});
|
|
98
116
|
|
|
99
|
-
describe('
|
|
100
|
-
it('
|
|
101
|
-
const sprite = createSprite();
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
});
|
|
117
|
+
describe('isSpriteRendererDirty', () => {
|
|
118
|
+
it('detects same-size bare texture assignment once without node invalidation', () => {
|
|
119
|
+
const sprite = createSprite({ data: { texture: texture(64, 64) } });
|
|
120
|
+
const data = createSpriteRendererData({} as never, sprite);
|
|
121
|
+
const runtime = getEntityRuntime(sprite) as SpriteRuntime;
|
|
122
|
+
const contentId = runtime.localContentId;
|
|
106
123
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
expect(sprite
|
|
124
|
+
sprite.data.texture = texture(64, 64);
|
|
125
|
+
|
|
126
|
+
expect(isSpriteRendererDirty({} as never, sprite, data)).toBe(true);
|
|
127
|
+
expect(isSpriteRendererDirty({} as never, sprite, data)).toBe(false);
|
|
128
|
+
expect(runtime.localContentId).toBe(contentId);
|
|
111
129
|
});
|
|
112
130
|
|
|
113
|
-
it('
|
|
114
|
-
const sprite = createSprite();
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
expect(
|
|
131
|
+
it('detects a version bump on the same texture identity', () => {
|
|
132
|
+
const sprite = createSprite({ data: { texture: texture(64, 64) } });
|
|
133
|
+
const data = createSpriteRendererData({} as never, sprite);
|
|
134
|
+
sprite.data.texture!.version++;
|
|
135
|
+
|
|
136
|
+
expect(isSpriteRendererDirty({} as never, sprite, data)).toBe(true);
|
|
119
137
|
});
|
|
138
|
+
});
|
|
120
139
|
|
|
121
|
-
|
|
122
|
-
|
|
140
|
+
describe('Sprite local bounds validity', () => {
|
|
141
|
+
it('refreshes bounds after bare texture assignment without changing localBoundsId', () => {
|
|
142
|
+
const sprite = createSprite({ data: { texture: texture(16, 12) } });
|
|
143
|
+
expect(getNodeLocalBoundsRectangle(sprite)).toMatchObject({ width: 16, height: 12 });
|
|
123
144
|
const runtime = getEntityRuntime(sprite) as SpriteRuntime;
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
145
|
+
const localBoundsId = runtime.localBoundsId;
|
|
146
|
+
|
|
147
|
+
sprite.data.texture = texture(48, 30);
|
|
148
|
+
|
|
149
|
+
expect(getNodeLocalBoundsRectangle(sprite)).toMatchObject({ width: 48, height: 30 });
|
|
150
|
+
expect(runtime.localBoundsId).toBe(localBoundsId);
|
|
127
151
|
});
|
|
128
152
|
});
|
|
129
153
|
|