@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.
@@ -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,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAOxG;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
+ {"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,CAAC,OAAqD;IACvF,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"}
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, setSpriteTexture, setHtmlViewSize, setNode2DClip, setScene2DSize, } from './contract';
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
@@ -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,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC"}
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, setSpriteTexture, setHtmlViewSize, setNode2DClip, setScene2DSize, } from './contract';
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,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC"}
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 setSpriteTexture(source: Sprite, value: SpriteData['texture']): void;
9
+ export declare function isSpriteRendererDirty(_state: RenderState, source: Renderable, rendererData: RendererData | null): boolean;
9
10
  //# sourceMappingURL=sprite.d.ts.map
@@ -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,EACd,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,CAI9F;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;AAED,wBAAgB,mBAAmB,IAAI,aAAa,CAEnD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,CAElF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,IAAI,CAInF"}
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 { invalidateNodeLocalBounds, invalidateNodeLocalContent } from '@flighthq/node/contract';
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 texture = source.data.texture;
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
- return createNode2DRuntime(defaultMethods);
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
- export function setSpriteTexture(source, value) {
28
- source.data.texture = value;
29
- invalidateNodeLocalContent(source);
30
- invalidateNodeLocalBounds(source);
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
@@ -1 +1 @@
1
- {"version":3,"file":"sprite.js","sourceRoot":"","sources":["../src/sprite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAChG,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAU/E,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEtF,MAAM,UAAU,WAAW,CAAC,MAAwB;IAClD,OAAO,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,GAAc,EAAE,MAAsB;IACtF,MAAM,OAAO,GAAI,MAAM,CAAC,IAAmB,CAAC,OAAO,CAAC;IACpD,GAAG,CAAC,KAAK,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACvG,GAAG,CAAC,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3G,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAmC;IAC9D,OAAO,YAAY,CAAC,UAAU,EAAE,GAAG,EAAE,gBAAgB,EAAE,mBAAmB,CAAW,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAoC;IACnE,OAAO;QACL,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,IAAI;KAC/B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,mBAAmB,CAAC,cAAc,CAAkB,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACvD,OAAO,gBAAgB,CAAC,MAAM,CAAkB,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,KAA4B;IAC3E,MAAM,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IAC5B,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,yBAAyB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,cAAc,GAAsC;IACxD,2BAA2B,EAAE,iCAAiC;CAC/D,CAAC"}
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.1220.6982c21",
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.1220.6982c21",
40
- "@flighthq/animation": "0.3.0-next.1220.6982c21",
41
- "@flighthq/entity": "0.3.0-next.1220.6982c21",
42
- "@flighthq/geometry": "0.3.0-next.1220.6982c21",
43
- "@flighthq/materials": "0.3.0-next.1220.6982c21",
44
- "@flighthq/node": "0.3.0-next.1220.6982c21",
45
- "@flighthq/signals": "0.3.0-next.1220.6982c21",
46
- "@flighthq/texture": "0.3.0-next.1220.6982c21",
47
- "@flighthq/types": "0.3.0-next.1220.6982c21"
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"
@@ -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
- setSpriteTexture,
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('setSpriteTexture', () => {
100
- it('sets the texture', () => {
101
- const sprite = createSprite();
102
- const imageTexture = texture(64, 64);
103
- setSpriteTexture(sprite, imageTexture);
104
- expect(sprite.data.texture).toBe(imageTexture);
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
- it('accepts null', () => {
108
- const sprite = createSprite({ data: { texture: texture(1, 1) } });
109
- setSpriteTexture(sprite, null);
110
- expect(sprite.data.texture).toBeNull();
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('invalidates local bounds', () => {
114
- const sprite = createSprite();
115
- const runtime = getEntityRuntime(sprite) as SpriteRuntime;
116
- const idBefore = runtime.localBoundsId;
117
- setSpriteTexture(sprite, texture(64, 64));
118
- expect(runtime.localBoundsId).not.toBe(idBefore);
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
- it('invalidates local content', () => {
122
- const sprite = createSprite();
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 idBefore = runtime.localContentId;
125
- setSpriteTexture(sprite, texture(64, 64));
126
- expect(runtime.localContentId).not.toBe(idBefore);
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