@codexo/exojs-tilemap 0.15.2 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/README.md +33 -26
  2. package/dist/esm/ChunkSource.d.ts +33 -0
  3. package/dist/esm/ChunkSource.d.ts.map +1 -0
  4. package/dist/esm/ChunkStreamer.d.ts +98 -0
  5. package/dist/esm/ChunkStreamer.d.ts.map +1 -0
  6. package/dist/esm/ChunkStreamer.js +201 -0
  7. package/dist/esm/ChunkStreamer.js.map +1 -0
  8. package/dist/esm/ImageLayer.d.ts +11 -3
  9. package/dist/esm/ImageLayer.d.ts.map +1 -0
  10. package/dist/esm/ImageLayer.js +71 -64
  11. package/dist/esm/ImageLayer.js.map +1 -1
  12. package/dist/esm/ImageLayerNode.d.ts +89 -0
  13. package/dist/esm/ImageLayerNode.d.ts.map +1 -0
  14. package/dist/esm/ImageLayerNode.js +205 -0
  15. package/dist/esm/ImageLayerNode.js.map +1 -0
  16. package/dist/esm/MapObject.d.ts +70 -0
  17. package/dist/esm/MapObject.d.ts.map +1 -0
  18. package/dist/esm/MapObject.js +34 -0
  19. package/dist/esm/MapObject.js.map +1 -0
  20. package/dist/esm/MapObjectSpawner.d.ts +133 -0
  21. package/dist/esm/MapObjectSpawner.d.ts.map +1 -0
  22. package/dist/esm/MapObjectSpawner.js +147 -0
  23. package/dist/esm/MapObjectSpawner.js.map +1 -0
  24. package/dist/esm/MapSpawnSession.d.ts +53 -0
  25. package/dist/esm/MapSpawnSession.d.ts.map +1 -0
  26. package/dist/esm/MapSpawnSession.js +88 -0
  27. package/dist/esm/MapSpawnSession.js.map +1 -0
  28. package/dist/esm/MapWorld.d.ts +134 -0
  29. package/dist/esm/MapWorld.d.ts.map +1 -0
  30. package/dist/esm/MapWorld.js +150 -0
  31. package/dist/esm/MapWorld.js.map +1 -0
  32. package/dist/esm/MapWorldRuntime.d.ts +182 -0
  33. package/dist/esm/MapWorldRuntime.d.ts.map +1 -0
  34. package/dist/esm/MapWorldRuntime.js +261 -0
  35. package/dist/esm/MapWorldRuntime.js.map +1 -0
  36. package/dist/esm/ObjectLayer.d.ts +93 -7
  37. package/dist/esm/ObjectLayer.d.ts.map +1 -0
  38. package/dist/esm/ObjectLayer.js +184 -167
  39. package/dist/esm/ObjectLayer.js.map +1 -1
  40. package/dist/esm/SampledChunkSource.d.ts +43 -0
  41. package/dist/esm/SampledChunkSource.d.ts.map +1 -0
  42. package/dist/esm/SampledChunkSource.js +48 -0
  43. package/dist/esm/SampledChunkSource.js.map +1 -0
  44. package/dist/esm/TileAnimator.d.ts +12 -2
  45. package/dist/esm/TileAnimator.d.ts.map +1 -0
  46. package/dist/esm/TileAnimator.js +154 -165
  47. package/dist/esm/TileAnimator.js.map +1 -1
  48. package/dist/esm/TileChunk.d.ts +30 -5
  49. package/dist/esm/TileChunk.d.ts.map +1 -0
  50. package/dist/esm/TileChunk.js +190 -188
  51. package/dist/esm/TileChunk.js.map +1 -1
  52. package/dist/esm/TileChunkNode.d.ts +18 -3
  53. package/dist/esm/TileChunkNode.d.ts.map +1 -0
  54. package/dist/esm/TileChunkNode.js +104 -85
  55. package/dist/esm/TileChunkNode.js.map +1 -1
  56. package/dist/esm/TileLayer.d.ts +104 -24
  57. package/dist/esm/TileLayer.d.ts.map +1 -0
  58. package/dist/esm/TileLayer.js +511 -469
  59. package/dist/esm/TileLayer.js.map +1 -1
  60. package/dist/esm/TileLayerNode.d.ts +52 -11
  61. package/dist/esm/TileLayerNode.d.ts.map +1 -0
  62. package/dist/esm/TileLayerNode.js +224 -166
  63. package/dist/esm/TileLayerNode.js.map +1 -1
  64. package/dist/esm/TileMap.d.ts +96 -31
  65. package/dist/esm/TileMap.d.ts.map +1 -0
  66. package/dist/esm/TileMap.js +401 -357
  67. package/dist/esm/TileMap.js.map +1 -1
  68. package/dist/esm/TileMapBand.d.ts +42 -29
  69. package/dist/esm/TileMapBand.d.ts.map +1 -0
  70. package/dist/esm/TileMapBand.js +151 -158
  71. package/dist/esm/TileMapBand.js.map +1 -1
  72. package/dist/esm/TileMapNode.d.ts +34 -18
  73. package/dist/esm/TileMapNode.d.ts.map +1 -0
  74. package/dist/esm/TileMapNode.js +122 -109
  75. package/dist/esm/TileMapNode.js.map +1 -1
  76. package/dist/esm/TileMapView.d.ts +108 -47
  77. package/dist/esm/TileMapView.d.ts.map +1 -0
  78. package/dist/esm/TileMapView.js +385 -338
  79. package/dist/esm/TileMapView.js.map +1 -1
  80. package/dist/esm/TileSet.d.ts +15 -6
  81. package/dist/esm/TileSet.d.ts.map +1 -0
  82. package/dist/esm/TileSet.js +161 -181
  83. package/dist/esm/TileSet.js.map +1 -1
  84. package/dist/esm/WangSet.d.ts +5 -4
  85. package/dist/esm/WangSet.d.ts.map +1 -0
  86. package/dist/esm/WangSet.js +70 -78
  87. package/dist/esm/WangSet.js.map +1 -1
  88. package/dist/esm/WorkerSampledChunkSource.d.ts +95 -0
  89. package/dist/esm/WorkerSampledChunkSource.d.ts.map +1 -0
  90. package/dist/esm/WorkerSampledChunkSource.js +117 -0
  91. package/dist/esm/WorkerSampledChunkSource.js.map +1 -0
  92. package/dist/esm/autoTile.d.ts +10 -5
  93. package/dist/esm/autoTile.d.ts.map +1 -0
  94. package/dist/esm/autoTile.js +164 -205
  95. package/dist/esm/autoTile.js.map +1 -1
  96. package/dist/esm/chunkGeometry.d.ts +8 -7
  97. package/dist/esm/chunkGeometry.d.ts.map +1 -0
  98. package/dist/esm/chunkGeometry.js +83 -94
  99. package/dist/esm/chunkGeometry.js.map +1 -1
  100. package/dist/esm/index.d.ts +1 -0
  101. package/dist/esm/index.d.ts.map +1 -0
  102. package/dist/esm/index.js +26 -15
  103. package/dist/esm/nodeBounds.d.ts +20 -0
  104. package/dist/esm/nodeBounds.d.ts.map +1 -0
  105. package/dist/esm/nodeBounds.js +40 -0
  106. package/dist/esm/nodeBounds.js.map +1 -0
  107. package/dist/esm/pixelSnap.d.ts +4 -3
  108. package/dist/esm/pixelSnap.d.ts.map +1 -0
  109. package/dist/esm/pixelSnap.js +18 -16
  110. package/dist/esm/pixelSnap.js.map +1 -1
  111. package/dist/esm/public.d.ts +23 -3
  112. package/dist/esm/public.d.ts.map +1 -0
  113. package/dist/esm/tileCollision.d.ts +190 -0
  114. package/dist/esm/tileCollision.d.ts.map +1 -0
  115. package/dist/esm/tileCollision.js +367 -0
  116. package/dist/esm/tileCollision.js.map +1 -0
  117. package/dist/esm/tileWord.d.ts +12 -0
  118. package/dist/esm/tileWord.d.ts.map +1 -0
  119. package/dist/esm/tileWord.js +16 -0
  120. package/dist/esm/tileWord.js.map +1 -0
  121. package/dist/esm/tilemapExtension.d.ts +4 -3
  122. package/dist/esm/tilemapExtension.d.ts.map +1 -0
  123. package/dist/esm/tilemapExtension.js +47 -47
  124. package/dist/esm/tilemapExtension.js.map +1 -1
  125. package/dist/esm/tilemapSerializers.d.ts +5 -4
  126. package/dist/esm/tilemapSerializers.d.ts.map +1 -0
  127. package/dist/esm/tilemapSerializers.js +48 -41
  128. package/dist/esm/tilemapSerializers.js.map +1 -1
  129. package/dist/esm/types.d.ts +34 -18
  130. package/dist/esm/types.d.ts.map +1 -0
  131. package/dist/esm/types.js +111 -120
  132. package/dist/esm/types.js.map +1 -1
  133. package/dist/esm/webgl2/WebGl2TileChunkRenderer.d.ts +50 -2
  134. package/dist/esm/webgl2/WebGl2TileChunkRenderer.d.ts.map +1 -0
  135. package/dist/esm/webgl2/WebGl2TileChunkRenderer.js +366 -332
  136. package/dist/esm/webgl2/WebGl2TileChunkRenderer.js.map +1 -1
  137. package/dist/esm/webgl2/shaders/tile-chunk.frag.js +6 -0
  138. package/dist/esm/webgl2/shaders/tile-chunk.frag.js.map +1 -0
  139. package/dist/esm/webgl2/shaders/tile-chunk.vert.js +6 -0
  140. package/dist/esm/webgl2/shaders/tile-chunk.vert.js.map +1 -0
  141. package/dist/esm/webgpu/WebGpuTileChunkRenderer.d.ts +70 -4
  142. package/dist/esm/webgpu/WebGpuTileChunkRenderer.d.ts.map +1 -0
  143. package/dist/esm/webgpu/WebGpuTileChunkRenderer.js +496 -383
  144. package/dist/esm/webgpu/WebGpuTileChunkRenderer.js.map +1 -1
  145. package/dist/esm/webgpu/shaders/tile-chunk.wgsl.js +6 -0
  146. package/dist/esm/webgpu/shaders/tile-chunk.wgsl.js.map +1 -0
  147. package/package.json +8 -15
  148. package/dist/esm/index.js.map +0 -1
  149. package/dist/esm/register.d.ts +0 -1
  150. package/dist/esm/register.js +0 -25
  151. package/dist/esm/register.js.map +0 -1
