@codexo/exojs-tilemap 0.15.3 → 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":"WebGpuTileChunkRenderer.js","sources":["../../../../src/webgpu/WebGpuTileChunkRenderer.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WebGpuTileChunkRenderer.js","names":["tileShaderTemplate"],"sources":["../../../src/webgpu/WebGpuTileChunkRenderer.ts"],"sourcesContent":["/// <reference types=\"@webgpu/types\" />\n\nimport { Matrix } from '@codexo/exojs';\nimport type {\n RenderTexture,\n WebGpuActiveRenderPass,\n WebGpuRetainedBatchPayload,\n WebGpuRetainedBatchReplayer,\n WebGpuRetainedNodeIndexRange,\n} from '@codexo/exojs/renderer-sdk';\nimport type { View, WebGpuBackend } from '@codexo/exojs/renderer-sdk';\nimport {\n AbstractWebGpuRenderer,\n type BlendModes,\n DataTexture,\n fillShaderSource,\n getWebGpuBlendState,\n packAffineMat4,\n packedGroupChanged,\n packSnapViewport,\n retainedGroupUniformBytes,\n stencilContentDepthStencilState,\n Texture,\n} from '@codexo/exojs/renderer-sdk';\n\nimport type { TileQuad } from '../chunkGeometry';\nimport type { TileChunkNode } from '../TileChunkNode';\nimport { TILE_DIAGONAL_BIT, TILE_ROW_MASK } from '../tileWord';\nimport tileShaderTemplate from './shaders/tile-chunk.wgsl';\n\nconst instanceStrideBytes = 32;\nconst wordsPerInstance = instanceStrideBytes / Uint32Array.BYTES_PER_ELEMENT; // = 8\n// mat4x4 projection + mat4x4 group + vec4 snap viewport (aligned 16, total 144).\nconst projectionByteLength = 144;\nconst initialBatchCapacity = 256;\nconst indicesPerInstance = 6;\nconst quadIndices = new Uint16Array([0, 1, 2, 0, 2, 3]);\n\nconst tileShaderSource = fillShaderSource(tileShaderTemplate, { tileRowMask: TILE_ROW_MASK, tileDiagonalBit: TILE_DIAGONAL_BIT });\n\n/**\n * Instanced WebGPU renderer for {@link TileChunkNode}, the parity counterpart of\n * the WebGL2 renderer. Same instance layout and orientation handling; per-chunk\n * transforms ride on the backend's shared transform storage buffer, and the\n * instance buffer grows on demand rather than flushing in fixed runs.\n * @internal\n */\nexport class WebGpuTileChunkRenderer extends AbstractWebGpuRenderer<TileChunkNode> implements WebGpuRetainedBatchReplayer {\n /**\n * Retained-batch capability opt-in: a tile chunk's per-flush\n * instanced batches (fixed 32-byte layout, tile word at word 7) record and\n * replay from group-owned resources. Pixel-snapped draws are excluded by\n * the collect-time recordability predicate (and belt-and-braces poisoning\n * in {@link render}); tile chunks have no custom-material path to exclude.\n * @internal\n */\n public readonly _supportsRetainedBatches = true;\n\n private readonly _projectionData = new Float32Array(projectionByteLength / Float32Array.BYTES_PER_ELEMENT);\n // Projection-uniform skip state: a matching (view identity, view.updateId)\n // pair AND unchanged group-matrix CONTENT (compared against the packed floats\n // at [16, 32), staged into `_stagedGroupData` by `_groupContentChanged`) mean\n // the shared UBO already holds this flush's projection, so the 128-byte write\n // is skipped.\n //\n // Content comparison, not the backend's group-transform id: a projection\n // rewrite is a PASS boundary below, so a group boundary that restores\n // byte-identical group bytes must not read as a change - otherwise a retained\n // group entered and left around tile chunks splits the single-submit frame.\n private _writtenView: View | null = null;\n private _writtenViewUpdateId = -1;\n private _hasWrittenProjection = false;\n private readonly _stagedGroupData = new Float32Array(16);\n\n private _device: GPUDevice | null = null;\n private _shaderModule: GPUShaderModule | null = null;\n private _uniformBindGroupLayout: GPUBindGroupLayout | null = null;\n private _textureBindGroupLayout: GPUBindGroupLayout | null = null;\n private _pipelineLayout: GPUPipelineLayout | null = null;\n private _uniformBuffer: GPUBuffer | null = null;\n private _transformBindGroup: GPUBindGroup | null = null;\n private _transformStorageBuffer: GPUBuffer | null = null;\n private _indexBuffer: GPUBuffer | null = null;\n private _instanceBuffer: GPUBuffer | null = null;\n // Capacity of the GPU instance buffer, in BYTES: it carries every flush the\n // open pass has taken, not just the pending one. The CPU staging array is\n // sized separately (in instances) because it only ever holds one flush.\n private _instanceBufferCapacity = 0;\n private _instanceStagingCapacity = 0;\n private _instanceData: ArrayBuffer = new ArrayBuffer(0);\n private _instanceFloat32 = new Float32Array(this._instanceData);\n private _instanceUint32 = new Uint32Array(this._instanceData);\n private readonly _pipelines = new Map<string, GPURenderPipeline>();\n // group(1) texture bind groups cached per texture (mirrors the sprite/\n // nine-slice renderers): resolving `backend.getTextureBinding` is what\n // syncs a dirty/mutated texture's content to the GPU, so it must run every\n // flush/replay even when the bind group itself is served from cache.\n private _textureBindGroups = new WeakMap<Texture | RenderTexture, { group: GPUBindGroup; view: GPUTextureView; sampler: GPUSampler }>();\n\n private _quadIndex = 0;\n private _maxNodeIndex = 0;\n // Chunk nodes booked against the PENDING batch, and whether the chunk being\n // rendered right now has already been booked. One chunk emits one tile\n // instance per tile, so the recorded batch's `submittedNodes` contribution is\n // this count and not `_quadIndex`. A chunk whose pages span several batches is\n // booked once, against the batch its first page lands in.\n private _batchNodeCount = 0;\n private _nodeBooked = false;\n private _currentBlendMode: BlendModes | null = null;\n private _currentTexture: Texture | null = null;\n\n // ── Pass-scoped write cursor ──────────────────────────────────────────────\n // `flush()` no longer ends the pass, so consecutive flushes record into ONE\n // open pass and ONE submit. Everything written into the shared instance\n // buffer is therefore scoped to that pass, not to a single flush: a flush\n // that rewrote the buffer from offset 0 would have the earlier flushes' draws\n // read this flush's bytes, because `queue.writeBuffer` is ordered against the\n // submit and not against the individual draws inside it. Each flush appends\n // at `_instancePassBytes` instead and adds the base at bind time.\n //\n // `_passDraws` is the open pass this renderer has actually RECORDED draws\n // into. Pass identity is the key: the coordinator builds a fresh active-pass\n // object on every acquire, so a pass ended by anyone else (a target switch, a\n // stencil clip, another renderer) is distinguished automatically.\n private _passDraws: WebGpuActiveRenderPass | null = null;\n private _instancePassBytes = 0;\n\n // ── Retained-batch replay state ───────────────────────────────────────────\n private readonly _stagedReplayGroupData = new Float32Array(16);\n // Reused single-slot texture list handed to the backend at record time; a\n // tile chunk batch always binds exactly one tileset texture (slot 0).\n private readonly _recordTextures: Array<Texture | RenderTexture | null> = [null];\n\n protected onConnect(backend: WebGpuBackend): void {\n if (this._device) {\n return;\n }\n\n this._device = backend.device;\n this._shaderModule = this._device.createShaderModule({ code: tileShaderSource });\n\n this._uniformBindGroupLayout = this._device.createBindGroupLayout({\n entries: [\n { binding: 0, visibility: GPUShaderStage.VERTEX, buffer: { type: 'uniform' } },\n { binding: 1, visibility: GPUShaderStage.VERTEX, buffer: { type: 'read-only-storage' } },\n ],\n });\n\n this._textureBindGroupLayout = this._device.createBindGroupLayout({\n entries: [\n { binding: 0, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'float' } },\n { binding: 1, visibility: GPUShaderStage.FRAGMENT, sampler: { type: 'filtering' } },\n ],\n });\n\n this._pipelineLayout = this._device.createPipelineLayout({\n bindGroupLayouts: [this._uniformBindGroupLayout, this._textureBindGroupLayout],\n });\n\n this._uniformBuffer = this._device.createBuffer({\n size: projectionByteLength,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n\n this._indexBuffer = this._device.createBuffer({\n size: quadIndices.byteLength,\n usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST,\n });\n this._device.queue.writeBuffer(this._indexBuffer, 0, quadIndices.buffer, quadIndices.byteOffset, quadIndices.byteLength);\n }\n\n protected onDisconnect(): void {\n // The teardown below destroys the very buffers a draw of ours left in the\n // open pass still binds, and the pass no longer ends at the tail of a\n // flush. Submit it first so those draws reach the queue against live\n // buffers. Backend destroy and device loss drop the pass before disconnecting\n // renderers, so this only fires when a renderer is disconnected on its own.\n const coordinator = this._backend?._passCoordinator ?? null;\n\n if (coordinator !== null && this._passDraws !== null && this._passDraws === coordinator.activePass) {\n coordinator.endPass();\n }\n\n this._instanceBuffer?.destroy();\n this._indexBuffer?.destroy();\n this._uniformBuffer?.destroy();\n this._pipelines.clear();\n this._instanceBuffer = null;\n this._indexBuffer = null;\n this._transformBindGroup = null;\n this._transformStorageBuffer = null;\n // Bind groups belong to the (possibly lost) device; drop the cache so\n // reconnect rebuilds them against the fresh device.\n this._textureBindGroups = new WeakMap<Texture | RenderTexture, { group: GPUBindGroup; view: GPUTextureView; sampler: GPUSampler }>();\n this._uniformBuffer = null;\n this._pipelineLayout = null;\n this._textureBindGroupLayout = null;\n this._uniformBindGroupLayout = null;\n this._shaderModule = null;\n this._device = null;\n this._backend = null;\n this._instanceBufferCapacity = 0;\n this._instanceStagingCapacity = 0;\n this._instanceData = new ArrayBuffer(0);\n this._instanceFloat32 = new Float32Array(this._instanceData);\n this._instanceUint32 = new Uint32Array(this._instanceData);\n this._passDraws = null;\n this._instancePassBytes = 0;\n this._quadIndex = 0;\n this._maxNodeIndex = 0;\n this._batchNodeCount = 0;\n this._nodeBooked = false;\n this._currentBlendMode = null;\n this._currentTexture = null;\n this._writtenView = null;\n this._writtenViewUpdateId = -1;\n this._hasWrittenProjection = false;\n }\n\n public render(node: TileChunkNode): void {\n const backend = this._backend;\n\n if (backend === null) {\n return;\n }\n\n const pages = node.pages;\n\n this._nodeBooked = false;\n\n if (pages.length === 0) {\n return;\n }\n\n const blendMode = node.blendMode;\n const tintRgba = node.tint.toRgba8();\n\n const command = backend.activeDrawCommand;\n const nodeIndex = command !== null ? command.nodeIndex : backend._pushTransform(node);\n\n for (const page of pages) {\n this._renderPage(backend, page.texture, page.quads, blendMode, tintRgba, nodeIndex);\n }\n }\n\n private _renderPage(backend: WebGpuBackend, texture: Texture, quads: readonly TileQuad[], blendMode: BlendModes, tintRgba: number, nodeIndex: number): void {\n if (quads.length === 0) {\n return;\n }\n\n if (texture.width === 0 || texture.height === 0) {\n return;\n }\n\n // A null `source` means a Texture still waiting on its image - but\n // DataTexture extends Texture and keeps its pixels in a CPU buffer, so it\n // has none by design. Without the exemption a procedurally-generated\n // tileset renders as nothing here while WebGL2, which has no such guard,\n // draws it.\n if (texture instanceof Texture && !(texture instanceof DataTexture) && texture.source === null) {\n return;\n }\n\n const blendModeChanged = this._currentBlendMode !== null && blendMode !== this._currentBlendMode;\n const textureChanged = this._currentTexture !== null && texture !== this._currentTexture;\n // Overflowing the CPU staging array flushes the accumulated run rather than\n // growing it. The GPU buffer is NOT what this asks about: it now carries\n // every flush in the pass, so flushing frees no room there - its capacity is\n // resolved in `flush()` against the pass total.\n const willExceed = this._quadIndex + quads.length > this._instanceStagingCapacity && this._instanceStagingCapacity > 0;\n\n if ((blendModeChanged || textureChanged || willExceed) && this._quadIndex > 0) {\n this.flush();\n }\n\n this._currentBlendMode = blendMode;\n this._currentTexture = texture;\n backend.setBlendMode(blendMode);\n\n this._ensureStagingCapacity(this._quadIndex + quads.length);\n\n // Booked after the flush decision above, so the chunk lands on the batch\n // that actually holds its first tile; the flag keeps a multi-page chunk from\n // being booked once per page.\n if (!this._nodeBooked) {\n this._nodeBooked = true;\n this._batchNodeCount++;\n }\n\n const f32 = this._instanceFloat32;\n const u32 = this._instanceUint32;\n const flipYTexture = texture.flipY;\n const baseWord = nodeIndex & TILE_ROW_MASK;\n\n for (const q of quads) {\n const idx = this._quadIndex * wordsPerInstance;\n\n f32[idx + 0] = q.x0;\n f32[idx + 1] = q.y0;\n f32[idx + 2] = q.x1;\n f32[idx + 3] = q.y1;\n\n const flipX = (q.orient & 1) !== 0;\n const tileFlipY = (q.orient & 2) !== 0;\n const diagonal = (q.orient & 4) !== 0;\n\n const uA = flipX ? q.u1 : q.u0;\n const uB = flipX ? q.u0 : q.u1;\n let vA = tileFlipY ? q.v1 : q.v0;\n let vB = tileFlipY ? q.v0 : q.v1;\n\n if (flipYTexture) {\n const swap = vA;\n vA = vB;\n vB = swap;\n }\n\n const uMin = (uA * 0xffff) & 0xffff;\n const vMin = (vA * 0xffff) & 0xffff;\n const uMax = (uB * 0xffff) & 0xffff;\n const vMax = (vB * 0xffff) & 0xffff;\n\n u32[idx + 4] = uMin | (vMin << 16);\n u32[idx + 5] = uMax | (vMax << 16);\n u32[idx + 6] = tintRgba;\n u32[idx + 7] = (diagonal ? baseWord | TILE_DIAGONAL_BIT : baseWord) >>> 0;\n\n this._quadIndex++;\n }\n\n if (nodeIndex > this._maxNodeIndex) {\n this._maxNodeIndex = nodeIndex;\n }\n }\n\n public flush(): void {\n const backend = this._backend;\n const device = this._device;\n const uniformBuffer = this._uniformBuffer;\n\n if (!backend || !device || !uniformBuffer) {\n return;\n }\n\n if (this._quadIndex === 0 && !backend.clearRequested) {\n return;\n }\n\n // ProjectionUniforms layout: mat4x4 projection + mat4x4 group + vec4 snap\n // viewport, packed via the shared canonical (non-transposed) column order\n // (same layout as the sprite/nine-slice renderers' group UBO). The write\n // is skipped when the UBO already holds this exact\n // (view, updateId, group bytes, snap-rect) state.\n const view = backend.view;\n const viewportChanged = packSnapViewport(backend, this._projectionData, 32);\n const projectionChanged =\n !this._hasWrittenProjection ||\n this._writtenView !== view ||\n this._writtenViewUpdateId !== view.updateId ||\n viewportChanged ||\n this._groupContentChanged(backend);\n\n const scissor = backend.getScissorRect();\n const maskClipsAll = scissor !== null && (scissor.width <= 0 || scissor.height <= 0);\n\n const coordinator = backend._passCoordinator;\n // Aliased as consts so the `willDraw` predicate narrows them for the draw\n // block below (the same narrowing the inlined condition used to provide).\n const texture = this._currentTexture;\n const blendMode = this._currentBlendMode;\n const indexBuffer = this._indexBuffer;\n const willDraw = this._quadIndex > 0 && !maskClipsAll && texture !== null && blendMode !== null && indexBuffer !== null;\n\n const flushBytes = this._quadIndex * instanceStrideBytes;\n // Sized for everything this pass has taken SO FAR plus this flush, captured\n // BEFORE the guard below may reset the cursor - and used to size the buffer\n // even when it does split. Sizing to the lone flush that remains after a\n // split would peg the buffer at one flush forever: the guard would split,\n // the split would shrink the requirement back, the capacity would never\n // ratchet, and every flush would open its own pass again.\n const targetInstanceBytes = this._instancePassBytes + flushBytes;\n const ownDrawsInPass = this._passDraws !== null && this._passDraws === coordinator.activePass;\n\n // Two predicates, deliberately different. The first gates the hazards\n // against resources only THIS renderer binds - the projection UBO (rewritten\n // at offset 0, which would retroactively re-project our earlier draws) and\n // the instance buffer (whose reallocation frees what those draws read) - so\n // it asks this renderer's own cursor. The second gates the two SHARED ones\n // (transform storage, managed texture content), which the pass may hold\n // another renderer's draws against, so it asks the coordinator. Both land on\n // the queue timeline ahead of the deferred submit, and both are answered by\n // ending (submitting) the pass first.\n if (\n (ownDrawsInPass && (projectionChanged || (willDraw && targetInstanceBytes > this._instanceBufferCapacity))) ||\n (willDraw && coordinator.passHasDraws && (backend._textureUploadWouldMutate(texture) || backend._transformStorageWouldGrow(this._maxNodeIndex + 1)))\n ) {\n coordinator.endPass();\n }\n\n // Any boundary above - or one another renderer hit since our last flush -\n // means the open pass no longer holds our draws, so the cursor restarts.\n if (this._passDraws !== coordinator.activePass) {\n this._passDraws = null;\n this._instancePassBytes = 0;\n }\n\n if (projectionChanged) {\n packAffineMat4(view.getTransform(), this._projectionData, 0);\n packAffineMat4(backend.renderGroupTransform ?? Matrix.identity, this._projectionData, 16);\n\n this._writtenView = view;\n this._writtenViewUpdateId = view.updateId;\n this._hasWrittenProjection = true;\n\n device.queue.writeBuffer(uniformBuffer, 0, this._projectionData.buffer, this._projectionData.byteOffset, this._projectionData.byteLength);\n }\n\n // A flush whose quads are entirely clipped away by the mask draws nothing,\n // so it only needs a pass at all when a clear is still pending - opened\n // here so `createColorAttachment` consumes the clear-state once. With no\n // clear pending, skip `acquirePass` entirely rather than open (and count)\n // a pass no draw will land in.\n if (willDraw || backend.clearRequested) {\n const active = coordinator.acquirePass();\n const pass = active.pass;\n\n if (willDraw) {\n const instanceBuffer = this._ensureInstanceBufferCapacity(device, targetInstanceBytes);\n const instanceByteOffset = this._instancePassBytes;\n\n device.queue.writeBuffer(instanceBuffer, instanceByteOffset, this._instanceData, 0, flushBytes);\n\n const storage = backend.getTransformStorageBuffer(this._maxNodeIndex + 1);\n const transformBindGroup = this._getOrCreateTransformBindGroup(device, uniformBuffer, storage.buffer);\n const textureBindGroup = this._getOrCreateTextureBindGroup(device, backend, texture);\n\n const stencil = coordinator.stencilActive;\n const pipeline = this._getPipeline(blendMode, backend.renderTargetFormat, stencil);\n\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, transformBindGroup);\n pass.setBindGroup(1, textureBindGroup);\n pass.setVertexBuffer(0, instanceBuffer, instanceByteOffset);\n pass.setIndexBuffer(indexBuffer, 'uint16');\n pass.drawIndexed(indicesPerInstance, this._quadIndex, 0, 0, 0);\n\n // The pass stays open; the cursor carries this flush's consumption forward\n // so the next flush in the same pass appends AFTER the slice these draws\n // read instead of overwriting it.\n this._instancePassBytes = instanceByteOffset + flushBytes;\n this._passDraws = active;\n coordinator.markPassDraws();\n backend.stats.batches++;\n backend.stats.drawCalls++;\n }\n }\n\n // Retained capture: while a capture window is active, additionally stage\n // this batch's exact packed bytes into the group-owned bundle - the\n // recorded data IS the drawn data, byte-identical by construction.\n // Recorded regardless of the live visibility decision above (mask/\n // scissor), since visibility is re-evaluated live at replay. A batch\n // always binds a single tileset texture (slot 0); a pixel-snapped node\n // already poisoned the capture in render().\n if (this._quadIndex > 0 && backend._retainedCaptureActive && blendMode !== null && texture !== null) {\n this._recordTextures[0] = texture;\n backend._recordRetainedBatch(this, this._instanceData, flushBytes, this._quadIndex, blendMode, this._recordTextures, 1, null, null, this._batchNodeCount);\n }\n\n // The pass is deliberately left OPEN. It ends at genuine boundaries only\n // (the backend's frame/plan end, a target or view switch, a stencil clip)\n // and at the hazard splits above, so N tile-chunk flushes in a frame cost\n // one pass and one submit rather than N.\n this._quadIndex = 0;\n this._maxNodeIndex = 0;\n this._batchNodeCount = 0;\n this._currentBlendMode = null;\n this._currentTexture = null;\n }\n\n /**\n * Whether the packed floats of the active group matrix differ from what the\n * shared projection UBO currently holds at [16, 32). Stages the packed matrix\n * into `_stagedGroupData` as a side effect (idempotent - safe to call more\n * than once per flush).\n */\n private _groupContentChanged(backend: WebGpuBackend): boolean {\n packAffineMat4(backend.renderGroupTransform ?? Matrix.identity, this._stagedGroupData, 0);\n\n if (!this._hasWrittenProjection) {\n return true;\n }\n\n return packedGroupChanged(this._stagedGroupData, this._projectionData, 16);\n }\n\n public destroy(): void {\n this.disconnect();\n }\n\n private _getOrCreateTransformBindGroup(device: GPUDevice, uniformBuffer: GPUBuffer, storageBuffer: GPUBuffer): GPUBindGroup {\n if (this._transformBindGroup !== null && this._transformStorageBuffer === storageBuffer) {\n return this._transformBindGroup;\n }\n\n this._transformStorageBuffer = storageBuffer;\n this._transformBindGroup = device.createBindGroup({\n layout: this._uniformBindGroupLayout!,\n entries: [\n { binding: 0, resource: { buffer: uniformBuffer } },\n { binding: 1, resource: { buffer: storageBuffer } },\n ],\n });\n\n return this._transformBindGroup;\n }\n\n /**\n * Build (or reuse) the group(1) texture bind group for `texture`. The\n * binding is resolved BEFORE the cache lookup on purpose: resolving is what\n * syncs a dirty/mutated texture's content to the GPU, so it must run every\n * flush/replay even when the bind group itself is served from cache.\n */\n private _getOrCreateTextureBindGroup(device: GPUDevice, backend: WebGpuBackend, texture: Texture | RenderTexture): GPUBindGroup {\n const { view, sampler } = backend.getTextureBinding(texture);\n const cached = this._textureBindGroups.get(texture);\n\n if (cached?.view === view && cached.sampler === sampler) {\n return cached.group;\n }\n\n const group = device.createBindGroup({\n layout: this._textureBindGroupLayout!,\n entries: [\n { binding: 0, resource: view },\n { binding: 1, resource: sampler },\n ],\n });\n\n this._textureBindGroups.set(texture, { group, view, sampler });\n\n return group;\n }\n\n // ── Retained-batch record/replay ──────────────────────────────────────────\n // The bundle/stage stores raw instance bytes; this renderer owns the\n // 32-byte (8-word) layout (tile word at word 7: transform row in bits\n // 0..28, diagonal flip in bit 29), so the layout-aware finalize steps\n // (node-index scan/rebase) and the replay dispatch live here - mirroring\n // WebGpuNineSliceSpriteRenderer's seam.\n\n /** @internal See {@link WebGpuRetainedBatchReplayer._scanRetainedNodeIndexRange}. */\n public _scanRetainedNodeIndexRange(bytes: Uint8Array, range: WebGpuRetainedNodeIndexRange): void {\n const words = new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / Uint32Array.BYTES_PER_ELEMENT);\n\n for (let i = 7; i < words.length; i += 8) {\n // In-bounds: i < words.length via the loop guard. The tile word is the\n // last word of the 32-byte (8-word) instance layout; only the low 29\n // bits address the transform buffer row.\n const row = words[i]! & TILE_ROW_MASK;\n\n if (row < range.min) {\n range.min = row;\n }\n\n if (row > range.max) {\n range.max = row;\n }\n }\n }\n\n /** @internal See {@link WebGpuRetainedBatchReplayer._rebaseRetainedNodeIndices} (group-local indices). */\n public _rebaseRetainedNodeIndices(bytes: Uint8Array, base: number): void {\n const words = new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / Uint32Array.BYTES_PER_ELEMENT);\n\n for (let i = 7; i < words.length; i += 8) {\n // In-bounds: i < words.length via the loop guard. Rebase ONLY the row\n // field; the diagonal-flip bit must survive untouched or tile\n // orientation corrupts.\n const word = words[i]!;\n const diagonal = word & TILE_DIAGONAL_BIT;\n const row = word & TILE_ROW_MASK;\n\n words[i] = (diagonal | ((row - base) & TILE_ROW_MASK)) >>> 0;\n }\n }\n\n /**\n * Replay one recorded batch from its group-owned bundle into the OPEN pass.\n * Reuses only recorded DATA (instance bytes, transform rows, texture, blend\n * mode); every piece of STATE is resolved live - pipeline via the\n * `_getPipeline` cache, the group(1) texture bind group via the live\n * texture-set cache (resolving re-syncs dirty content), and the group's\n * 128-byte UBO (projection from the live view + the live composed group\n * matrix) written only when its content changed. The same-frame\n * double-replay hazard (one group under two views while the open pass\n * already holds this bundle's draws) ends the pass first.\n * @internal\n */\n public _replayRetainedBatch(payload: WebGpuRetainedBatchPayload): void {\n const backend = this._backend;\n const device = this._device;\n const bundle = payload.bundle;\n\n if (!backend || !device || this._indexBuffer === null || !bundle.isReady) {\n return;\n }\n\n // Drain any pending live batch first (defensive - the group boundary\n // already flushed; flush() is a no-op when nothing is pending).\n this.flush();\n\n // Match the live path's visibility handling: a fully-clipped scissor\n // draws nothing (the batch stays recorded; visibility is live per frame).\n const scissor = backend.getScissorRect();\n\n if (scissor !== null && (scissor.width <= 0 || scissor.height <= 0)) {\n return;\n }\n\n const coordinator = backend._passCoordinator;\n\n // Same-frame texture mutation guard: resolving the bindings below\n // re-uploads mutated content on the queue timeline BEFORE the deferred\n // submit, which would retroactively change draws already recorded into\n // the open pass. End (submit) the pass first so they keep the\n // pre-mutation content. The texture cache is shared and the pass survives\n // a renderer switch, so any recorded draw is at risk, not just one of ours.\n if (coordinator.passHasDraws) {\n for (const texture of payload.textures) {\n if (backend._textureUploadWouldMutate(texture)) {\n coordinator.endPass();\n break;\n }\n }\n }\n\n // Resolve the single tileset texture LIVE through the texture bind-group\n // cache (syncs dirty content, adopts refreshed views/samplers). The\n // recorded batch always has exactly one texture (slot 0).\n const textureBindGroup = this._getOrCreateTextureBindGroup(device, backend, payload.textures[0]!);\n\n // Group UBO: skip the write while (view, updateId, group bytes) match\n // what the buffer holds; guard the double-replay aliasing case first.\n const view = backend.view;\n const scratch = this._stagedReplayGroupData;\n\n packAffineMat4(backend.renderGroupTransform ?? Matrix.identity, scratch, 0);\n\n // Staged unconditionally: an unchanged rect makes this an identity write,\n // while a changed one forces the rewrite the skip state cannot see.\n const viewportChanged = packSnapViewport(backend, bundle.uboData, 32);\n\n let uboDirty = !bundle.uboWritten || bundle.uboView !== view || bundle.uboViewUpdateId !== view.updateId || viewportChanged;\n\n if (!uboDirty) {\n for (let i = 0; i < 16; i++) {\n if (scratch[i] !== bundle.uboData[16 + i]) {\n uboDirty = true;\n break;\n }\n }\n }\n\n if (uboDirty) {\n const activePass = coordinator.activePass;\n\n if (activePass !== null && bundle.drawsInPass === activePass) {\n // Rewriting the UBO would retroactively re-project this bundle's\n // draws already recorded into the open pass: end it first.\n coordinator.endPass();\n }\n\n packAffineMat4(view.getTransform(), bundle.uboData, 0);\n bundle.uboData.set(scratch, 16);\n bundle.uboView = view;\n bundle.uboViewUpdateId = view.updateId;\n bundle.uboWritten = true;\n device.queue.writeBuffer(bundle.uniformBuffer!, 0, bundle.uboData.buffer, bundle.uboData.byteOffset, retainedGroupUniformBytes);\n }\n\n const active = coordinator.acquirePass();\n const pass = active.pass;\n\n pass.setPipeline(this._getPipeline(payload.blendMode, backend.renderTargetFormat, coordinator.stencilActive));\n pass.setBindGroup(0, bundle.getBindGroup(device, this._uniformBindGroupLayout!, false));\n pass.setBindGroup(1, textureBindGroup);\n pass.setVertexBuffer(0, bundle.instanceBuffer, payload.byteOffset);\n pass.setIndexBuffer(this._indexBuffer, 'uint16');\n pass.drawIndexed(indicesPerInstance, payload.instanceCount, 0, 0, 0);\n\n bundle.drawsInPass = active;\n coordinator.markPassDraws();\n backend.stats.batches++;\n backend.stats.drawCalls++;\n }\n\n private _getPipeline(blendMode: BlendModes, format: GPUTextureFormat, stencil: boolean): GPURenderPipeline {\n const key = `${blendMode}:${format}:${stencil ? 's' : 'n'}`;\n const existing = this._pipelines.get(key);\n\n if (existing) {\n return existing;\n }\n\n if (!this._device || !this._shaderModule || !this._pipelineLayout) {\n throw new Error('WebGpuTileChunkRenderer: renderer must be connected first.');\n }\n\n const descriptor: GPURenderPipelineDescriptor = {\n layout: this._pipelineLayout,\n vertex: {\n module: this._shaderModule,\n entryPoint: 'vertexMain',\n buffers: [\n {\n arrayStride: instanceStrideBytes,\n stepMode: 'instance',\n attributes: [\n { shaderLocation: 0, offset: 0, format: 'float32x4' },\n { shaderLocation: 1, offset: 16, format: 'unorm16x4' },\n { shaderLocation: 2, offset: 24, format: 'unorm8x4' },\n { shaderLocation: 3, offset: 28, format: 'uint32' },\n ],\n },\n ],\n },\n fragment: {\n module: this._shaderModule,\n entryPoint: 'fragmentMain',\n targets: [\n {\n format,\n blend: getWebGpuBlendState(blendMode),\n writeMask: GPUColorWrite.ALL,\n },\n ],\n },\n primitive: {\n topology: 'triangle-list',\n },\n };\n\n if (stencil) {\n descriptor.depthStencil = stencilContentDepthStencilState();\n }\n\n const pipeline = this._device.createRenderPipeline(descriptor);\n\n this._pipelines.set(key, pipeline);\n\n return pipeline;\n }\n\n /**\n * Grow the CPU staging array to hold `instanceCount` instances, carrying the\n * quads packed so far. Flush-local: the array only ever holds the pending\n * batch, so it is sized independently of the pass-scoped GPU buffer.\n */\n private _ensureStagingCapacity(instanceCount: number): void {\n if (instanceCount <= this._instanceStagingCapacity) {\n return;\n }\n\n let nextCapacity = Math.max(this._instanceStagingCapacity, initialBatchCapacity);\n\n while (nextCapacity < instanceCount) {\n nextCapacity *= 2;\n }\n\n const oldData = this._instanceData;\n const carryBytes = Math.min(this._quadIndex * instanceStrideBytes, oldData.byteLength);\n const instanceData = new ArrayBuffer(nextCapacity * instanceStrideBytes);\n\n if (carryBytes > 0) {\n new Uint8Array(instanceData).set(new Uint8Array(oldData, 0, carryBytes));\n }\n\n this._instanceStagingCapacity = nextCapacity;\n this._instanceData = instanceData;\n this._instanceFloat32 = new Float32Array(instanceData);\n this._instanceUint32 = new Uint32Array(instanceData);\n }\n\n /**\n * Resolve the GPU instance buffer for `requiredBytes` - the total this pass\n * would reach by appending, not this flush's own bytes. Reallocation frees the\n * buffer earlier draws in the open pass read, so the caller must have ended\n * that pass (and restarted the cursor) before a growing call. Capacity\n * doubles, so the split a growth costs converges away within a frame or two.\n */\n private _ensureInstanceBufferCapacity(device: GPUDevice, requiredBytes: number): GPUBuffer {\n const existing = this._instanceBuffer;\n\n if (existing !== null && requiredBytes <= this._instanceBufferCapacity) {\n return existing;\n }\n\n const nextCapacity = Math.max(this._instanceBufferCapacity * 2, requiredBytes, initialBatchCapacity * instanceStrideBytes);\n const instanceBuffer = device.createBuffer({\n label: 'tile-chunk:instance-buffer',\n size: nextCapacity,\n usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n\n existing?.destroy();\n\n this._instanceBufferCapacity = nextCapacity;\n this._instanceBuffer = instanceBuffer;\n\n return instanceBuffer;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ //#region src/webgpu/shaders/tile-chunk.wgsl
2
+ var tile_chunk_default = "struct ProjectionUniforms {\n matrix: mat4x4<f32>,\n group: mat4x4<f32>,\n viewport: vec4<f32>, // device-pixel snap rect (x, y, width, height)\n};\n\nstruct TransformSlot {\n m0: vec4<f32>,\n m1: vec4<f32>,\n};\n\n@group(0) @binding(0)\nvar<uniform> projection: ProjectionUniforms;\n@group(0) @binding(1)\nvar<storage, read> transforms: array<TransformSlot>;\n\n@group(1) @binding(0)\nvar tileTexture: texture_2d<f32>;\n@group(1) @binding(1)\nvar tileSampler: sampler;\n\nstruct VertexInput {\n @location(0) quadBounds: vec4<f32>, // x0, y0, x1, y1\n @location(1) uvBounds: vec4<f32>, // uMin, vMin, uMax, vMax (flipX/Y + texture flipY baked)\n @location(2) color: vec4<f32>, // RGBA tint (layer opacity in alpha)\n @location(3) tileWord: u32, // transform row (bits 0..28) | diagonal (bit 29)\n};\n\nstruct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) texcoord: vec2<f32>,\n @location(1) color: vec4<f32>,\n};\n\n@vertex\nfn vertexMain(input: VertexInput, @builtin(vertex_index) vid: u32) -> VertexOutput {\n var output: VertexOutput;\n\n // vid 0..3 → TL, TR, BR, BL (matches static index buffer [0,1,2,0,2,3])\n let cornerX = ((vid + 1u) >> 1u) & 1u;\n let cornerY = vid >> 1u;\n\n let localX = select(input.quadBounds.x, input.quadBounds.z, cornerX == 1u);\n let localY = select(input.quadBounds.y, input.quadBounds.w, cornerY == 1u);\n\n let row = input.tileWord & {{tileRowMask}}u;\n let diagonal = (input.tileWord & {{tileDiagonalBit}}u) != 0u;\n\n let slot = transforms[row];\n let worldX = slot.m0.x * localX + slot.m0.y * localY + slot.m1.x;\n let worldY = slot.m0.z * localX + slot.m0.w * localY + slot.m1.y;\n\n var position = projection.matrix * projection.group * vec4<f32>(worldX, worldY, 0.0, 1.0);\n\n // Render-only pixel snapping (slot.m1.z: 0 = none, non-zero = snap origin).\n // floor(x + 0.5) matches the CPU Math.round policy; WGSL round() is\n // half-to-even. Grid alignment is independent of the y-axis convention\n // because the staged viewport rect is whole device pixels.\n if (slot.m1.z != 0.0) {\n let originClip = projection.matrix * projection.group * vec4<f32>(slot.m1.x, slot.m1.y, 0.0, 1.0);\n let originDevice = projection.viewport.xy + (originClip.xy * 0.5 + vec2<f32>(0.5)) * projection.viewport.zw;\n let snapDelta = (floor(originDevice + vec2<f32>(0.5)) - originDevice) * 2.0 / max(projection.viewport.zw, vec2<f32>(1.0));\n position = vec4<f32>(position.xy + snapDelta, position.z, position.w);\n }\n output.position = position;\n\n // Tile orientation: diagonal transposes the corner-coordinate axes; flipX/Y\n // are baked into the UV corner ordering by the CPU writer.\n var su = cornerX;\n var sv = cornerY;\n if (diagonal) {\n let t = su;\n su = sv;\n sv = t;\n }\n\n let u = select(input.uvBounds.x, input.uvBounds.z, su == 1u);\n let v = select(input.uvBounds.y, input.uvBounds.w, sv == 1u);\n output.texcoord = vec2<f32>(u, v);\n\n output.color = vec4(input.color.rgb * input.color.a, input.color.a);\n\n return output;\n}\n\n@fragment\nfn fragmentMain(input: VertexOutput) -> @location(0) vec4<f32> {\n let sample = textureSample(tileTexture, tileSampler, input.texcoord);\n return sample * input.color;\n}\n";
3
+
4
+ //#endregion
5
+ export { tile_chunk_default as default };
6
+ //# sourceMappingURL=tile-chunk.wgsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tile-chunk.wgsl.js","names":[],"sources":["../../../../src/webgpu/shaders/tile-chunk.wgsl"],"sourcesContent":["export default \"struct ProjectionUniforms {\\n matrix: mat4x4<f32>,\\n group: mat4x4<f32>,\\n viewport: vec4<f32>, // device-pixel snap rect (x, y, width, height)\\n};\\n\\nstruct TransformSlot {\\n m0: vec4<f32>,\\n m1: vec4<f32>,\\n};\\n\\n@group(0) @binding(0)\\nvar<uniform> projection: ProjectionUniforms;\\n@group(0) @binding(1)\\nvar<storage, read> transforms: array<TransformSlot>;\\n\\n@group(1) @binding(0)\\nvar tileTexture: texture_2d<f32>;\\n@group(1) @binding(1)\\nvar tileSampler: sampler;\\n\\nstruct VertexInput {\\n @location(0) quadBounds: vec4<f32>, // x0, y0, x1, y1\\n @location(1) uvBounds: vec4<f32>, // uMin, vMin, uMax, vMax (flipX/Y + texture flipY baked)\\n @location(2) color: vec4<f32>, // RGBA tint (layer opacity in alpha)\\n @location(3) tileWord: u32, // transform row (bits 0..28) | diagonal (bit 29)\\n};\\n\\nstruct VertexOutput {\\n @builtin(position) position: vec4<f32>,\\n @location(0) texcoord: vec2<f32>,\\n @location(1) color: vec4<f32>,\\n};\\n\\n@vertex\\nfn vertexMain(input: VertexInput, @builtin(vertex_index) vid: u32) -> VertexOutput {\\n var output: VertexOutput;\\n\\n // vid 0..3 → TL, TR, BR, BL (matches static index buffer [0,1,2,0,2,3])\\n let cornerX = ((vid + 1u) >> 1u) & 1u;\\n let cornerY = vid >> 1u;\\n\\n let localX = select(input.quadBounds.x, input.quadBounds.z, cornerX == 1u);\\n let localY = select(input.quadBounds.y, input.quadBounds.w, cornerY == 1u);\\n\\n let row = input.tileWord & {{tileRowMask}}u;\\n let diagonal = (input.tileWord & {{tileDiagonalBit}}u) != 0u;\\n\\n let slot = transforms[row];\\n let worldX = slot.m0.x * localX + slot.m0.y * localY + slot.m1.x;\\n let worldY = slot.m0.z * localX + slot.m0.w * localY + slot.m1.y;\\n\\n var position = projection.matrix * projection.group * vec4<f32>(worldX, worldY, 0.0, 1.0);\\n\\n // Render-only pixel snapping (slot.m1.z: 0 = none, non-zero = snap origin).\\n // floor(x + 0.5) matches the CPU Math.round policy; WGSL round() is\\n // half-to-even. Grid alignment is independent of the y-axis convention\\n // because the staged viewport rect is whole device pixels.\\n if (slot.m1.z != 0.0) {\\n let originClip = projection.matrix * projection.group * vec4<f32>(slot.m1.x, slot.m1.y, 0.0, 1.0);\\n let originDevice = projection.viewport.xy + (originClip.xy * 0.5 + vec2<f32>(0.5)) * projection.viewport.zw;\\n let snapDelta = (floor(originDevice + vec2<f32>(0.5)) - originDevice) * 2.0 / max(projection.viewport.zw, vec2<f32>(1.0));\\n position = vec4<f32>(position.xy + snapDelta, position.z, position.w);\\n }\\n output.position = position;\\n\\n // Tile orientation: diagonal transposes the corner-coordinate axes; flipX/Y\\n // are baked into the UV corner ordering by the CPU writer.\\n var su = cornerX;\\n var sv = cornerY;\\n if (diagonal) {\\n let t = su;\\n su = sv;\\n sv = t;\\n }\\n\\n let u = select(input.uvBounds.x, input.uvBounds.z, su == 1u);\\n let v = select(input.uvBounds.y, input.uvBounds.w, sv == 1u);\\n output.texcoord = vec2<f32>(u, v);\\n\\n output.color = vec4(input.color.rgb * input.color.a, input.color.a);\\n\\n return output;\\n}\\n\\n@fragment\\nfn fragmentMain(input: VertexOutput) -> @location(0) vec4<f32> {\\n let sample = textureSample(tileTexture, tileSampler, input.texcoord);\\n return sample * input.color;\\n}\\n\";"],"mappings":";AAAA,yBAAe"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codexo/exojs-tilemap",
3
- "version": "0.15.3",
3
+ "version": "0.16.0",
4
4
  "description": "Generic, format-independent tilemap runtime for ExoJS.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -8,9 +8,7 @@
