@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 +1 @@
1
- {"version":3,"file":"TileMapView.js","sources":["../../../src/TileMapView.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAwDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BG;MACU,WAAW,CAAA;AACL,IAAA,IAAI;AACJ,IAAA,SAAS;;IAGT,WAAW,GAAoB,EAAE;;AAEjC,IAAA,cAAc,GAAG,IAAI,GAAG,EAAyB;;IAGjD,MAAM,GAAkB,EAAE;;AAE1B,IAAA,WAAW,GAAG,IAAI,GAAG,EAAuB;;IAE5C,SAAS,GAAsB,EAAE;;AAEjC,IAAA,SAAS,GAAG,IAAI,GAAG,EAA8B;;IAEjD,iBAAiB,GAAoB,EAAE;IAEhD,UAAU,GAAG,KAAK;IAClB,cAAc,GAAkB,MAAM;AAE9C;;;;;AAKG;IACH,WAAA,CAAmB,GAAY,EAAE,OAA4B,EAAA;AAC3D,QAAA,IAAI,CAAC,IAAI,GAAG,GAAG;QACf,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,QAAQ,IAAI,IAAI;AAE1C,QAAA,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE;AAC9B,YAAA,MAAM,IAAI,GAAG,IAAI,aAAa,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;AAEnE,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;YAC3B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC;QACzC;AAEA,QAAA,IAAI,OAAO,EAAE,KAAK,EAAE;AAClB,YAAA,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC7D,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC;YACnC;QACF;AAEA,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE;YACnC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAC7B,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;YACnC;QACF;IACF;;AAGA,IAAA,IAAW,GAAG,GAAA;QACZ,OAAO,IAAI,CAAC,IAAI;IAClB;;AAGA,IAAA,IAAW,MAAM,GAAA;QACf,OAAO,IAAI,CAAC,WAAW;IACzB;;AAGA,IAAA,IAAW,KAAK,GAAA;QACd,OAAO,IAAI,CAAC,MAAM;IACpB;;AAGA,IAAA,IAAW,SAAS,GAAA;QAClB,OAAO,IAAI,CAAC,UAAU;IACxB;AAEA;;;;;;;;;;;;AAYG;AACH,IAAA,IAAW,aAAa,GAAA;QACtB,OAAO,IAAI,CAAC,cAAc;IAC5B;IAEA,IAAW,aAAa,CAAC,IAAmB,EAAA;AAC1C,QAAA,IAAI,IAAI,KAAK,IAAI,CAAC,cAAc,EAAE;YAChC;QACF;QAEA,mBAAmB,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAE1B,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE;AACnC,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QAC3B;IACF;AAEA;;;;;AAKG;AACI,IAAA,gBAAgB,CAAC,EAAU,EAAA;QAChC,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;IACpC;AAEA;;;;;AAKG;AACI,IAAA,mBAAmB,CAAC,IAAY,EAAA;AACrC,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;IAClE;AAEA;;;AAGG;AACI,IAAA,IAAI,CAAC,IAAY,EAAA;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAEvC,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,MAAM,IAAI,KAAK,CACb,kCAAkC,IAAI,CAAA,kBAAA,EACpC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA,CAAA,EAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,QACxE,CAAA,CAAA,CAAG,CACJ;QACH;AAEA,QAAA,OAAO,IAAI;IACb;;AAGO,IAAA,OAAO,CAAC,IAAY,EAAA;QACzB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IACnC;AAEA;;;;;;;;;;;;;;;;;AAiBG;IACI,aAAa,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC;QAC5D;AAEA,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM;AACtC,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU;AAEpC,QAAA,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE;AACjC,YAAA,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B;;QAGA,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE;AACxC,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;AAClC,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YACxB;QACF;;QAGA,MAAM,QAAQ,GAAoB,EAAE;AAEpC,QAAA,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE;AACjC,YAAA,IAAI,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAE5C,IAAI,CAAC,IAAI,EAAE;AACT,gBAAA,IAAI,GAAG,IAAI,aAAa,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;AAE7D,gBAAA,IAAI,IAAI,CAAC,cAAc,KAAK,MAAM,EAAE;AAClC,oBAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,cAAc;gBAC1C;gBAEA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC;AACvC,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC;YAClC;AAEA,YAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QACrB;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;QAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;;AAGlC,QAAA,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAkB;QAEnD,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,aAAa,CAAC,OAAO,EAAE;YAAE,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC;AAE5F,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;AAC9B,YAAA,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAClC;;AAGA,QAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC;AAEjC,QAAA,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;YAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAC7B,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;YACnC;QACF;AAEA,QAAA,OAAO,IAAI;IACb;AAEA;;;;;AAKG;IACI,OAAO,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB;QACF;AAEA,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AAEtB,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;YAC9B,IAAI,CAAC,OAAO,EAAE;QAChB;AAEA,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,iBAAiB,EAAE;AACzC,YAAA,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC;YAC9B,IAAI,CAAC,OAAO,EAAE;QAChB;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;AACtB,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;AACxB,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;AACzB,QAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC;AACjC,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;IACxB;;;IAKQ,WAAW,CAAC,IAAY,EAAE,SAAgC,EAAA;AAChE,QAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU;AAEnC,QAAA,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;YAChC,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC;AAEhD,YAAA,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBACrB,MAAM,IAAI,KAAK,CAAC,CAAA,kBAAA,EAAqB,IAAI,CAAA,cAAA,EAAiB,EAAE,CAAA,gBAAA,CAAkB,CAAC;YACjF;YAEA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YAE5C,IAAI,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAC5C,gBAAA,MAAM,IAAI,KAAK,CACb,CAAA,kBAAA,EAAqB,EAAE,CAAA,+BAAA,CAAiC;AACtD,oBAAA,CAAA,EAAA,EAAK,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAA,OAAA,EAAU,IAAI,CAAA,GAAA,CAAK,CAC7D;YACH;AAEA,YAAA,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB;;QAGA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClF,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC;AAEhD,QAAA,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE;YAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;QAChC;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;QAChC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC;IACzE;;IAGQ,gBAAgB,CAAC,QAAgB,EAAE,QAA2B,EAAA;AACpE,QAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;YAChC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AACtC,gBAAA,MAAM,IAAI,KAAK,CACb,CAAA,kBAAA,EAAqB,QAAQ,CAAA,oBAAA,EAAuB,QAAQ,CAAA,SAAA,EAAY,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA,EAAA,CAAI,CAC3F;YACH;AAEA,YAAA,OAAO,QAAQ;QACjB;QAEA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AAEzE,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACxB,YAAA,MAAM,IAAI,KAAK,CACb,CAAA,kBAAA,EAAqB,QAAQ,CAAA,mBAAA,EAAsB,QAAQ,CAAA,UAAA,EAAa,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA,EAAA,CAAI,CAC3F;QACH;AAEA,QAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AACtB,YAAA,MAAM,IAAI,KAAK,CACb,qBAAqB,QAAQ,CAAA,eAAA,EAAkB,QAAQ,CAAA,eAAA,CAAiB;AACtE,gBAAA,CAAA,CAAA,EAAI,OAAO,CAAC,MAAM,CAAA,8CAAA,CAAgD,CACrE;QACH;AAEA,QAAA,OAAO,OAAO,CAAC,CAAC,CAAE,CAAC,EAAE;IACvB;;IAGQ,cAAc,CAAC,IAAmB,EAAE,KAAgB,EAAA;AAC1D,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE;YAChC,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE;AACvC,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAE;AAE5C,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACjB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;gBAE9B;YACF;QACF;IACF;;IAGQ,kBAAkB,CAAC,GAAoB,EAAE,KAAgB,EAAA;AAC/D,QAAA,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,SAAS,EAAE;AACpC,YAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;AAChC,gBAAA,IAAI,QAAQ,KAAK,KAAK,CAAC,EAAE,EAAE;AACzB,oBAAA,OAAO,IAAI;gBACb;YACF;AAAO,iBAAA,IAAI,QAAQ,KAAK,KAAK,CAAC,IAAI,EAAE;gBAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,MAAM;AAEjF,gBAAA,IAAI,QAAQ,KAAK,CAAC,EAAE;AAClB,oBAAA,OAAO,IAAI;gBACb;YACF;QACF;AAEA,QAAA,OAAO,KAAK;IACd;;AAGQ,IAAA,WAAW,CAAC,IAAmB,EAAA;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QAErC,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACnB,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7B;aAAO;YACL,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC;AAExD,YAAA,IAAI,WAAW,KAAK,EAAE,EAAE;gBACtB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YAC/C;QACF;AAEA,QAAA,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAEzC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;AAEjD,QAAA,IAAI,UAAU,KAAK,EAAE,EAAE;YACrB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QACxC;QAEA,IAAI,CAAC,OAAO,EAAE;IAChB;AACD;;;;"}
1
+ {"version":3,"file":"TileMapView.js","names":[],"sources":["../../src/TileMapView.ts"],"sourcesContent":["import { PixelSnapMode } from '@codexo/exojs/renderer-sdk';\n\nimport { ImageLayer } from './ImageLayer';\nimport { ImageLayerNode } from './ImageLayerNode';\nimport { assertPixelSnapMode } from './pixelSnap';\nimport type { TileLayer } from './TileLayer';\nimport { TileLayerNode } from './TileLayerNode';\nimport type { TileMap } from './TileMap';\nimport { TileMapBand } from './TileMapBand';\n\n/**\n * A layer selector inside a {@link TileMapBandDefinition}: either a stable\n * layer **id** (`number`) or a **unique** layer **name** (`string`). Selectors\n * resolve across the map's tile **and** image layers. Names that are shared by\n * more than one layer (of either kind) are rejected as ambiguous - reference\n * such layers by id. An id shared by a tile layer and an image layer (possible\n * only in fallback-ordered maps, which never validated cross-kind uniqueness)\n * is equally ambiguous - reference such layers by a unique name.\n * @advanced\n */\nexport type TileLayerSelector = number | string;\n\n/**\n * The layers composing one band, by id or unique name, in any order. Tile and\n * image layers may be freely mixed. Rendering order always follows the map's\n * combined document order ({@link import('./TileMap').TileMap.renderableLayers})\n * regardless of the order listed here - a definition *selects* layers, it never\n * reorders them. The band's name is the key it is registered under in\n * {@link TileMapViewOptions.bands}.\n * @advanced\n */\nexport type TileMapBandDefinition = readonly TileLayerSelector[];\n\n/**\n * Options for a {@link TileMapView}.\n * @advanced\n */\nexport interface TileMapViewOptions {\n /**\n * Named bands, keyed by band name (keys are unique, so duplicate band names\n * cannot occur). Each value lists the layers that compose the band - tile\n * and image layers alike. Layers not listed in any band remain reachable\n * through {@link TileMapView.getLayerNodeById} and friends and are owned\n * directly by the view (no implicit fallback band). The definition is copied\n * and frozen; mutating the caller's object afterwards does not change band\n * assignments.\n *\n * @throws (at construction) on an unknown layer id, an unknown or ambiguous\n * layer name, a cross-kind ambiguous layer id, a layer listed twice within\n * one band, or a layer assigned to more than one band.\n */\n readonly bands?: Readonly<Record<string, TileMapBandDefinition>>;\n /**\n * Whether the generated {@link TileLayerNode}s' chunks participate in\n * per-chunk view culling. Forwarded to every layer node. Default `true`.\n */\n readonly cullable?: boolean;\n}\n\ninterface ResolvedBandDef {\n readonly name: string;\n readonly selectors: TileMapBandDefinition;\n}\n\n/**\n * Groups a {@link TileMap}'s layers into independently placeable scene nodes so\n * application actors can be interleaved **between** tile layers.\n *\n * A view produces exactly one canonical {@link TileLayerNode} per map layer\n * (stable identity, map document order) and, optionally, named {@link TileMapBand}s\n * grouping subsets of those nodes. The application parents the bands / layer\n * nodes wherever it wants - typically as siblings of its own actor containers:\n *\n * ```ts\n * const view = map.createView({ bands: { ground: ['background', 'ground'], roof: ['roofs'] } });\n * worldRoot.addChild(view.band('ground'), actors, view.band('roof'));\n * // or without bands:\n * worldRoot.addChild(view.getLayerNodeById(groundId)!, actors, view.getLayerNodeById(roofId)!);\n * ```\n *\n * **Actors are application-owned siblings.** A `TileMapView` never adopts or\n * destroys actors. The view is a helper, not a scene node - it does not own the\n * world container, the {@link TileMap}, the {@link TileLayer}s, or tileset\n * textures.\n *\n * **Ownership:** the view owns its generated layer nodes and bands. A layer\n * assigned to a band is owned by that band; an unbanded layer is owned by the\n * view directly. {@link TileMapView.destroy} destroys every band and layer node\n * (detaching them from their application parents) but leaves actors, the map,\n * its layers, and Loader-owned textures untouched. There is no map-replacement\n * mutation API: to swap maps, destroy the old view, construct a new one, and\n * re-parent its bands - the actor tree is never involved.\n *\n * **Image layers.** A view also produces exactly one canonical\n * {@link ImageLayerNode} per {@link TileMap.imageLayers} entry (stable identity,\n * map document order), reachable through {@link imageLayerNodes},\n * {@link getImageLayerNodeById}, and {@link getImageLayerNodeByName}. Image\n * layers are selectable in {@link TileMapViewOptions.bands} exactly like tile\n * layers: a band member list may mix both kinds, and the band stacks its\n * members by the map's combined document order\n * ({@link import('./TileMap').TileMap.renderableLayers}). A banded image node\n * is owned by its band; an unbanded one is owned by the view directly, and the\n * application parents it wherever the image belongs in draw order - the same\n * way actors are interleaved.\n *\n * @advanced\n */\nexport class TileMapView {\n private readonly _map: TileMap;\n private readonly _cullable: boolean;\n\n /** All canonical tile-layer nodes, in map document order. */\n private readonly _layerNodes: TileLayerNode[] = [];\n /** Tile layer id → its canonical layer node. */\n private readonly _layerNodeById = new Map<number, TileLayerNode>();\n\n /** Bands in definition (insertion) order. */\n private readonly _bands: TileMapBand[] = [];\n /** Band name → band. */\n private readonly _bandByName = new Map<string, TileMapBand>();\n /** Original band definitions (frozen) for re-resolution on refresh. */\n private readonly _bandDefs: ResolvedBandDef[] = [];\n /** Layer node → its owning band (absent = view-owned / unbanded). */\n private readonly _nodeBand = new Map<TileLayerNode | ImageLayerNode, TileMapBand>();\n /** Unbanded tile-layer nodes owned directly by the view, in map document order. */\n private readonly _directLayerNodes: TileLayerNode[] = [];\n\n /** All canonical image layer nodes, in map document order. */\n private readonly _imageLayerNodes: ImageLayerNode[] = [];\n /** Image layer id → its canonical image layer node. */\n private readonly _imageLayerNodeById = new Map<number, ImageLayerNode>();\n\n private _destroyed = false;\n private _pixelSnapMode: PixelSnapMode = PixelSnapMode.None;\n\n /**\n * @param map The runtime map to compose. Referenced, never owned.\n * @param options Band definitions and culling.\n * @throws When a band definition references an unknown/ambiguous layer or\n * assigns a layer twice / to multiple bands.\n */\n public constructor(map: TileMap, options?: TileMapViewOptions) {\n this._map = map;\n this._cullable = options?.cullable ?? true;\n\n for (const layer of map.layers) {\n const node = new TileLayerNode(layer, { cullable: this._cullable });\n\n this._layerNodes.push(node);\n this._layerNodeById.set(layer.id, node);\n }\n\n for (const imageLayer of map.imageLayers) {\n const imageNode = new ImageLayerNode(imageLayer);\n\n this._imageLayerNodes.push(imageNode);\n this._imageLayerNodeById.set(imageLayer.id, imageNode);\n }\n\n if (options?.bands) {\n for (const [name, selectors] of Object.entries(options.bands)) {\n this._defineBand(name, selectors);\n }\n }\n\n for (const node of this._layerNodes) {\n if (!this._nodeBand.has(node)) {\n this._directLayerNodes.push(node);\n }\n }\n }\n\n /** The runtime map this view composes. Referenced, never owned. */\n public get map(): TileMap {\n return this._map;\n }\n\n /** All canonical tile-layer nodes, one per map tile layer, in map document order. */\n public get layers(): readonly TileLayerNode[] {\n return this._layerNodes;\n }\n\n /** The bands, in definition (insertion) order. */\n public get bands(): readonly TileMapBand[] {\n return this._bands;\n }\n\n /** Whether this view has been destroyed. */\n public get destroyed(): boolean {\n return this._destroyed;\n }\n\n /**\n * Render-only pixel-snap mode applied to every layer node this view owns (and\n * forwarded to every chunk drawable, current and rebuilt by\n * {@link refreshLayers}). Snaps tile chunk origins to the active render\n * target's device-pixel grid for crisp tiles; with integer tile pitch the grid\n * stays exact and adjacent chunks cannot drift apart. Purely visual - tile\n * data, layer offsets, chunk revisions, and culling are unchanged. Setting the\n * current value is a no-op; an invalid value throws and leaves the prior mode\n * unchanged.\n *\n * @default PixelSnapMode.None\n * @stable\n */\n public get pixelSnapMode(): PixelSnapMode {\n return this._pixelSnapMode;\n }\n\n public set pixelSnapMode(mode: PixelSnapMode) {\n if (mode === this._pixelSnapMode) {\n return;\n }\n\n assertPixelSnapMode(mode);\n this._pixelSnapMode = mode;\n\n for (const node of this._layerNodes) {\n node.pixelSnapMode = mode;\n }\n\n for (const node of this._imageLayerNodes) {\n node.pixelSnapMode = mode;\n }\n }\n\n /**\n * The canonical layer node for the **tile** layer with the given **id**, or\n * `undefined`. Tile ids are authoritative and unique - this is the\n * unambiguous lookup. The returned node may be reparented into the caller's\n * own containers; the view still tracks it for refresh and destruction.\n */\n public getLayerNodeById(id: number): TileLayerNode | undefined {\n return this._layerNodeById.get(id);\n }\n\n /**\n * Every canonical tile-layer node whose layer has the given **name**, in map\n * document order. Layer names are not guaranteed unique, so this returns an\n * array (empty when no layer matches). Prefer {@link getLayerNodeById} when\n * you have the id.\n */\n public getLayerNodesByName(name: string): readonly TileLayerNode[] {\n return this._layerNodes.filter(node => node.layer.name === name);\n }\n\n /** All canonical image layer nodes, one per map image layer, in map document order. */\n public get imageLayerNodes(): readonly ImageLayerNode[] {\n return this._imageLayerNodes;\n }\n\n /**\n * The canonical image layer node for the image layer with the given **id**,\n * or `undefined`. Ids are authoritative and unique - this is the unambiguous\n * lookup. The returned node may be reparented into the caller's own\n * containers; the view still tracks it for refresh and destruction.\n */\n public getImageLayerNodeById(id: number): ImageLayerNode | undefined {\n return this._imageLayerNodeById.get(id);\n }\n\n /**\n * The canonical image layer node for the image layer with the given\n * **name**, or `undefined` if no image layer has that name. Prefer\n * {@link getImageLayerNodeById} when you have the id.\n * @throws If more than one image layer shares that name (reference such\n * layers by id instead).\n */\n public getImageLayerNodeByName(name: string): ImageLayerNode | undefined {\n const matches = this._map.imageLayers.filter(layer => layer.name === name);\n\n if (matches.length === 0) {\n return undefined;\n }\n\n if (matches.length > 1) {\n throw new Error(`TileMapView image layer name \"${name}\" is ambiguous ` + `(${matches.length} image layers share it); reference it by id instead.`);\n }\n\n return this._imageLayerNodeById.get(matches[0]!.id);\n }\n\n /**\n * The band registered under `name`.\n * @throws If no band with that name was defined.\n */\n public band(name: string): TileMapBand {\n const band = this._bandByName.get(name);\n\n if (!band) {\n throw new Error(\n `TileMapView has no band named \"${name}\". Defined bands: ${this._bands.length > 0 ? this._bands.map(b => `\"${b.name}\"`).join(', ') : '(none)'}.`,\n );\n }\n\n return band;\n }\n\n /** Whether a band with the given name was defined. */\n public hasBand(name: string): boolean {\n return this._bandByName.has(name);\n }\n\n /**\n * Rebuild the view after **structural** map changes (tile or image layers\n * added to or removed from the map). Ordinary tile edits and chunk\n * creation/removal do NOT need this - those are handled by chunk revisions\n * and {@link TileLayerNode.refresh} respectively.\n *\n * - Removed layers (tile or image): their generated node is detached and\n * destroyed.\n * - Unchanged layers: keep their existing node (stable identity).\n * - Added layers (tile or image): a new node is created and assigned to the\n * first band whose definition selects it (by a currently-unambiguous id or\n * name), otherwise owned directly by the view.\n * - Every band's children are re-ordered to the map's combined document\n * order ({@link import('./TileMap').TileMap.renderableLayers}).\n *\n * Application actors are never touched, and bands keep their placement in the\n * application scene graph.\n *\n * @throws If the view has been destroyed.\n */\n public refreshLayers(): this {\n if (this._destroyed) {\n throw new Error('Cannot refresh a destroyed TileMapView.');\n }\n\n const currentLayers = this._map.layers;\n const currentIds = new Set<number>();\n\n for (const layer of currentLayers) {\n currentIds.add(layer.id);\n }\n\n // 1. Remove nodes whose layer no longer exists.\n for (const node of [...this._layerNodes]) {\n if (!currentIds.has(node.layer.id)) {\n this._removeTileNode(node);\n }\n }\n\n const currentImageLayers = new Set(this._map.imageLayers);\n\n for (const node of [...this._imageLayerNodes]) {\n if (!currentImageLayers.has(node.layer)) {\n this._removeImageNode(node);\n }\n }\n\n // 2. Re-derive the doc-ordered node lists, creating + assigning new nodes.\n const newOrder: TileLayerNode[] = [];\n\n for (const layer of currentLayers) {\n let node = this._layerNodeById.get(layer.id);\n\n if (!node) {\n node = new TileLayerNode(layer, { cullable: this._cullable });\n\n if (this._pixelSnapMode !== PixelSnapMode.None) {\n node.pixelSnapMode = this._pixelSnapMode;\n }\n\n this._layerNodeById.set(layer.id, node);\n this._assignNewNode(node, layer);\n }\n\n newOrder.push(node);\n }\n\n this._layerNodes.length = 0;\n this._layerNodes.push(...newOrder);\n\n const newImageOrder: ImageLayerNode[] = [];\n\n for (const imageLayer of this._map.imageLayers) {\n let node = this._imageLayerNodes.find(candidate => candidate.layer === imageLayer);\n\n if (!node) {\n node = new ImageLayerNode(imageLayer);\n\n if (this._pixelSnapMode !== PixelSnapMode.None) {\n node.pixelSnapMode = this._pixelSnapMode;\n }\n\n this._imageLayerNodeById.set(imageLayer.id, node);\n this._assignNewNode(node, imageLayer);\n }\n\n newImageOrder.push(node);\n }\n\n this._imageLayerNodes.length = 0;\n this._imageLayerNodes.push(...newImageOrder);\n\n // 3. Re-order each band's children to the combined document order. Keyed\n // by layer instance: fallback-ordered maps may share an id across kinds.\n const documentIndex = new Map<TileLayer | ImageLayer, number>();\n\n for (const [index, layer] of this._map.renderableLayers.entries()) {\n documentIndex.set(layer, index);\n }\n\n for (const band of this._bands) {\n band._reorder(documentIndex);\n }\n\n // 4. Rebuild the unbanded set in doc order.\n this._directLayerNodes.length = 0;\n\n for (const node of newOrder) {\n if (!this._nodeBand.has(node)) {\n this._directLayerNodes.push(node);\n }\n }\n\n return this;\n }\n\n /**\n * Destroy the view: every band, generated tile-layer node, and generated\n * {@link ImageLayerNode} is destroyed (and detached from its application\n * parent), freeing cached chunk geometry. Banded nodes are destroyed by\n * their band; unbanded ones by the view directly. Idempotent. Application\n * actors, sibling content, the {@link TileMap}, its {@link TileLayer}s and\n * image layers, and Loader-owned textures all survive.\n */\n public destroy(): void {\n if (this._destroyed) {\n return;\n }\n\n this._destroyed = true;\n\n for (const band of this._bands) {\n band.destroy();\n }\n\n for (const node of this._directLayerNodes) {\n node.parent?.removeChild(node);\n node.destroy();\n }\n\n for (const node of this._imageLayerNodes) {\n if (this._nodeBand.has(node)) {\n continue; // Owned and already destroyed by its band.\n }\n\n node.parent?.removeChild(node);\n node.destroy();\n }\n\n this._bands.length = 0;\n this._bandByName.clear();\n this._bandDefs.length = 0;\n this._directLayerNodes.length = 0;\n this._layerNodes.length = 0;\n this._layerNodeById.clear();\n this._nodeBand.clear();\n this._imageLayerNodes.length = 0;\n this._imageLayerNodeById.clear();\n }\n\n // ── Internals ──────────────────────────────────────────────────────────\n\n /** Resolve one band definition into a {@link TileMapBand} and record it. */\n private _defineBand(name: string, selectors: TileMapBandDefinition): void {\n const members = new Set<TileLayer | ImageLayer>();\n\n for (const selector of selectors) {\n const layer = this._resolveSelector(name, selector);\n\n if (members.has(layer)) {\n throw new Error(`TileMapView band \"${name}\" lists layer ${layer.id} more than once.`);\n }\n\n const existing = this._nodeFor(layer);\n\n if (existing && this._nodeBand.has(existing)) {\n throw new Error(`TileMapView layer ${layer.id} is assigned to multiple bands ` + `(\"${this._nodeBand.get(existing)!.name}\" and \"${name}\").`);\n }\n\n members.add(layer);\n }\n\n // Order members by combined document order (membership selects; doc order\n // renders - tile and image members interleave).\n const orderedNodes: Array<TileLayerNode | ImageLayerNode> = [];\n\n for (const layer of this._map.renderableLayers) {\n if (members.has(layer)) {\n orderedNodes.push(this._nodeFor(layer)!);\n }\n }\n\n const band = new TileMapBand(name, orderedNodes);\n\n for (const node of orderedNodes) {\n this._nodeBand.set(node, band);\n }\n\n this._bands.push(band);\n this._bandByName.set(name, band);\n this._bandDefs.push({ name, selectors: Object.freeze([...selectors]) });\n }\n\n /**\n * Resolve a single selector to a tile or image layer instance, throwing on\n * unknown/ambiguous. Instances (not ids) disambiguate fallback-ordered maps\n * in which a tile layer and an image layer share an id.\n */\n private _resolveSelector(bandName: string, selector: TileLayerSelector): TileLayer | ImageLayer {\n if (typeof selector === 'number') {\n const tileLayer = this._map.getTileLayerById(selector);\n const imageLayer = this._map.imageLayers.find(layer => layer.id === selector);\n\n if (tileLayer && imageLayer) {\n throw new Error(\n `TileMapView band \"${bandName}\": layer id ${selector} is ambiguous ` +\n `(a tile layer and an image layer share it); reference it by a unique name instead.`,\n );\n }\n\n const layer = tileLayer ?? imageLayer;\n\n if (!layer) {\n throw new Error(`TileMapView band \"${bandName}\": no layer with id ${selector} in map \"${this._map.name}\".`);\n }\n\n return layer;\n }\n\n const matches: Array<TileLayer | ImageLayer> = [\n ...this._map.layers.filter(layer => layer.name === selector),\n ...this._map.imageLayers.filter(layer => layer.name === selector),\n ];\n\n if (matches.length === 0) {\n throw new Error(`TileMapView band \"${bandName}\": no layer named \"${selector}\" in map \"${this._map.name}\".`);\n }\n\n if (matches.length > 1) {\n throw new Error(\n `TileMapView band \"${bandName}\": layer name \"${selector}\" is ambiguous ` + `(${matches.length} layers share it); reference it by id instead.`,\n );\n }\n\n return matches[0]!;\n }\n\n /** The canonical node for a tile or image layer instance, if one exists. */\n private _nodeFor(layer: TileLayer | ImageLayer): TileLayerNode | ImageLayerNode | undefined {\n if (layer instanceof ImageLayer) {\n // Instance scan rather than the id map: image ids are not validated\n // unique, and fallback maps may collide with tile ids anyway.\n return this._imageLayerNodes.find(node => node.layer === layer);\n }\n\n return this._layerNodeById.get(layer.id);\n }\n\n /** Assign a freshly created node to the first band that selects its layer. */\n private _assignNewNode(node: TileLayerNode | ImageLayerNode, layer: TileLayer | ImageLayer): void {\n for (const def of this._bandDefs) {\n if (this._definitionSelects(def, layer)) {\n const band = this._bandByName.get(def.name)!;\n\n band._adopt(node);\n this._nodeBand.set(node, band);\n\n return;\n }\n }\n }\n\n /**\n * Whether a band definition selects the given layer - only by a selector\n * that is currently unambiguous (a unique name, or an id not shared across\n * kinds), mirroring {@link _resolveSelector}'s construction-time rules.\n */\n private _definitionSelects(def: ResolvedBandDef, layer: TileLayer | ImageLayer): boolean {\n for (const selector of def.selectors) {\n if (typeof selector === 'number') {\n if (selector === layer.id && !this._isCrossKindId(selector)) {\n return true;\n }\n } else if (selector === layer.name) {\n const sameName =\n this._map.layers.filter(other => other.name === selector).length + this._map.imageLayers.filter(other => other.name === selector).length;\n\n if (sameName === 1) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /** Whether an id currently belongs to both a tile layer and an image layer. */\n private _isCrossKindId(id: number): boolean {\n return this._map.getTileLayerById(id) !== undefined && this._map.imageLayers.some(layer => layer.id === id);\n }\n\n /** Detach + destroy a tile node, dropping it from bands and registries. */\n private _removeTileNode(node: TileLayerNode): void {\n this._releaseFromOwner(node);\n\n node.parent?.removeChild(node);\n this._layerNodeById.delete(node.layer.id);\n\n const orderIndex = this._layerNodes.indexOf(node);\n\n if (orderIndex !== -1) {\n this._layerNodes.splice(orderIndex, 1);\n }\n\n node.destroy();\n }\n\n /** Detach + destroy an image node, dropping it from bands and registries. */\n private _removeImageNode(node: ImageLayerNode): void {\n this._releaseFromOwner(node);\n\n node.parent?.removeChild(node);\n\n if (this._imageLayerNodeById.get(node.layer.id) === node) {\n this._imageLayerNodeById.delete(node.layer.id);\n }\n\n const orderIndex = this._imageLayerNodes.indexOf(node);\n\n if (orderIndex !== -1) {\n this._imageLayerNodes.splice(orderIndex, 1);\n }\n\n node.destroy();\n }\n\n /** Release a node from its band, or from the view's direct-ownership list. */\n private _releaseFromOwner(node: TileLayerNode | ImageLayerNode): void {\n const band = this._nodeBand.get(node);\n\n if (band) {\n band._release(node);\n this._nodeBand.delete(node);\n } else if (node instanceof TileLayerNode) {\n const directIndex = this._directLayerNodes.indexOf(node);\n\n if (directIndex !== -1) {\n this._directLayerNodes.splice(directIndex, 1);\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -23,15 +23,15 @@ export interface TileSetOptions {
23
23
  readonly margin?: number;
24
24
  /** Tileset class/type string (Tiled `class`). Defaults to `''`. */
25
25
  readonly class?: string;
26
- /** Visual drawing offset in pixels applied to every tile of this set. Defaults to 0. */
26
+ /** Visual drawing offset in pixels applied to every tile of this set drawn by a tile layer. Defaults to 0. */
27
27
  readonly offsetX?: number;
28
- /** Visual drawing offset in pixels applied to every tile of this set. Defaults to 0. */
28
+ /** Visual drawing offset in pixels applied to every tile of this set drawn by a tile layer. Defaults to 0. */
29
29
  readonly offsetY?: number;
30
30
  }
31
31
  /**
32
32
  * A resolved tileset: a uniform grid of tiles within a texture atlas.
33
33
  *
34
- * Does **not** own its texture the Loader or application code retains
34
+ * Does **not** own its texture - the Loader or application code retains
35
35
  * texture ownership. Tileset dimensions are validated at construction and
36
36
  * frozen thereafter.
37
37
  *
@@ -42,7 +42,7 @@ export interface TileSetOptions {
42
42
  export declare class TileSet {
43
43
  /** Stable runtime name. */
44
44
  readonly name: string;
45
- /** Atlas texture region Loader-owned, never destroyed by the tileset. */
45
+ /** Atlas texture region - Loader-owned, never destroyed by the tileset. */
46
46
  readonly texture: TextureRegion;
47
47
  /** Tile width in pixels. */
48
48
  readonly tileWidth: number;
@@ -60,9 +60,17 @@ export declare class TileSet {
60
60
  readonly margin: number;
61
61
  /** Tileset class/type string (Tiled `class`; may be empty). */
62
62
  readonly class: string;
63
- /** Visual drawing offset X in pixels, applied to every tile of this set. */
63
+ /**
64
+ * Visual drawing offset X in pixels (Tiled `tileoffset`).
65
+ *
66
+ * Applied by the tile-layer geometry builder and by the tile-collision
67
+ * helpers - i.e. wherever this package places a tile on a grid. It is **not**
68
+ * folded into a {@link TileObject}'s `x`/`y`: object layers are data-only, so
69
+ * code that draws a tile object itself has to add this offset the way a tile
70
+ * layer would.
71
+ */
64
72
  readonly offsetX: number;
65
- /** Visual drawing offset Y in pixels, applied to every tile of this set. */
73
+ /** Visual drawing offset Y in pixels (Tiled `tileoffset`) - see {@link offsetX} for where it applies. */
66
74
  readonly offsetY: number;
67
75
  private readonly _definitions;
68
76
  /**
@@ -109,3 +117,4 @@ export declare class TileSet {
109
117
  */
110
118
  get allDefinitions(): Readonly<Record<number, TileProperties | undefined>>;
111
119
  }
120
+ //# sourceMappingURL=TileSet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TileSet.d.ts","sourceRoot":"","sources":["../../src/TileSet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9D;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,oCAAoC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,qCAAqC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,6CAA6C;IAC7C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,oGAAoG;IACpG,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,oDAAoD;IACpD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,mEAAmE;IACnE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,8GAA8G;IAC9G,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,8GAA8G;IAC9G,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;GAUG;AACH,qBAAa,OAAO;IAClB,2BAA2B;IAC3B,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B,2EAA2E;IAC3E,SAAgB,OAAO,EAAE,aAAa,CAAC;IAEvC,4BAA4B;IAC5B,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,6BAA6B;IAC7B,SAAgB,UAAU,EAAE,MAAM,CAAC;IAEnC,4CAA4C;IAC5C,SAAgB,SAAS,EAAE,MAAM,CAAC;IAElC,2CAA2C;IAC3C,SAAgB,OAAO,EAAE,MAAM,CAAC;IAChC,uDAAuD;IACvD,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B,gDAAgD;IAChD,SAAgB,OAAO,EAAE,MAAM,CAAC;IAChC,qCAAqC;IACrC,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,+DAA+D;IAC/D,SAAgB,KAAK,EAAE,MAAM,CAAC;IAC9B;;;;;;;;OAQG;IACH,SAAgB,OAAO,EAAE,MAAM,CAAC;IAChC,yGAAyG;IACzG,SAAgB,OAAO,EAAE,MAAM,CAAC;IAEhC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsC;IAEnE;;OAEG;gBACgB,OAAO,EAAE,cAAc;IAyD1C;;;;OAIG;IACI,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;IAerF;;;;OAIG;IACI,eAAe,CAAC,WAAW,EAAE,SAAS,cAAc,EAAE,GAAG,IAAI;IAgBpE;;;OAGG;IACI,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIzE;;;;OAIG;IACI,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAchG;;;OAGG;IACI,YAAY,IAAI,gBAAgB,CAAC,cAAc,CAAC;IAIvD;;;;OAIG;IACH,IAAW,cAAc,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC,CAAC,CAMhF;CACF"}
@@ -1,185 +1,165 @@
1
- import { validatePositiveInteger, validateNonNegativeInteger } from './types.js';
1
+ import { validateNonNegativeInteger, validatePositiveInteger } from "./types.js";
2
2
 
3
+ //#region src/TileSet.ts
3
4
  /**
4
- * A resolved tileset: a uniform grid of tiles within a texture atlas.
5
- *
6
- * Does **not** own its texture the Loader or application code retains
7
- * texture ownership. Tileset dimensions are validated at construction and
8
- * frozen thereafter.
9
- *
10
- * Multiple tilesets are supported per {@link TileMap}; each carries its own
11
- * tile dimensions, spacing, and optional per-tile metadata.
12
- * @advanced
13
- */
14
- class TileSet {
15
- /** Stable runtime name. */
16
- name;
17
- /** Atlas texture region Loader-owned, never destroyed by the tileset. */
18
- texture;
19
- /** Tile width in pixels. */
20
- tileWidth;
21
- /** Tile height in pixels. */
22
- tileHeight;
23
- /** Total number of tiles in the tileset. */
24
- tileCount;
25
- /** Number of columns in the atlas grid. */
26
- columns;
27
- /** Number of rows implied by tileCount and columns. */
28
- rows;
29
- /** Pixel spacing between tiles in the atlas. */
30
- spacing;
31
- /** Pixel margin around the atlas. */
32
- margin;
33
- /** Tileset class/type string (Tiled `class`; may be empty). */
34
- class;
35
- /** Visual drawing offset X in pixels, applied to every tile of this set. */
36
- offsetX;
37
- /** Visual drawing offset Y in pixels, applied to every tile of this set. */
38
- offsetY;
39
- _definitions;
40
- /**
41
- * @throws When dimensions, counts, or spacing values are invalid.
42
- */
43
- constructor(options) {
44
- if (!options.name || typeof options.name !== 'string') {
45
- throw new Error('TileSet name must be a non-empty string.');
46
- }
47
- if (!options.texture) {
48
- throw new Error('TileSet requires a valid TextureRegion.');
49
- }
50
- validatePositiveInteger(options.tileWidth, 'tileWidth');
51
- validatePositiveInteger(options.tileHeight, 'tileHeight');
52
- validatePositiveInteger(options.tileCount, 'tileCount');
53
- const spacing = options.spacing ?? 0;
54
- const margin = options.margin ?? 0;
55
- validateNonNegativeInteger(spacing, 'spacing');
56
- validateNonNegativeInteger(margin, 'margin');
57
- const atlasWidth = options.texture.width - margin * 2;
58
- const atlasHeight = options.texture.height - margin * 2;
59
- const columns = options.columns ?? Math.floor(atlasWidth / options.tileWidth);
60
- validatePositiveInteger(columns, 'columns');
61
- if (columns <= 0) {
62
- throw new Error(`TileSet columns must be positive (got ${columns}).`);
63
- }
64
- if (options.tileWidth * columns + spacing * (columns - 1) > atlasWidth) {
65
- throw new Error(`TileSet grid width exceeds atlas: ${options.tileWidth}*${columns}` +
66
- ` + ${spacing}*${columns - 1} > ${atlasWidth}.`);
67
- }
68
- const rows = Math.ceil(options.tileCount / columns);
69
- if (rows > 0 && options.tileHeight * rows + spacing * (rows - 1) > atlasHeight) {
70
- throw new Error(`TileSet grid height exceeds atlas: ${options.tileHeight}*${rows}` +
71
- ` + ${spacing}*${rows - 1} > ${atlasHeight}.`);
72
- }
73
- this.name = options.name;
74
- this.texture = options.texture;
75
- this.tileWidth = options.tileWidth;
76
- this.tileHeight = options.tileHeight;
77
- this.tileCount = options.tileCount;
78
- this.columns = columns;
79
- this.rows = rows;
80
- this.spacing = spacing;
81
- this.margin = margin;
82
- this.class = options.class ?? '';
83
- this.offsetX = options.offsetX ?? 0;
84
- this.offsetY = options.offsetY ?? 0;
85
- this._definitions = new Map();
86
- }
87
- /**
88
- * Set per-tile metadata for a local tile ID.
89
- * Copies input to prevent caller-owned mutation leaking into the tileset.
90
- * @internal
91
- */
92
- _setDefinition(localTileId, definition) {
93
- if (localTileId < 0 || localTileId >= this.tileCount) {
94
- throw new Error(`Tile definition localTileId ${localTileId} out of range [0, ${this.tileCount - 1}].`);
95
- }
96
- const props = definition.properties
97
- ? Object.freeze({ ...definition.properties })
98
- : undefined;
99
- const animation = definition.animation
100
- ? Object.freeze(definition.animation.map(frame => Object.freeze({ ...frame })))
101
- : undefined;
102
- const collision = definition.collision
103
- ? Object.freeze([...definition.collision])
104
- : undefined;
105
- this._definitions.set(localTileId, {
106
- localTileId,
107
- ...(props !== undefined && { properties: props }),
108
- ...(animation !== undefined && { animation }),
109
- ...(collision !== undefined && { collision }),
110
- });
111
- }
112
- /**
113
- * Build definitions from an array, replacing the internal definitions map.
114
- * Each entry's properties are copied and frozen.
115
- * @internal
116
- */
117
- _setDefinitions(definitions) {
118
- const map = this._definitions;
119
- map.clear();
120
- for (const def of definitions) {
121
- const props = def.properties
122
- ? Object.freeze({ ...def.properties })
123
- : undefined;
124
- const animation = def.animation
125
- ? Object.freeze(def.animation.map(frame => Object.freeze({ ...frame })))
126
- : undefined;
127
- const collision = def.collision
128
- ? Object.freeze([...def.collision])
129
- : undefined;
130
- map.set(def.localTileId, {
131
- localTileId: def.localTileId,
132
- ...(props !== undefined && { properties: props }),
133
- ...(animation !== undefined && { animation }),
134
- ...(collision !== undefined && { collision }),
135
- });
136
- }
137
- }
138
- /**
139
- * Retrieve per-tile metadata, or undefined if none defined.
140
- * @advanced
141
- */
142
- getTileDefinition(localTileId) {
143
- return this._definitions.get(localTileId);
144
- }
145
- /**
146
- * Compute the pixel-space source rectangle for a local tile ID
147
- * within the atlas, accounting for columns, spacing, and margin.
148
- * @advanced
149
- */
150
- getTileRect(localTileId) {
151
- if (localTileId < 0 || localTileId >= this.tileCount) {
152
- throw new Error(`getTileRect: localTileId ${localTileId} out of range [0, ${this.tileCount - 1}].`);
153
- }
154
- const col = localTileId % this.columns;
155
- const row = Math.floor(localTileId / this.columns);
156
- return {
157
- x: this.margin + col * (this.tileWidth + this.spacing),
158
- y: this.margin + row * (this.tileHeight + this.spacing),
159
- width: this.tileWidth,
160
- height: this.tileHeight,
161
- };
162
- }
163
- /**
164
- * Iterate over all defined tiles (sparse).
165
- * @advanced
166
- */
167
- definedTiles() {
168
- return this._definitions.values();
169
- }
170
- /**
171
- * Read-only snapshot of all per-tile definitions.
172
- * The returned record is a caller-owned copy.
173
- * @advanced
174
- */
175
- get allDefinitions() {
176
- const result = {};
177
- for (const [id, def] of this._definitions) {
178
- result[id] = def.properties;
179
- }
180
- return Object.freeze(result);
181
- }
182
- }
5
+ * A resolved tileset: a uniform grid of tiles within a texture atlas.
6
+ *
7
+ * Does **not** own its texture - the Loader or application code retains
8
+ * texture ownership. Tileset dimensions are validated at construction and
9
+ * frozen thereafter.
10
+ *
11
+ * Multiple tilesets are supported per {@link TileMap}; each carries its own
12
+ * tile dimensions, spacing, and optional per-tile metadata.
13
+ * @advanced
14
+ */
15
+ var TileSet = class {
16
+ /** Stable runtime name. */
17
+ name;
18
+ /** Atlas texture region - Loader-owned, never destroyed by the tileset. */
19
+ texture;
20
+ /** Tile width in pixels. */
21
+ tileWidth;
22
+ /** Tile height in pixels. */
23
+ tileHeight;
24
+ /** Total number of tiles in the tileset. */
25
+ tileCount;
26
+ /** Number of columns in the atlas grid. */
27
+ columns;
28
+ /** Number of rows implied by tileCount and columns. */
29
+ rows;
30
+ /** Pixel spacing between tiles in the atlas. */
31
+ spacing;
32
+ /** Pixel margin around the atlas. */
33
+ margin;
34
+ /** Tileset class/type string (Tiled `class`; may be empty). */
35
+ class;
36
+ /**
37
+ * Visual drawing offset X in pixels (Tiled `tileoffset`).
38
+ *
39
+ * Applied by the tile-layer geometry builder and by the tile-collision
40
+ * helpers - i.e. wherever this package places a tile on a grid. It is **not**
41
+ * folded into a {@link TileObject}'s `x`/`y`: object layers are data-only, so
42
+ * code that draws a tile object itself has to add this offset the way a tile
43
+ * layer would.
44
+ */
45
+ offsetX;
46
+ /** Visual drawing offset Y in pixels (Tiled `tileoffset`) - see {@link offsetX} for where it applies. */
47
+ offsetY;
48
+ _definitions;
49
+ /**
50
+ * @throws When dimensions, counts, or spacing values are invalid.
51
+ */
52
+ constructor(options) {
53
+ if (!options.name || typeof options.name !== "string") throw new Error("TileSet name must be a non-empty string.");
54
+ if (!options.texture) throw new Error("TileSet requires a valid TextureRegion.");
55
+ validatePositiveInteger(options.tileWidth, "tileWidth");
56
+ validatePositiveInteger(options.tileHeight, "tileHeight");
57
+ validatePositiveInteger(options.tileCount, "tileCount");
58
+ const spacing = options.spacing ?? 0;
59
+ const margin = options.margin ?? 0;
60
+ validateNonNegativeInteger(spacing, "spacing");
61
+ validateNonNegativeInteger(margin, "margin");
62
+ const atlasWidth = options.texture.width - margin * 2;
63
+ const atlasHeight = options.texture.height - margin * 2;
64
+ const columns = options.columns ?? Math.floor(atlasWidth / options.tileWidth);
65
+ validatePositiveInteger(columns, "columns");
66
+ if (columns <= 0) throw new Error(`TileSet columns must be positive (got ${columns}).`);
67
+ if (options.tileWidth * columns + spacing * (columns - 1) > atlasWidth) throw new Error(`TileSet grid width exceeds atlas: ${options.tileWidth}*${columns} + ${spacing}*${columns - 1} > ${atlasWidth}.`);
68
+ const rows = Math.ceil(options.tileCount / columns);
69
+ if (rows > 0 && options.tileHeight * rows + spacing * (rows - 1) > atlasHeight) throw new Error(`TileSet grid height exceeds atlas: ${options.tileHeight}*${rows} + ${spacing}*${rows - 1} > ${atlasHeight}.`);
70
+ this.name = options.name;
71
+ this.texture = options.texture;
72
+ this.tileWidth = options.tileWidth;
73
+ this.tileHeight = options.tileHeight;
74
+ this.tileCount = options.tileCount;
75
+ this.columns = columns;
76
+ this.rows = rows;
77
+ this.spacing = spacing;
78
+ this.margin = margin;
79
+ this.class = options.class ?? "";
80
+ this.offsetX = options.offsetX ?? 0;
81
+ this.offsetY = options.offsetY ?? 0;
82
+ this._definitions = /* @__PURE__ */ new Map();
83
+ }
84
+ /**
85
+ * Set per-tile metadata for a local tile ID.
86
+ * Copies input to prevent caller-owned mutation leaking into the tileset.
87
+ * @internal
88
+ */
89
+ _setDefinition(localTileId, definition) {
90
+ if (localTileId < 0 || localTileId >= this.tileCount) throw new Error(`Tile definition localTileId ${localTileId} out of range [0, ${this.tileCount - 1}].`);
91
+ const props = definition.properties ? Object.freeze({ ...definition.properties }) : void 0;
92
+ const animation = definition.animation ? Object.freeze(definition.animation.map((frame) => Object.freeze({ ...frame }))) : void 0;
93
+ const collision = definition.collision ? Object.freeze([...definition.collision]) : void 0;
94
+ this._definitions.set(localTileId, {
95
+ localTileId,
96
+ ...props !== void 0 && { properties: props },
97
+ ...animation !== void 0 && { animation },
98
+ ...collision !== void 0 && { collision }
99
+ });
100
+ }
101
+ /**
102
+ * Build definitions from an array, replacing the internal definitions map.
103
+ * Each entry's properties are copied and frozen.
104
+ * @internal
105
+ */
106
+ _setDefinitions(definitions) {
107
+ const map = this._definitions;
108
+ map.clear();
109
+ for (const def of definitions) {
110
+ const props = def.properties ? Object.freeze({ ...def.properties }) : void 0;
111
+ const animation = def.animation ? Object.freeze(def.animation.map((frame) => Object.freeze({ ...frame }))) : void 0;
112
+ const collision = def.collision ? Object.freeze([...def.collision]) : void 0;
113
+ map.set(def.localTileId, {
114
+ localTileId: def.localTileId,
115
+ ...props !== void 0 && { properties: props },
116
+ ...animation !== void 0 && { animation },
117
+ ...collision !== void 0 && { collision }
118
+ });
119
+ }
120
+ }
121
+ /**
122
+ * Retrieve per-tile metadata, or undefined if none defined.
123
+ * @advanced
124
+ */
125
+ getTileDefinition(localTileId) {
126
+ return this._definitions.get(localTileId);
127
+ }
128
+ /**
129
+ * Compute the pixel-space source rectangle for a local tile ID
130
+ * within the atlas, accounting for columns, spacing, and margin.
131
+ * @advanced
132
+ */
133
+ getTileRect(localTileId) {
134
+ if (localTileId < 0 || localTileId >= this.tileCount) throw new Error(`getTileRect: localTileId ${localTileId} out of range [0, ${this.tileCount - 1}].`);
135
+ const col = localTileId % this.columns;
136
+ const row = Math.floor(localTileId / this.columns);
137
+ return {
138
+ x: this.margin + col * (this.tileWidth + this.spacing),
139
+ y: this.margin + row * (this.tileHeight + this.spacing),
140
+ width: this.tileWidth,
141
+ height: this.tileHeight
142
+ };
143
+ }
144
+ /**
145
+ * Iterate over all defined tiles (sparse).
146
+ * @advanced
147
+ */
148
+ definedTiles() {
149
+ return this._definitions.values();
150
+ }
151
+ /**
152
+ * Read-only snapshot of all per-tile definitions.
153
+ * The returned record is a caller-owned copy.
154
+ * @advanced
155
+ */
156
+ get allDefinitions() {
157
+ const result = {};
158
+ for (const [id, def] of this._definitions) result[id] = def.properties;
159
+ return Object.freeze(result);
160
+ }
161
+ };
183
162
 
163
+ //#endregion
184
164
  export { TileSet };
185
- //# sourceMappingURL=TileSet.js.map
165
+ //# sourceMappingURL=TileSet.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TileSet.js","sources":["../../../src/TileSet.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TileSet.js","names":[],"sources":["../../src/TileSet.ts"],"sourcesContent":["import type { TextureRegion } from '@codexo/exojs';\n\nimport type { TileDefinition, TileProperties } from './types';\nimport { validateNonNegativeInteger, validatePositiveInteger } from './types';\n\n/**\n * Options for constructing a {@link TileSet}.\n * @advanced\n */\nexport interface TileSetOptions {\n /** Stable runtime name (unique within a {@link TileMap}). */\n readonly name: string;\n /** Texture atlas for this tileset. Textures are Loader-owned. */\n readonly texture: TextureRegion;\n /** Width of each tile in pixels. */\n readonly tileWidth: number;\n /** Height of each tile in pixels. */\n readonly tileHeight: number;\n /** Total number of tiles in this tileset. */\n readonly tileCount: number;\n /** Number of tile columns in the atlas grid. Computed from texture width / tileWidth if omitted. */\n readonly columns?: number;\n /** Pixel spacing between tiles in the atlas. Defaults to 0. */\n readonly spacing?: number;\n /** Pixel margin around the atlas. Defaults to 0. */\n readonly margin?: number;\n /** Tileset class/type string (Tiled `class`). Defaults to `''`. */\n readonly class?: string;\n /** Visual drawing offset in pixels applied to every tile of this set drawn by a tile layer. Defaults to 0. */\n readonly offsetX?: number;\n /** Visual drawing offset in pixels applied to every tile of this set drawn by a tile layer. Defaults to 0. */\n readonly offsetY?: number;\n}\n\n/**\n * A resolved tileset: a uniform grid of tiles within a texture atlas.\n *\n * Does **not** own its texture - the Loader or application code retains\n * texture ownership. Tileset dimensions are validated at construction and\n * frozen thereafter.\n *\n * Multiple tilesets are supported per {@link TileMap}; each carries its own\n * tile dimensions, spacing, and optional per-tile metadata.\n * @advanced\n */\nexport class TileSet {\n /** Stable runtime name. */\n public readonly name: string;\n\n /** Atlas texture region - Loader-owned, never destroyed by the tileset. */\n public readonly texture: TextureRegion;\n\n /** Tile width in pixels. */\n public readonly tileWidth: number;\n /** Tile height in pixels. */\n public readonly tileHeight: number;\n\n /** Total number of tiles in the tileset. */\n public readonly tileCount: number;\n\n /** Number of columns in the atlas grid. */\n public readonly columns: number;\n /** Number of rows implied by tileCount and columns. */\n public readonly rows: number;\n\n /** Pixel spacing between tiles in the atlas. */\n public readonly spacing: number;\n /** Pixel margin around the atlas. */\n public readonly margin: number;\n\n /** Tileset class/type string (Tiled `class`; may be empty). */\n public readonly class: string;\n /**\n * Visual drawing offset X in pixels (Tiled `tileoffset`).\n *\n * Applied by the tile-layer geometry builder and by the tile-collision\n * helpers - i.e. wherever this package places a tile on a grid. It is **not**\n * folded into a {@link TileObject}'s `x`/`y`: object layers are data-only, so\n * code that draws a tile object itself has to add this offset the way a tile\n * layer would.\n */\n public readonly offsetX: number;\n /** Visual drawing offset Y in pixels (Tiled `tileoffset`) - see {@link offsetX} for where it applies. */\n public readonly offsetY: number;\n\n private readonly _definitions: ReadonlyMap<number, TileDefinition>;\n\n /**\n * @throws When dimensions, counts, or spacing values are invalid.\n */\n public constructor(options: TileSetOptions) {\n if (!options.name || typeof options.name !== 'string') {\n throw new Error('TileSet name must be a non-empty string.');\n }\n\n if (!options.texture) {\n throw new Error('TileSet requires a valid TextureRegion.');\n }\n\n validatePositiveInteger(options.tileWidth, 'tileWidth');\n validatePositiveInteger(options.tileHeight, 'tileHeight');\n validatePositiveInteger(options.tileCount, 'tileCount');\n\n const spacing = options.spacing ?? 0;\n const margin = options.margin ?? 0;\n validateNonNegativeInteger(spacing, 'spacing');\n validateNonNegativeInteger(margin, 'margin');\n\n const atlasWidth = options.texture.width - margin * 2;\n const atlasHeight = options.texture.height - margin * 2;\n\n const columns = options.columns ?? Math.floor(atlasWidth / options.tileWidth);\n\n validatePositiveInteger(columns, 'columns');\n if (columns <= 0) {\n throw new Error(`TileSet columns must be positive (got ${columns}).`);\n }\n\n if (options.tileWidth * columns + spacing * (columns - 1) > atlasWidth) {\n throw new Error(`TileSet grid width exceeds atlas: ${options.tileWidth}*${columns}` + ` + ${spacing}*${columns - 1} > ${atlasWidth}.`);\n }\n\n const rows = Math.ceil(options.tileCount / columns);\n if (rows > 0 && options.tileHeight * rows + spacing * (rows - 1) > atlasHeight) {\n throw new Error(`TileSet grid height exceeds atlas: ${options.tileHeight}*${rows}` + ` + ${spacing}*${rows - 1} > ${atlasHeight}.`);\n }\n\n this.name = options.name;\n this.texture = options.texture;\n this.tileWidth = options.tileWidth;\n this.tileHeight = options.tileHeight;\n this.tileCount = options.tileCount;\n this.columns = columns;\n this.rows = rows;\n this.spacing = spacing;\n this.margin = margin;\n this.class = options.class ?? '';\n this.offsetX = options.offsetX ?? 0;\n this.offsetY = options.offsetY ?? 0;\n\n this._definitions = new Map();\n\n if (__DEV__) {\n Object.freeze(this);\n }\n }\n\n /**\n * Set per-tile metadata for a local tile ID.\n * Copies input to prevent caller-owned mutation leaking into the tileset.\n * @internal\n */\n public _setDefinition(localTileId: number, definition: Partial<TileDefinition>): void {\n if (localTileId < 0 || localTileId >= this.tileCount) {\n throw new Error(`Tile definition localTileId ${localTileId} out of range [0, ${this.tileCount - 1}].`);\n }\n const props = definition.properties ? Object.freeze({ ...definition.properties }) : undefined;\n const animation = definition.animation ? Object.freeze(definition.animation.map(frame => Object.freeze({ ...frame }))) : undefined;\n const collision = definition.collision ? Object.freeze([...definition.collision]) : undefined;\n (this._definitions as Map<number, TileDefinition>).set(localTileId, {\n localTileId,\n ...(props !== undefined && { properties: props }),\n ...(animation !== undefined && { animation }),\n ...(collision !== undefined && { collision }),\n });\n }\n\n /**\n * Build definitions from an array, replacing the internal definitions map.\n * Each entry's properties are copied and frozen.\n * @internal\n */\n public _setDefinitions(definitions: readonly TileDefinition[]): void {\n const map = this._definitions as Map<number, TileDefinition>;\n map.clear();\n for (const def of definitions) {\n const props = def.properties ? Object.freeze({ ...def.properties }) : undefined;\n const animation = def.animation ? Object.freeze(def.animation.map(frame => Object.freeze({ ...frame }))) : undefined;\n const collision = def.collision ? Object.freeze([...def.collision]) : undefined;\n map.set(def.localTileId, {\n localTileId: def.localTileId,\n ...(props !== undefined && { properties: props }),\n ...(animation !== undefined && { animation }),\n ...(collision !== undefined && { collision }),\n });\n }\n }\n\n /**\n * Retrieve per-tile metadata, or undefined if none defined.\n * @advanced\n */\n public getTileDefinition(localTileId: number): TileDefinition | undefined {\n return this._definitions.get(localTileId);\n }\n\n /**\n * Compute the pixel-space source rectangle for a local tile ID\n * within the atlas, accounting for columns, spacing, and margin.\n * @advanced\n */\n public getTileRect(localTileId: number): { x: number; y: number; width: number; height: number } {\n if (localTileId < 0 || localTileId >= this.tileCount) {\n throw new Error(`getTileRect: localTileId ${localTileId} out of range [0, ${this.tileCount - 1}].`);\n }\n const col = localTileId % this.columns;\n const row = Math.floor(localTileId / this.columns);\n return {\n x: this.margin + col * (this.tileWidth + this.spacing),\n y: this.margin + row * (this.tileHeight + this.spacing),\n width: this.tileWidth,\n height: this.tileHeight,\n };\n }\n\n /**\n * Iterate over all defined tiles (sparse).\n * @advanced\n */\n public definedTiles(): IterableIterator<TileDefinition> {\n return this._definitions.values();\n }\n\n /**\n * Read-only snapshot of all per-tile definitions.\n * The returned record is a caller-owned copy.\n * @advanced\n */\n public get allDefinitions(): Readonly<Record<number, TileProperties | undefined>> {\n const result: Record<number, TileProperties | undefined> = {};\n for (const [id, def] of this._definitions) {\n result[id] = def.properties;\n }\n return Object.freeze(result);\n }\n}\n"],"mappings":"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"}
@@ -7,9 +7,9 @@ export interface WangSetOptions {
7
7
  /**
8
8
  * Map from Wang bitmask to local tile ID within the tileset.
9
9
  *
10
- * For blob mode (8-neighbor), keys are 0255; the 47 valid combinations
10
+ * For blob mode (8-neighbor), keys are 0-255; the 47 valid combinations
11
11
  * of the blob encoding must be covered at minimum.
12
- * For edge mode (4-neighbor), keys are 015.
12
+ * For edge mode (4-neighbor), keys are 0-15.
13
13
  *
14
14
  * Accepts either a {@link ReadonlyMap} or a plain `Record<number, number>`.
15
15
  */
@@ -23,7 +23,7 @@ export interface WangSetOptions {
23
23
  * Membership is what {@link autoTile} / `refreshCell` use to decide whether a
24
24
  * neighbouring cell is "part of the terrain". Because every value in
25
25
  * `blobMap` is itself a member, group membership stays stable no matter which
26
- * variant a cell currently shows that is what makes incremental
26
+ * variant a cell currently shows - that is what makes incremental
27
27
  * `refreshCell` correct. Add the *base* tile ID you paint with here if it is
28
28
  * not already one of the blobMap variants.
29
29
  */
@@ -44,7 +44,7 @@ export interface WangSetOptions {
44
44
  * - Bit 7 (128): Bottom-right
45
45
  *
46
46
  * Diagonal (corner) bits are only set when both adjacent cardinal directions
47
- * are also set reducing 256 raw combinations to 47 meaningful blob states.
47
+ * are also set - reducing 256 raw combinations to 47 meaningful blob states.
48
48
  *
49
49
  * Edge bitmask bit layout:
50
50
  * - Bit 0 (1): Top
@@ -77,3 +77,4 @@ export declare class WangSet {
77
77
  /** Read-only view of the local tile IDs that count as group members. */
78
78
  get members(): ReadonlySet<number>;
79
79
  }
80
+ //# sourceMappingURL=WangSet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WangSet.d.ts","sourceRoot":"","sources":["../../src/WangSet.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qFAAqF;IACrF,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;;;OAQG;IACH,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9D,kFAAkF;IAClF,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,OAAO;IAClB,yDAAyD;IACzD,SAAgB,YAAY,EAAE,MAAM,CAAC;IAErC,qEAAqE;IACrE,SAAgB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAEtC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA8B;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;gBAE5B,OAAO,EAAE,cAAc;IAwB1C;;;OAGG;IACI,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIlD;;;;;OAKG;IACI,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAI7C,4DAA4D;IAC5D,IAAW,OAAO,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAEhD;IAED,wEAAwE;IACxE,IAAW,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,CAExC;CACF"}