@@ -1,89 +1,108 @@
1
- import { Drawable } from '@codexo/exojs/renderer-sdk';
2
- import { buildChunkPages } from './chunkGeometry.js';
1
+ import { buildChunkPages } from "./chunkGeometry.js";
2
+ import { TileChunk } from "./TileChunk.js";
3
+ import { Drawable } from "@codexo/exojs/renderer-sdk";
3
4
 
5
+ //#region src/TileChunkNode.ts
4
6
  /**
5
- * A single renderable tile chunk. One `TileChunkNode` is a {@link Drawable}
6
- * that owns the batched quad geometry for exactly one {@link ReadonlyTileChunk}
7
- * of one {@link import('./TileLayer').TileLayer}, positioned at the chunk's
8
- * pixel origin within the owning {@link TileLayerNode}.
9
- *
10
- * Geometry is built lazily and cached against the source chunk's `revision`:
11
- * the renderer reads {@link TileChunkNode.pages} on each visible frame, but a
12
- * rebuild only happens when the underlying chunk actually changed. Off-screen
13
- * chunks are culled by their accurate {@link getLocalBounds} before `render`
14
- * is ever called, so a camera pan rebuilds nothing.
15
- *
16
- * The node references but never owns the runtime chunk, tilesets, and
17
- * tileset textures. Destroying it releases only its cached CPU geometry; the
18
- * `TileMap`/`TileLayer` data and Loader-owned textures are untouched.
19
- *
20
- * @internal Package-internal render node; the renderer is registered for this
21
- * class. Applications use {@link TileMapNode} / {@link TileLayerNode}.
22
- */
23
- class TileChunkNode extends Drawable {
24
- _chunk;
25
- _tilesets;
26
- _tileWidth;
27
- _tileHeight;
28
- _pixelWidth;
29
- _pixelHeight;
30
- _pages = [];
31
- _builtRevision = -1;
32
- /**
33
- * @param chunk The readonly chunk this node renders.
34
- * @param tilesets The owning layer's tileset array.
35
- * @param tileWidth Map/layer tile cell width in pixels.
36
- * @param tileHeight Map/layer tile cell height in pixels.
37
- * @param chunkWidthTiles The layer's (unclamped) chunk width in tiles, used
38
- * to compute the chunk's pixel origin. Edge chunks
39
- * report a smaller `chunk.width`, but always start at
40
- * `cx * chunkWidthTiles`.
41
- * @param chunkHeightTiles The layer's (unclamped) chunk height in tiles.
42
- */
43
- constructor(chunk, tilesets, tileWidth, tileHeight, chunkWidthTiles, chunkHeightTiles) {
44
- super();
45
- this._chunk = chunk;
46
- this._tilesets = tilesets;
47
- this._tileWidth = tileWidth;
48
- this._tileHeight = tileHeight;
49
- this._pixelWidth = chunk.width * tileWidth;
50
- this._pixelHeight = chunk.height * tileHeight;
51
- this.setPosition(chunk.cx * chunkWidthTiles * tileWidth, chunk.cy * chunkHeightTiles * tileHeight);
52
- }
53
- /** The signed chunk coordinates this node renders. */
54
- get chunkX() {
55
- return this._chunk.cx;
56
- }
57
- get chunkY() {
58
- return this._chunk.cy;
59
- }
60
- /**
61
- * The revision-cached per-tileset page geometry. Rebuilt only when the source
62
- * chunk's `revision` advances; otherwise the same arrays are returned.
63
- * @internal Read by the per-backend tile chunk renderer.
64
- */
65
- get pages() {
66
- if (this._builtRevision !== this._chunk.revision) {
67
- this._pages = buildChunkPages(this._chunk, this._tilesets, this._tileWidth, this._tileHeight);
68
- this._builtRevision = this._chunk.revision;
69
- }
70
- return this._pages;
71
- }
72
- /** `true` when the chunk has no drawable tiles (no geometry, no draw calls). */
73
- get isEmpty() {
74
- return this.pages.length === 0;
75
- }
76
- getLocalBounds() {
77
- const bounds = super.getLocalBounds();
78
- bounds.set(0, 0, this._pixelWidth, this._pixelHeight);
79
- return bounds;
80
- }
81
- destroy() {
82
- this._pages = [];
83
- this._builtRevision = -1;
84
- super.destroy();
85
- }
86
- }
7
+ * A single renderable tile chunk. One `TileChunkNode` is a {@link Drawable}
8
+ * that owns the batched quad geometry for exactly one {@link ReadonlyTileChunk}
9
+ * of one {@link import('./TileLayer').TileLayer}, positioned at the chunk's
10
+ * pixel origin within the owning {@link TileLayerNode}.
11
+ *
12
+ * Geometry is built lazily and cached against the source chunk's `revision`:
13
+ * the renderer reads {@link TileChunkNode.pages} on each visible frame, but a
14
+ * rebuild only happens when the underlying chunk actually changed. Off-screen
15
+ * chunks are culled by their accurate {@link getLocalBounds} before `render`
16
+ * is ever called, so a camera pan rebuilds nothing.
17
+ *
18
+ * The node references - but never owns - the runtime chunk, tilesets, and
19
+ * tileset textures. Destroying it releases only its cached CPU geometry; the
20
+ * `TileMap`/`TileLayer` data and Loader-owned textures are untouched.
21
+ *
22
+ * @internal Package-internal render node; the renderer is registered for this
23
+ * class. Applications use {@link TileMapNode} / {@link TileLayerNode}.
24
+ */
25
+ var TileChunkNode = class extends Drawable {
26
+ _chunk;
27
+ _tilesets;
28
+ _tileWidth;
29
+ _tileHeight;
30
+ _pixelWidth;
31
+ _pixelHeight;
32
+ _pages = [];
33
+ _builtRevision = -1;
34
+ /**
35
+ * Bound once so `TileChunk._addDirtyListener`/`_removeDirtyListener` add and
36
+ * remove the SAME function reference. Pushes the chunk's revision bump onto
37
+ * this node's own content revision (see `TileChunk._dirtyListeners`) so a
38
+ * `RetainedContainer` ancestor - which skips walking a content-clean
39
+ * subtree entirely - observes the mutation and re-collects instead of
40
+ * replaying stale cached geometry.
41
+ */
42
+ _onChunkDirty = () => {
43
+ this.invalidateContent();
44
+ };
45
+ /**
46
+ * @param chunk The readonly chunk this node renders.
47
+ * @param tilesets The owning layer's tileset array.
48
+ * @param tileWidth Map/layer tile cell width in pixels.
49
+ * @param tileHeight Map/layer tile cell height in pixels.
50
+ * @param chunkWidthTiles The layer's (unclamped) chunk width in tiles, used
51
+ * to compute the chunk's pixel origin. Edge chunks
52
+ * report a smaller `chunk.width`, but always start at
53
+ * `cx * chunkWidthTiles`.
54
+ * @param chunkHeightTiles The layer's (unclamped) chunk height in tiles.
55
+ */
56
+ constructor(chunk, tilesets, tileWidth, tileHeight, chunkWidthTiles, chunkHeightTiles) {
57
+ super();
58
+ this._chunk = chunk;
59
+ this._tilesets = tilesets;
60
+ this._tileWidth = tileWidth;
61
+ this._tileHeight = tileHeight;
62
+ this._pixelWidth = chunk.width * tileWidth;
63
+ this._pixelHeight = chunk.height * tileHeight;
64
+ this.setPosition(chunk.cx * chunkWidthTiles * tileWidth, chunk.cy * chunkHeightTiles * tileHeight);
65
+ if (chunk instanceof TileChunk) chunk._addDirtyListener(this._onChunkDirty);
66
+ }
67
+ /** The signed chunk coordinates this node renders. */
68
+ get chunkX() {
69
+ return this._chunk.cx;
70
+ }
71
+ get chunkY() {
72
+ return this._chunk.cy;
73
+ }
74
+ /**
75
+ * The revision-cached per-tileset page geometry. Rebuilt only when the source
76
+ * chunk's `revision` advances; otherwise the same arrays are returned.
77
+ * @internal Read by the per-backend tile chunk renderer.
78
+ */
79
+ get pages() {
80
+ if (this._builtRevision !== this._chunk.revision) {
81
+ this._pages = buildChunkPages(this._chunk, this._tilesets, this._tileWidth, this._tileHeight);
82
+ this._builtRevision = this._chunk.revision;
83
+ }
84
+ return this._pages;
85
+ }
86
+ /** `true` when the chunk has no drawable tiles (no geometry, no draw calls). */
87
+ get isEmpty() {
88
+ return this.pages.length === 0;
89
+ }
90
+ /**
91
+ * Recomputed lazily on read, so it writes `_localBounds` directly rather than
92
+ * going through `_setLocalBounds`: an invalidating write inside a getter
93
+ * would re-dirty the node on every read.
94
+ */
95
+ getLocalBounds() {
96
+ return this._localBounds.set(0, 0, this._pixelWidth, this._pixelHeight);
97
+ }
98
+ destroy() {
99
+ if (this._chunk instanceof TileChunk) this._chunk._removeDirtyListener(this._onChunkDirty);
100
+ this._pages = [];
101
+ this._builtRevision = -1;
102
+ super.destroy();
103
+ }
104
+ };
87
105
 