8
8
  "directory": "packages/exojs-tilemap"
9
9
  },
10
10
  "type": "module",
11
- "sideEffects": [
12
- "./dist/esm/register.js"
13
- ],
11
+ "sideEffects": false,
14
12
  "main": "./dist/esm/index.js",
15
13
  "module": "./dist/esm/index.js",
16
14
  "types": "./dist/esm/index.d.ts",
@@ -20,11 +18,6 @@
20
18
  "import": "./dist/esm/index.js",
21
19
  "default": "./dist/esm/index.js"
22
20
  },
23
- "./register": {
24
- "types": "./dist/esm/register.d.ts",
25
- "import": "./dist/esm/register.js",
26
- "default": "./dist/esm/register.js"
27
- },
28
21
  "./package.json": "./package.json"
29
22
  },
30
23
  "files": [
@@ -33,20 +26,20 @@
33
26
  "LICENSE"
34
27
  ],
35
28
  "peerDependencies": {
36
- "@codexo/exojs": "0.15.x"
29
+ "@codexo/exojs": "0.16.x"
37
30
  },
38
31
  "devDependencies": {
39
- "@codexo/exojs": "0.15.3",
40
- "@codexo/exojs-config": "0.0.0"
32
+ "@codexo/exojs-config": "0.0.0",
33
+ "@codexo/exojs": "0.16.0"
41
34
  },
42
35
  "license": "MIT",
43
36
  "publishConfig": {
44
37
  "access": "public"
45
38
  },
46
39
  "scripts": {
47
- "build": "tsx ../../node_modules/rollup/dist/bin/rollup -c --environment EXOJS_ENV:production",
48
- "build:dev": "tsx ../../node_modules/rollup/dist/bin/rollup -c --environment EXOJS_ENV:development",
49
- "typecheck": "tsc --noEmit",
40
+ "build": "tsx ../../scripts/build-extension.ts",
41
+ "build:dev": "tsx ../../scripts/build-extension.ts --dev",
42
+ "typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.test.json",
50
43
  "lint": "eslint \"src/**/*.ts\" \"test/**/*.ts\"",
51
44
  "test": "vitest run --root ../.. --project=exojs-tilemap"
52
45
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- export * from './public';
@@ -1,25 +0,0 @@
1
- import { ExtensionRegistry } from '@codexo/exojs/extensions';
2
- import { tilemapExtension } from './tilemapExtension.js';
3
- export { ImageLayer } from './ImageLayer.js';
4
- export { ObjectKind, ObjectLayer } from './ObjectLayer.js';
5
- export { TileLayer } from './TileLayer.js';
6
- export { TileMap } from './TileMap.js';
7
- export { TileSet } from './TileSet.js';
8
- export { TileLayerNode } from './TileLayerNode.js';
9
- export { TileMapNode } from './TileMapNode.js';
10
- export { TileMapBand } from './TileMapBand.js';
11
- export { TileMapView } from './TileMapView.js';
12
- export { TILE_TRANSFORM_IDENTITY, TilePropertyKind, tileToChunkCoord, tileToLocalInChunk } from './types.js';
13
- export { TileAnimator } from './TileAnimator.js';
14
- export { autoTile, refreshCell } from './autoTile.js';
15
- export { WangSet } from './WangSet.js';
16
-
17
- // @codexo/exojs-tilemap/register — explicit registration entry.
18
- // Importing this entry registers the default tilemapExtension descriptor
19
- // in the global ExtensionRegistry. Subsequently constructed Applications
20
- // that use global defaults will receive the tilemap extension.
21
- // This is the only side-effectful entry in this package.
22
- ExtensionRegistry.register(tilemapExtension);
23
-
24
- export { tilemapExtension };
25
- //# sourceMappingURL=register.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"register.js","sources":["../../../src/register.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AAMA,iBAAiB,CAAC,QAAQ,CAAC,gBAAgB,CAAC;;;;"}