106
+ //#endregion
88
107
  export { TileChunkNode };
89
- //# sourceMappingURL=TileChunkNode.js.map
108
+ //# sourceMappingURL=TileChunkNode.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TileChunkNode.js","sources":["../../../src/TileChunkNode.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAQA;;;;;;;;;;;;;;;;;;AAkBG;AACG,MAAO,aAAc,SAAQ,QAAQ,CAAA;AACxB,IAAA,MAAM;AACN,IAAA,SAAS;AACT,IAAA,UAAU;AACV,IAAA,WAAW;AACX,IAAA,WAAW;AACX,IAAA,YAAY;IAErB,MAAM,GAAgB,EAAE;IACxB,cAAc,GAAG,EAAE;AAE3B;;;;;;;;;;AAUG;IACH,WAAA,CACE,KAAwB,EACxB,QAA4B,EAC5B,SAAiB,EACjB,UAAkB,EAClB,eAAuB,EACvB,gBAAwB,EAAA;AAExB,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,SAAS,GAAG,QAAQ;AACzB,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;AAC3B,QAAA,IAAI,CAAC,WAAW,GAAG,UAAU;QAC7B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,KAAK,GAAG,SAAS;QAC1C,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,UAAU;AAE7C,QAAA,IAAI,CAAC,WAAW,CACd,KAAK,CAAC,EAAE,GAAG,eAAe,GAAG,SAAS,EACtC,KAAK,CAAC,EAAE,GAAG,gBAAgB,GAAG,UAAU,CACzC;IACH;;AAGA,IAAA,IAAW,MAAM,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE;IACvB;AAEA,IAAA,IAAW,MAAM,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE;IACvB;AAEA;;;;AAIG;AACH,IAAA,IAAW,KAAK,GAAA;QACd,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;YAChD,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC;YAC7F,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ;QAC5C;QAEA,OAAO,IAAI,CAAC,MAAM;IACpB;;AAGA,IAAA,IAAW,OAAO,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;IAChC;IAEgB,cAAc,GAAA;AAC5B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,EAAE;AAErC,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC;AAErD,QAAA,OAAO,MAAM;IACf;IAEgB,OAAO,GAAA;AACrB,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE;AAChB,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;QAExB,KAAK,CAAC,OAAO,EAAE;IACjB;AACD;;;;"}
1
+ {"version":3,"file":"TileChunkNode.js","names":[],"sources":["../../src/TileChunkNode.ts"],"sourcesContent":["import type { ReadonlyRectangle } from '@codexo/exojs';\nimport { Drawable } from '@codexo/exojs/renderer-sdk';\n\nimport type { ChunkPage } from './chunkGeometry';\nimport { buildChunkPages } from './chunkGeometry';\nimport type { ReadonlyTileChunk } from './TileChunk';\nimport { TileChunk } from './TileChunk';\nimport type { TileSet } from './TileSet';\n\n/**\n * A single renderable tile chunk. One `TileChunkNode` is a {@link Drawable}\n * that owns the batched quad geometry for exactly one {@link ReadonlyTileChunk}\n * of one {@link import('./TileLayer').TileLayer}, positioned at the chunk's\n * pixel origin within the owning {@link TileLayerNode}.\n *\n * Geometry is built lazily and cached against the source chunk's `revision`:\n * the renderer reads {@link TileChunkNode.pages} on each visible frame, but a\n * rebuild only happens when the underlying chunk actually changed. Off-screen\n * chunks are culled by their accurate {@link getLocalBounds} before `render`\n * is ever called, so a camera pan rebuilds nothing.\n *\n * The node references - but never owns - the runtime chunk, tilesets, and\n * tileset textures. Destroying it releases only its cached CPU geometry; the\n * `TileMap`/`TileLayer` data and Loader-owned textures are untouched.\n *\n * @internal Package-internal render node; the renderer is registered for this\n * class. Applications use {@link TileMapNode} / {@link TileLayerNode}.\n */\nexport class TileChunkNode extends Drawable {\n private readonly _chunk: ReadonlyTileChunk;\n private readonly _tilesets: readonly TileSet[];\n private readonly _tileWidth: number;\n private readonly _tileHeight: number;\n private readonly _pixelWidth: number;\n private readonly _pixelHeight: number;\n\n private _pages: ChunkPage[] = [];\n private _builtRevision = -1;\n\n /**\n * Bound once so `TileChunk._addDirtyListener`/`_removeDirtyListener` add and\n * remove the SAME function reference. Pushes the chunk's revision bump onto\n * this node's own content revision (see `TileChunk._dirtyListeners`) so a\n * `RetainedContainer` ancestor - which skips walking a content-clean\n * subtree entirely - observes the mutation and re-collects instead of\n * replaying stale cached geometry.\n */\n private readonly _onChunkDirty = (): void => {\n this.invalidateContent();\n };\n\n /**\n * @param chunk The readonly chunk this node renders.\n * @param tilesets The owning layer's tileset array.\n * @param tileWidth Map/layer tile cell width in pixels.\n * @param tileHeight Map/layer tile cell height in pixels.\n * @param chunkWidthTiles The layer's (unclamped) chunk width in tiles, used\n * to compute the chunk's pixel origin. Edge chunks\n * report a smaller `chunk.width`, but always start at\n * `cx * chunkWidthTiles`.\n * @param chunkHeightTiles The layer's (unclamped) chunk height in tiles.\n */\n public constructor(\n chunk: ReadonlyTileChunk,\n tilesets: readonly TileSet[],\n tileWidth: number,\n tileHeight: number,\n chunkWidthTiles: number,\n chunkHeightTiles: number,\n ) {\n super();\n\n this._chunk = chunk;\n this._tilesets = tilesets;\n this._tileWidth = tileWidth;\n this._tileHeight = tileHeight;\n this._pixelWidth = chunk.width * tileWidth;\n this._pixelHeight = chunk.height * tileHeight;\n\n this.setPosition(chunk.cx * chunkWidthTiles * tileWidth, chunk.cy * chunkHeightTiles * tileHeight);\n\n // `loadedChunks()` always yields the concrete `TileChunk` behind the\n // readonly view (see TileLayer); the guard is defensive only.\n if (chunk instanceof TileChunk) {\n chunk._addDirtyListener(this._onChunkDirty);\n }\n }\n\n /** The signed chunk coordinates this node renders. */\n public get chunkX(): number {\n return this._chunk.cx;\n }\n\n public get chunkY(): number {\n return this._chunk.cy;\n }\n\n /**\n * The revision-cached per-tileset page geometry. Rebuilt only when the source\n * chunk's `revision` advances; otherwise the same arrays are returned.\n * @internal Read by the per-backend tile chunk renderer.\n */\n public get pages(): readonly ChunkPage[] {\n if (this._builtRevision !== this._chunk.revision) {\n this._pages = buildChunkPages(this._chunk, this._tilesets, this._tileWidth, this._tileHeight);\n this._builtRevision = this._chunk.revision;\n }\n\n return this._pages;\n }\n\n /** `true` when the chunk has no drawable tiles (no geometry, no draw calls). */\n public get isEmpty(): boolean {\n return this.pages.length === 0;\n }\n\n /**\n * Recomputed lazily on read, so it writes `_localBounds` directly rather than\n * going through `_setLocalBounds`: an invalidating write inside a getter\n * would re-dirty the node on every read.\n */\n public override getLocalBounds(): ReadonlyRectangle {\n return this._localBounds.set(0, 0, this._pixelWidth, this._pixelHeight);\n }\n\n public override destroy(): void {\n if (this._chunk instanceof TileChunk) {\n this._chunk._removeDirtyListener(this._onChunkDirty);\n }\n\n this._pages = [];\n this._builtRevision = -1;\n\n super.destroy();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA4BA,IAAa,gBAAb,cAAmC,SAAS;CAC1C,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,AAAQ,SAAsB,CAAC;CAC/B,AAAQ,iBAAiB;;;;;;;;;CAUzB,AAAiB,sBAA4B;EAC3C,KAAK,kBAAkB;CACzB;;;;;;;;;;;;CAaA,AAAO,YACL,OACA,UACA,WACA,YACA,iBACA,kBACA;EACA,MAAM;EAEN,KAAK,SAAS;EACd,KAAK,YAAY;EACjB,KAAK,aAAa;EAClB,KAAK,cAAc;EACnB,KAAK,cAAc,MAAM,QAAQ;EACjC,KAAK,eAAe,MAAM,SAAS;EAEnC,KAAK,YAAY,MAAM,KAAK,kBAAkB,WAAW,MAAM,KAAK,mBAAmB,UAAU;EAIjG,IAAI,iBAAiB,WACnB,MAAM,kBAAkB,KAAK,aAAa;CAE9C;;CAGA,IAAW,SAAiB;EAC1B,OAAO,KAAK,OAAO;CACrB;CAEA,IAAW,SAAiB;EAC1B,OAAO,KAAK,OAAO;CACrB;;;;;;CAOA,IAAW,QAA8B;EACvC,IAAI,KAAK,mBAAmB,KAAK,OAAO,UAAU;GAChD,KAAK,SAAS,gBAAgB,KAAK,QAAQ,KAAK,WAAW,KAAK,YAAY,KAAK,WAAW;GAC5F,KAAK,iBAAiB,KAAK,OAAO;EACpC;EAEA,OAAO,KAAK;CACd;;CAGA,IAAW,UAAmB;EAC5B,OAAO,KAAK,MAAM,WAAW;CAC/B;;;;;;CAOA,AAAgB,iBAAoC;EAClD,OAAO,KAAK,aAAa,IAAI,GAAG,GAAG,KAAK,aAAa,KAAK,YAAY;CACxE;CAEA,AAAgB,UAAgB;EAC9B,IAAI,KAAK,kBAAkB,WACzB,KAAK,OAAO,qBAAqB,KAAK,aAAa;EAGrD,KAAK,SAAS,CAAC;EACf,KAAK,iBAAiB;EAEtB,MAAM,QAAQ;CAChB;AACF"}
@@ -1,3 +1,4 @@
1
+ import type { ChunkPayload } from './ChunkSource';
1
2
  import type { ReadonlyTileChunk } from './TileChunk';
2
3
  import { TileChunk } from './TileChunk';
3
4
  import type { TileSet } from './TileSet';
@@ -12,10 +13,14 @@ export interface TileLayerOptions {
12
13
  readonly id: number;
13
14
  /** Display name (need not be unique). */
14
15
  readonly name: string;
15
- /** Layer width in tiles. */
16
- readonly width: number;
17
- /** Layer height in tiles. */
18
- readonly height: number;
16
+ /**
17
+ * Layer width in tiles. Omit together with {@link height} for an
18
+ * unbounded layer - chunk storage then accepts any signed chunk
19
+ * coordinate instead of being clamped to a fixed grid.
20
+ */
21
+ readonly width?: number;
22
+ /** Layer height in tiles. Must be provided iff {@link width} is. */
23
+ readonly height?: number;
19
24
  /** Chunk width in tiles (default 32). */
20
25
  readonly chunkWidth?: number;
21
26
  /** Chunk height in tiles (default 32). */
@@ -44,6 +49,11 @@ export interface TileLayerOptions {
44
49
  * `0.5` = half speed (farther away), `0.0` = stationary. Default 1.
45
50
  */
46
51
  readonly parallaxY?: number;
52
+ /**
53
+ * Uniform scale applied together with the camera-relative parallax shift.
54
+ * `1` keeps the layer at its authored size. Default `1`.
55
+ */
56
+ readonly parallaxScale?: number;
47
57
  /** Layer class/type string (Tiled `class`). Defaults to `''`. */
48
58
  readonly class?: string;
49
59
  /**
@@ -54,6 +64,30 @@ export interface TileLayerOptions {
54
64
  /** Layer properties (copied and frozen). */
55
65
  readonly properties?: TileProperties;
56
66
  }
67
+ /**
68
+ * The inclusive range of chunk coordinates that intersect a bounded
69
+ * {@link TileLayer}. `null` for an unbounded layer (no range limit).
70
+ * @advanced
71
+ */
72
+ export interface ChunkRange {
73
+ readonly minCx: number;
74
+ readonly minCy: number;
75
+ readonly maxCx: number;
76
+ readonly maxCy: number;
77
+ }
78
+ /**
79
+ * Fired via {@link TileLayer._addStructuralListener} whenever a chunk is
80
+ * installed ({@link TileLayer._adoptChunk}) or evicted
81
+ * ({@link TileLayer._evictChunk}) - structural changes only, not per-tile
82
+ * edits (see {@link import('./TileChunk').TileChunk._addDirtyListener} for
83
+ * those). `chunk` is `null` on eviction.
84
+ * @internal
85
+ */
86
+ export interface ChunkStructuralEvent {
87
+ readonly cx: number;
88
+ readonly cy: number;
89
+ readonly chunk: ReadonlyTileChunk | null;
90
+ }
57
91
  /**
58
92
  * A generic, format-independent tile layer with chunk-first storage.
59
93
  *
@@ -64,10 +98,10 @@ export interface TileLayerOptions {
64
98
  * **Mutation must go through the layer's public APIs only.**
65
99
  * `setTileAt` / `clearTileAt` validate coordinates, tileset references,
66
100
  * and increment revision counters only when the stored value actually
67
- * changes. Direct chunk mutation is not supported the layer owns chunk
101
+ * changes. Direct chunk mutation is not supported - the layer owns chunk
68
102
  * storage and exposes only a {@link ReadonlyTileChunk} view.
69
103
  *
70
- * The layer is NOT a SceneNode that integration lives in
104
+ * The layer is NOT a SceneNode - that integration lives in
71
105
  * {@link import('./TileLayerNode').TileLayerNode}.
72
106
  *
73
107
  * @advanced
@@ -77,10 +111,10 @@ export declare class TileLayer {
77
111
  readonly id: number;
78
112
  /** Display name (may not be unique). */
79
113
  readonly name: string;
80
- /** Width in tiles. */
81
- readonly width: number;
82
- /** Height in tiles. */
83
- readonly height: number;
114
+ /** Width in tiles, or `undefined` if unbounded. */
115
+ readonly width: number | undefined;
116
+ /** Height in tiles, or `undefined` if unbounded. */
117
+ readonly height: number | undefined;
84
118
  /** Chunk width (tiles). */
85
119
  readonly chunkWidth: number;
86
120
  /** Chunk height (tiles). */
@@ -89,10 +123,12 @@ export declare class TileLayer {
89
123
  readonly tileWidth: number;
90
124
  /** Tile height in pixels. */
91
125
  readonly tileHeight: number;
92
- /** Pixel width. */
93
- get pixelWidth(): number;
94
- /** Pixel height. */
95
- get pixelHeight(): number;
126
+ /** `true` if this layer has a fixed width/height; `false` if unbounded. */
127
+ get bounded(): boolean;
128
+ /** Pixel width, or `undefined` if unbounded. */
129
+ get pixelWidth(): number | undefined;
130
+ /** Pixel height, or `undefined` if unbounded. */
131
+ get pixelHeight(): number | undefined;
96
132
  /** Visibility flag (mutable). */
97
133
  visible: boolean;
98
134
  /** Opacity 0..1 (mutable). */
@@ -111,6 +147,8 @@ export declare class TileLayer {
111
147
  * `1.0` = full camera speed, `0.5` = half speed, `0.0` = stationary.
112
148
  */
113
149
  readonly parallaxY: number;
150
+ /** Uniform scale applied around the layer origin during parallax rendering. */
151
+ readonly parallaxScale: number;
114
152
  /** Layer class/type string (Tiled `class`; may be empty). */
115
153
  readonly class: string;
116
154
  /** Multiplicative layer tint as `0xRRGGBB`, or `null` for no tint. */
@@ -121,6 +159,8 @@ export declare class TileLayer {
121
159
  readonly tilesets: readonly TileSet[];
122
160
  /** Chunk storage: chunkKey → mutable TileChunk (internal). */
123
161
  private readonly _chunks;
162
+ /** Package-internal structural (adopt/evict) listeners. */
163
+ private _structuralListeners;
124
164
  /**
125
165
  * Monotonic layer revision counter.
126
166
  * Increments on every cell mutation that actually changes a stored value.
@@ -135,16 +175,15 @@ export declare class TileLayer {
135
175
  constructor(options: TileLayerOptions);
136
176
  /**
137
177
  * Check whether a tile coordinate lies within the layer bounds.
178
+ * Always `true` for an unbounded layer.
138
179
  * @advanced
139
180
  */
140
181
  inBounds(tx: number, ty: number): boolean;
141
- /** Compute the range of chunk coordinates that intersect this layer. */
142
- chunkRange(): {
143
- minCx: number;
144
- minCy: number;
145
- maxCx: number;
146
- maxCy: number;
147
- };
182
+ /**
183
+ * Compute the range of chunk coordinates that intersect this layer, or
184
+ * `null` if the layer is unbounded (any signed chunk coordinate is valid).
185
+ */
186
+ chunkRange(): ChunkRange | null;
148
187
  private _chunkKey;
149
188
  /**
150
189
  * Get a readonly view of a chunk by signed chunk coordinates,
@@ -154,16 +193,56 @@ export declare class TileLayer {
154
193
  getChunk(cx: number, cy: number): ReadonlyTileChunk | undefined;
155
194
  /**
156
195
  * Get or create a chunk at the given coordinates.
157
- * For finite layers, creation is only allowed within the valid chunk range.
196
+ * For a bounded layer, creation is only allowed within the valid chunk
197
+ * range and edge chunks are clamped to the layer's remaining size. For an
198
+ * unbounded layer, any signed chunk coordinate is accepted and every
199
+ * chunk is full-size ({@link chunkWidth} × {@link chunkHeight}).
158
200
  *
159
201
  * @internal Package-private: used by {@link setTileAt}, {@link fillRect},
160
202
  * and future adapter ingest. External users should not allocate
161
- * chunks use {@link setTileAt} to populate tiles.
203
+ * chunks - use {@link setTileAt} to populate tiles.
162
204
  */
163
205
  _ensureChunk(cx: number, cy: number): TileChunk;
206
+ /**
207
+ * Install a chunk-provider-supplied payload directly, bypassing per-tile
208
+ * `setTileAt` cost. Overwrites any existing chunk at `(cx, cy)`. Always
209
+ * bumps the layer revision (installing a chunk is always a structural
210
+ * change, even if the payload happens to be all-zero).
211
+ *
212
+ * Does not validate `(cx, cy)` against {@link chunkRange} - callers
213
+ * (chunk-streaming controllers) are trusted to request coordinates within
214
+ * whatever range they intend to manage.
215
+ *
216
+ * @internal Package-private: for future chunk-provider/streaming use.
217
+ */
218
+ _adoptChunk(cx: number, cy: number, payload: ChunkPayload): void;
219
+ /**
220
+ * Evict a chunk from storage, freeing it for garbage collection. No-op if
221
+ * no chunk is loaded at `(cx, cy)`.
222
+ *
223
+ * @returns `true` if a chunk was found and removed, `false` otherwise.
224
+ * @internal Package-private: for future chunk-streaming eviction use.
225
+ */
226
+ _evictChunk(cx: number, cy: number): boolean;
227
+ /**
228
+ * Register a callback invoked synchronously whenever a chunk is installed
229
+ * ({@link _adoptChunk}) or evicted ({@link _evictChunk}). Package-internal:
230
+ * {@link import('./TileLayerNode').TileLayerNode} subscribes to keep its
231
+ * chunk-node children in sync with chunk-provider-driven adopt/evict calls
232
+ * (e.g. from {@link import('./ChunkStreamer').ChunkStreamer}) without
233
+ * needing a full {@link import('./TileLayerNode').TileLayerNode.refresh}.
234
+ * @internal
235
+ */
236
+ _addStructuralListener(listener: (event: ChunkStructuralEvent) => void): void;
237
+ /**
238
+ * Unregister a listener added via {@link _addStructuralListener} (node destroy).
239
+ * @internal
240
+ */
241
+ _removeStructuralListener(listener: (event: ChunkStructuralEvent) => void): void;
242
+ private _notifyStructural;
164
243
  /**
165
244
  * Iterate over all loaded chunks in deterministic (cy, cx) ascending order.
166
- * Returns readonly chunk views callers cannot mutate storage.
245
+ * Returns readonly chunk views - callers cannot mutate storage.
167
246
  * @advanced
168
247
  */
169
248
  loadedChunks(): IterableIterator<ReadonlyTileChunk>;
@@ -258,3 +337,4 @@ export declare class TileLayer {
258
337
  */
259
338
  countNonEmptyTiles(): number;
260
339
  }
340
+ //# sourceMappingURL=TileLayer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TileLayer.d.ts","sourceRoot":"","sources":["../../src/TileLayer.ts"],"names":[],"mappings":"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"}