@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":"WebGl2TileChunkRenderer.js","sources":["../../../../src/webgl2/WebGl2TileChunkRenderer.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WebGl2TileChunkRenderer.js","names":["tileVertexTemplate","tileFragmentSource"],"sources":["../../../src/webgl2/WebGl2TileChunkRenderer.ts"],"sourcesContent":["import type {\n RenderTexture,\n Texture,\n View,\n WebGl2Backend,\n WebGl2RenderBufferRuntime,\n WebGl2RetainedBatchPayload,\n WebGl2RetainedBatchReplayer,\n WebGl2RetainedNodeIndexRange,\n WebGl2VertexArrayObjectRuntime,\n} from '@codexo/exojs/renderer-sdk';\nimport {\n AbstractWebGl2Renderer,\n BlendModes,\n BufferTypes,\n BufferUsage,\n createWebGl2ShaderProgram,\n fillShaderSource,\n packedGroupChanged,\n RenderingPrimitives,\n Shader,\n uploadBufferRange,\n uploadBufferStore,\n WebGl2RenderBuffer,\n WebGl2VertexArrayObject,\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 tileFragmentSource from './shaders/tile-chunk.frag';\nimport tileVertexTemplate from './shaders/tile-chunk.vert';\n\n// One instance = one tile quad. Layout matches the engine's instanced-quad\n// convention (NineSlice/Repeating): float32x4 local rect, unorm16x4 UV bounds,\n// unorm8x4 tint, uint32 tile word (transform row + diagonal bit).\nconst instanceStrideBytes = 32;\nconst wordsPerInstance = instanceStrideBytes / Uint32Array.BYTES_PER_ELEMENT;\nconst transformTextureUnit = 1;\nconst identityGroupMat3 = new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);\n\nconst tileVertexSource = fillShaderSource(tileVertexTemplate, { tileRowMask: TILE_ROW_MASK, tileDiagonalBit: TILE_DIAGONAL_BIT });\n\ninterface TileRendererConnection {\n readonly gl: WebGL2RenderingContext;\n readonly buffers: Map<WebGl2RenderBuffer, { handle: WebGLBuffer; dataByteLength: number }>;\n readonly vaoHandle: WebGLVertexArrayObject;\n}\n\n/**\n * Instanced WebGL2 renderer for {@link TileChunkNode}. Each tile is one\n * instanced quad; tiles are batched by `(shader, tileset texture)` and one\n * `drawArraysInstanced` is issued per batch. Per-chunk transforms ride on the\n * shared transform buffer (one row per chunk node), so the chunk geometry is\n * orientation-neutral and never re-uploaded for a camera pan.\n * @internal\n */\nexport class WebGl2TileChunkRenderer extends AbstractWebGl2Renderer<TileChunkNode> implements WebGl2RetainedBatchReplayer {\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) can be\n * recorded into a group's instruction set and replayed from group-owned\n * resources. Pixel-snapped draws are excluded by the collect-time\n * recordability predicate (and belt-and-braces poisoning in {@link render});\n * tile chunks have no custom-material path to exclude.\n * @internal\n */\n public readonly _supportsRetainedBatches = true;\n\n private readonly _shader: Shader;\n private readonly _batchSize: number;\n private readonly _instanceData: ArrayBuffer;\n private readonly _instanceFloat32: Float32Array;\n private readonly _instanceUint32: Uint32Array;\n\n private readonly _transformUnitScratch: Int32Array = new Int32Array([transformTextureUnit]);\n // Pinned unit index for the single tileset texture sampler (unit 0), reused\n // by the live flush and retained replay so both stay allocation-free.\n private readonly _baseTextureUnitScratch: Int32Array = new Int32Array([0]);\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 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/runs span several\n // batches is booked once, against the batch its first run lands in.\n private _batchNodeCount = 0;\n private _nodeBooked = false;\n private _currentBlendMode: BlendModes | null = null;\n private _currentTexture: Texture | null = null;\n private _currentView: View | null = null;\n private _currentViewId = -1;\n private _hasWrittenGroup = false;\n private readonly _writtenGroupData = new Float32Array(9);\n\n private _instanceBuffer: WebGl2RenderBuffer | null = null;\n private _vao: WebGl2VertexArrayObject | null = null;\n private _connection: TileRendererConnection | null = null;\n\n public constructor(batchSize: number) {\n super();\n\n this._batchSize = batchSize;\n this._shader = new Shader(tileVertexSource, tileFragmentSource);\n this._instanceData = new ArrayBuffer(batchSize * instanceStrideBytes);\n this._instanceFloat32 = new Float32Array(this._instanceData);\n this._instanceUint32 = new Uint32Array(this._instanceData);\n }\n\n public render(node: TileChunkNode): void {\n const pages = node.pages;\n\n this._nodeBooked = false;\n\n if (pages.length === 0) {\n return;\n }\n\n const backend = this.getBackend();\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: WebGl2Backend, texture: Texture, quads: readonly TileQuad[], blendMode: BlendModes, tintRgba: number, nodeIndex: number): void {\n if (quads.length === 0) {\n return;\n }\n\n const textureChanged = this._currentTexture !== null && texture !== this._currentTexture;\n const blendModeChanged = blendMode !== this._currentBlendMode;\n\n if (this._quadIndex > 0 && (blendModeChanged || textureChanged || this._quadIndex + quads.length > this._batchSize)) {\n this.flush();\n }\n\n if (this._currentBlendMode === null || this._currentBlendMode !== blendMode) {\n this._currentBlendMode = blendMode;\n backend.setBlendMode(blendMode);\n }\n\n if (this._currentTexture !== texture) {\n this._currentTexture = texture;\n backend.bindTexture(texture, 0);\n }\n\n const flipY = texture.flipY;\n\n // A chunk page may hold more tiles than the fixed batch buffer; write in\n // batch-sized runs, flushing (and re-establishing state) between runs.\n let offset = 0;\n\n while (offset < quads.length) {\n const remaining = quads.length - offset;\n const runSize = Math.min(remaining, this._batchSize);\n\n this._writeRun(quads, offset, runSize, flipY, tintRgba, nodeIndex);\n\n offset += runSize;\n\n if (offset < quads.length) {\n this.flush();\n this._currentBlendMode = blendMode;\n backend.setBlendMode(blendMode);\n this._currentTexture = texture;\n backend.bindTexture(texture, 0);\n }\n }\n }\n\n private _writeRun(quads: readonly TileQuad[], offset: number, count: number, flipY: boolean, tintRgba: number, nodeIndex: number): void {\n const f32 = this._instanceFloat32;\n const u32 = this._instanceUint32;\n const baseWord = nodeIndex & TILE_ROW_MASK;\n\n // Booked here rather than in render(): any flush the page/run loops trigger\n // has already happened, so the chunk lands on the batch that actually holds\n // its first tile.\n if (!this._nodeBooked) {\n this._nodeBooked = true;\n this._batchNodeCount++;\n }\n\n for (let i = 0; i < count; i++) {\n const q = quads[offset + i]!;\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 // Bake flipX/flipY into the UV corner ordering; the diagonal axis swap is\n // resolved in the shader. Texture flipY (uploaded-flipped atlases) is an\n // additional vertical swap that composes with the tile flipY.\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 (flipY) {\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.getBackendOrNull();\n const instanceBuffer = this._instanceBuffer;\n const vao = this._vao;\n\n if (this._quadIndex === 0 || backend === null || instanceBuffer === null || vao === null) {\n this._quadIndex = 0;\n this._maxNodeIndex = 0;\n this._batchNodeCount = 0;\n return;\n }\n\n this._stageViewUniforms(backend);\n\n if (this._currentTexture !== null) {\n this._shader.getUniform('u_texture').setValue(this._baseTextureUnitScratch);\n }\n\n backend.bindTransformBufferTexture(transformTextureUnit, this._maxNodeIndex + 1);\n this._shader.getUniform('u_transforms').setValue(this._transformUnitScratch);\n\n this._shader.sync();\n backend.bindVertexArrayObject(vao);\n instanceBuffer.upload(this._instanceFloat32, 0, this._quadIndex * wordsPerInstance);\n vao.drawInstanced(4, 0, this._quadIndex, RenderingPrimitives.TriangleStrip);\n backend.stats.batches++;\n backend.stats.drawCalls++;\n\n // Retained recording: while a capture window is open, hand the\n // exact packed instance words of this flush to the backend - byte-\n // identical to what just drew. A batch always binds a single tileset\n // texture (slot 0); a pixel-snapped node already poisoned the capture in\n // render().\n if (backend._isRetainedCapturing && this._currentTexture !== null) {\n this._recordTextures[0] = this._currentTexture;\n backend._recordRetainedBatch(\n this,\n this._instanceUint32.subarray(0, this._quadIndex * wordsPerInstance),\n this._quadIndex,\n this._currentBlendMode ?? BlendModes.Normal,\n this._recordTextures,\n 1,\n null,\n null,\n this._batchNodeCount,\n );\n }\n\n this._quadIndex = 0;\n this._maxNodeIndex = 0;\n this._batchNodeCount = 0;\n }\n\n /**\n * Stage `u_projection` (live view) and `u_group` (live composed group\n * matrix) on the shader, guarded by cached view/group stamps. Shared by the\n * live flush path and retained-batch replay - replay resolves exactly the\n * same live state a slow-path flush would.\n */\n private _stageViewUniforms(backend: WebGl2Backend): void {\n const view = backend.view;\n\n if (this._currentView !== view || this._currentViewId !== view.updateId) {\n this._currentView = view;\n this._currentViewId = view.updateId;\n this._shader.getUniform('u_projection').setValue(view.getTransform().toArray(false));\n }\n\n const groupTransform = backend.renderGroupTransform;\n const groupData = groupTransform !== null ? groupTransform.toArray(false) : identityGroupMat3;\n\n if (!this._hasWrittenGroup || packedGroupChanged(groupData, this._writtenGroupData, 0)) {\n this._shader.getUniform('u_group').setValue(groupData);\n this._writtenGroupData.set(groupData);\n this._hasWrittenGroup = true;\n }\n\n backend._stageViewportUniform(this._shader);\n }\n\n // ── Retained-batch record/replay ──────────────────────────────────────────\n // The bundle stores raw instance bytes; this renderer owns the 32-byte\n // layout (tile word at word 7: transform row in bits 0..28, diagonal flip in\n // bit 29), so the layout-aware finalize steps (node-index scan/rebase, VAO\n // attribute wiring) and the replay dispatch live here - mirroring\n // WebGl2NineSliceSpriteRenderer's seam.\n\n /** @internal See {@link WebGl2RetainedBatchReplayer._scanRetainedNodeIndexRange}. */\n public _scanRetainedNodeIndexRange(payload: WebGl2RetainedBatchPayload, range: WebGl2RetainedNodeIndexRange): void {\n const words = payload.bundle.instanceWords;\n const start = payload.byteOffset / Uint32Array.BYTES_PER_ELEMENT;\n\n for (let i = 0; i < payload.instanceCount; i++) {\n // In-bounds: the payload's word range was appended to the bundle store.\n // The tile word is the last word of the 32-byte (8-word) instance\n // layout; only the low 29 bits address the transform buffer row - the\n // diagonal-flip flag (bit 29) is orientation, not a row index.\n const row = words[start + i * wordsPerInstance + 7]! & 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 WebGl2RetainedBatchReplayer._rebaseRetainedNodeIndices} (group-local indices). */\n public _rebaseRetainedNodeIndices(payload: WebGl2RetainedBatchPayload, base: number): void {\n const words = payload.bundle.instanceWords;\n const start = payload.byteOffset / Uint32Array.BYTES_PER_ELEMENT;\n\n for (let i = 0; i < payload.instanceCount; i++) {\n const index = start + i * wordsPerInstance + 7;\n // In-bounds: see the scan above. Rebase ONLY the row field; the\n // diagonal-flip bit must survive untouched or tile orientation corrupts.\n const word = words[index]!;\n const diagonal = word & TILE_DIAGONAL_BIT;\n const row = word & TILE_ROW_MASK;\n\n words[index] = (diagonal | ((row - base) & TILE_ROW_MASK)) >>> 0;\n }\n }\n\n /**\n * Point the batch VAO's per-instance attributes at the bundle's persistent\n * instance buffer, based at the batch's byte offset (WebGL2 has no\n * baseInstance, hence one small VAO per recorded batch). Same attribute\n * set/locations as the live VAO in {@link onConnect}.\n * @internal\n */\n public _configureRetainedVao(payload: WebGl2RetainedBatchPayload): void {\n const gl = this.getBackend().context;\n const buffer = payload.bundle.instanceBuffer;\n const vao = payload.vao;\n\n if (buffer === null || vao === null) {\n throw new Error('WebGl2TileChunkRenderer: retained batch VAO configuration requires an uploaded bundle.');\n }\n\n const base = payload.byteOffset;\n\n vao\n .addAttribute(buffer, this._shader.getAttribute('a_quadBounds'), gl.FLOAT, false, instanceStrideBytes, base + 0, false, 1)\n .addAttribute(buffer, this._shader.getAttribute('a_uvBounds'), gl.UNSIGNED_SHORT, true, instanceStrideBytes, base + 16, false, 1)\n .addAttribute(buffer, this._shader.getAttribute('a_color'), gl.UNSIGNED_BYTE, true, instanceStrideBytes, base + 24, false, 1)\n .addAttribute(buffer, this._shader.getAttribute('a_tileWord'), gl.UNSIGNED_INT, false, instanceStrideBytes, base + 28, true, 1);\n }\n\n /**\n * Replay one recorded batch: all STATE is resolved live - blend mode via\n * the backend's dedup, `u_projection`/`u_group` from the live view + live\n * composed group matrix (the camera-pan / group-move win), the single\n * tileset texture bound to unit 0 by recorded slot order - and only the\n * DATA is cached: the instance bytes in the bundle buffer (bound through\n * the per-batch VAO) and the group-owned transform texture on the shared\n * transform unit. The backend hook flushed any pending live batch before\n * dispatching here and bumps the stats from the instruction descriptor.\n * @internal\n */\n public _replayRetainedBatch(payload: WebGl2RetainedBatchPayload): void {\n const backend = this.getBackendOrNull();\n const vao = payload.vao;\n const transformTexture = payload.bundle.transformTexture;\n\n if (backend === null || vao === null || transformTexture === null) {\n // Defensive: a bundle in this state never validates (generation), so a\n // spliced replay cannot reach here; skip rather than crash mid-frame.\n return;\n }\n\n if (payload.blendMode !== this._currentBlendMode) {\n this._currentBlendMode = payload.blendMode;\n }\n\n backend.setBlendMode(payload.blendMode);\n this._stageViewUniforms(backend);\n\n const textures = payload.textures;\n\n for (let i = 0; i < textures.length; i++) {\n // In-bounds: i < textures.length.\n backend.bindTexture(textures[i]!, i);\n }\n\n // Keep the live path's redundant-bind-skip cache coherent (a live\n // TileChunkNode outside the group and the replayed batches inside it\n // share this one renderer instance): unit 0 now actually holds this\n // batch's texture, bypassing render()'s `_currentTexture` check, so the\n // NEXT live draw must see the true bound texture or it wrongly skips its\n // own bind and renders with this batch's leftover texture.\n if (textures.length > 0) {\n this._currentTexture = textures[0] as Texture;\n }\n\n this._shader.getUniform('u_texture').setValue(this._baseTextureUnitScratch);\n\n // The group-owned transform store replaces the shared frame buffer on the\n // SAME unit/sampler - zero GLSL changes. The next live flush re-binds the\n // shared texture through bindTransformBufferTexture.\n backend.bindTexture(transformTexture, transformTextureUnit);\n this._shader.getUniform('u_transforms').setValue(this._transformUnitScratch);\n\n this._shader.sync();\n backend.bindVertexArrayObject(vao);\n vao.drawInstanced(4, 0, payload.instanceCount, RenderingPrimitives.TriangleStrip);\n }\n\n protected onConnect(backend: WebGl2Backend): void {\n const gl = backend.context;\n\n this._shader.connect(createWebGl2ShaderProgram(gl));\n this._connection = this._createConnection(gl);\n this._instanceBuffer = new WebGl2RenderBuffer(BufferTypes.ArrayBuffer, this._instanceData, BufferUsage.DynamicDraw).connect(\n this._createBufferRuntime(this._connection),\n );\n this._shader.sync();\n\n this._vao = new WebGl2VertexArrayObject(RenderingPrimitives.TriangleStrip)\n .addAttribute(this._instanceBuffer, this._shader.getAttribute('a_quadBounds'), gl.FLOAT, false, instanceStrideBytes, 0, false, 1)\n .addAttribute(this._instanceBuffer, this._shader.getAttribute('a_uvBounds'), gl.UNSIGNED_SHORT, true, instanceStrideBytes, 16, false, 1)\n .addAttribute(this._instanceBuffer, this._shader.getAttribute('a_color'), gl.UNSIGNED_BYTE, true, instanceStrideBytes, 24, false, 1)\n .addAttribute(this._instanceBuffer, this._shader.getAttribute('a_tileWord'), gl.UNSIGNED_INT, false, instanceStrideBytes, 28, true, 1)\n .connect(this._createVaoRuntime(this._connection));\n }\n\n protected onDisconnect(): void {\n this._shader.disconnect();\n this._instanceBuffer?.destroy();\n this._instanceBuffer = null;\n this._vao?.destroy();\n this._vao = null;\n this._connection = null;\n this._currentBlendMode = null;\n this._currentTexture = null;\n this._currentView = null;\n this._currentViewId = -1;\n this._hasWrittenGroup = false;\n this._quadIndex = 0;\n this._maxNodeIndex = 0;\n this._batchNodeCount = 0;\n this._nodeBooked = false;\n }\n\n public destroy(): void {\n this.disconnect();\n this._shader.destroy();\n }\n\n private _createConnection(gl: WebGL2RenderingContext): TileRendererConnection {\n const vaoHandle = gl.createVertexArray();\n\n if (vaoHandle === null) {\n throw new Error('WebGl2TileChunkRenderer: could not create vertex array object.');\n }\n\n return { gl, buffers: new Map(), vaoHandle };\n }\n\n private _createBufferRuntime(connection: TileRendererConnection): WebGl2RenderBufferRuntime {\n const handle = connection.gl.createBuffer();\n\n if (handle === null) {\n throw new Error('WebGl2TileChunkRenderer: could not create render buffer.');\n }\n\n return {\n bind: (buffer): void => {\n connection.gl.bindBuffer(buffer.type, handle);\n },\n upload: (buffer, offset): void => {\n const gl = connection.gl;\n const state = connection.buffers.get(buffer);\n\n gl.bindBuffer(buffer.type, handle);\n\n if (state && state.dataByteLength >= buffer.uploadByteLength) {\n uploadBufferRange(gl, buffer, offset);\n state.dataByteLength = buffer.uploadByteLength;\n } else {\n uploadBufferStore(gl, buffer);\n connection.buffers.set(buffer, { handle, dataByteLength: buffer.uploadByteLength });\n }\n },\n destroy: (buffer): void => {\n connection.gl.deleteBuffer(handle);\n connection.buffers.delete(buffer);\n buffer.disconnect();\n },\n };\n }\n\n private _createVaoRuntime(connection: TileRendererConnection): WebGl2VertexArrayObjectRuntime {\n let appliedVersion = -1;\n\n return {\n bind: (vao): void => {\n const gl = connection.gl;\n\n gl.bindVertexArray(connection.vaoHandle);\n\n if (appliedVersion !== vao.version) {\n let lastBuffer: WebGl2RenderBuffer | null = null;\n\n for (const attribute of vao.attributes) {\n if (lastBuffer !== attribute.buffer) {\n attribute.buffer.bind();\n lastBuffer = attribute.buffer;\n }\n\n if (attribute.integer) {\n gl.vertexAttribIPointer(attribute.location, attribute.size, attribute.type, attribute.stride, attribute.start);\n } else {\n gl.vertexAttribPointer(attribute.location, attribute.size, attribute.type, attribute.normalized, attribute.stride, attribute.start);\n }\n\n gl.enableVertexAttribArray(attribute.location);\n gl.vertexAttribDivisor(attribute.location, attribute.divisor);\n }\n\n appliedVersion = vao.version;\n }\n },\n unbind: (): void => {\n connection.gl.bindVertexArray(null);\n },\n draw: (_vao, size, start, type): void => {\n connection.gl.drawArrays(type, start, size);\n },\n drawInstanced: (_vao, count, start, instanceCount, type): void => {\n connection.gl.drawArraysInstanced(type, start, count, instanceCount);\n },\n destroy: (vao): void => {\n connection.gl.deleteVertexArray(connection.vaoHandle);\n vao.disconnect();\n },\n };\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ //#region src/webgl2/shaders/tile-chunk.frag
2
+ var tile_chunk_default = "#version 300 es\nprecision highp float;\n\nuniform sampler2D u_texture;\n\nin vec2 v_texcoord;\nin vec4 v_color;\n\nlayout(location = 0) out vec4 fragColor;\n\nvoid main(void) {\n vec4 sampleColor = texture(u_texture, v_texcoord);\n fragColor = sampleColor * v_color;\n}\n";
3
+
4
+ //#endregion
5
+ export { tile_chunk_default as default };
6
+ //# sourceMappingURL=tile-chunk.frag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tile-chunk.frag.js","names":[],"sources":["../../../../src/webgl2/shaders/tile-chunk.frag"],"sourcesContent":["export default \"#version 300 es\\nprecision highp float;\\n\\nuniform sampler2D u_texture;\\n\\nin vec2 v_texcoord;\\nin vec4 v_color;\\n\\nlayout(location = 0) out vec4 fragColor;\\n\\nvoid main(void) {\\n vec4 sampleColor = texture(u_texture, v_texcoord);\\n fragColor = sampleColor * v_color;\\n}\\n\";"],"mappings":";AAAA,yBAAe"}
@@ -0,0 +1,6 @@
1
+ //#region src/webgl2/shaders/tile-chunk.vert
2
+ var tile_chunk_default = "#version 300 es\nprecision highp float;\nprecision highp int;\n\n// Per-instance attributes (divisor = 1). One entry per tile quad.\n// gl_VertexID 0..3 selects which corner of the quad this invocation computes.\nlayout(location = 0) in vec4 a_quadBounds; // x0, y0, x1, y1 (chunk-local)\nlayout(location = 1) in vec4 a_uvBounds; // uMin, vMin, uMax, vMax (flipX/Y + texture flipY baked)\nlayout(location = 2) in vec4 a_color; // RGBA tint (layer opacity in alpha)\nlayout(location = 3) in uint a_tileWord; // transform row (bits 0..28) | diagonal (bit 29)\n\nuniform mat3 u_projection;\nuniform mat3 u_group;\nuniform vec4 u_viewport; // device-pixel viewport rect (x, y, width, height)\nuniform sampler2D u_transforms; // shared per-frame transform buffer (2 texels/row)\n\n// #exo-include transform-texture\n\nout vec2 v_texcoord;\nout vec4 v_color;\n\nvoid main(void) {\n // gl_VertexID 0..3 -> corner: 0=TL, 1=TR, 2=BL, 3=BR (TRIANGLE_STRIP order)\n int vid = gl_VertexID;\n int cornerX = vid & 1;\n int cornerY = (vid >> 1) & 1;\n\n float localX = (cornerX == 0) ? a_quadBounds.x : a_quadBounds.z;\n float localY = (cornerY == 0) ? a_quadBounds.y : a_quadBounds.w;\n\n int row = int(a_tileWord & {{tileRowMask}}u);\n bool diagonal = (a_tileWord & {{tileDiagonalBit}}u) != 0u;\n\n vec4 m0 = texelFetch(u_transforms, exoTransformTexel(row, 0), 0); // a, b, c, d\n vec4 m1 = texelFetch(u_transforms, exoTransformTexel(row, 1), 0); // tx, ty, snapMode, 0\n\n float worldX = (m0.x * localX) + (m0.y * localY) + m1.x;\n float worldY = (m0.z * localX) + (m0.w * localY) + m1.y;\n\n vec2 clip = (u_projection * u_group * vec3(worldX, worldY, 1.0)).xy;\n\n // Render-only pixel snapping (m1.z: 0 = none, 1 = position, 2 = geometry —\n // both non-zero modes snap the origin). Snap the chunk ORIGIN's device-pixel\n // position and rigid-shift the whole tile quad by the same delta. floor(x+0.5)\n // matches the CPU Math.round policy; GLSL round() is undefined at .5. Grid\n // alignment is independent of the y-axis convention because the staged\n // viewport rect is whole device pixels.\n if (m1.z != 0.0) {\n vec2 originClip = (u_projection * u_group * vec3(m1.x, m1.y, 1.0)).xy;\n vec2 originDevice = u_viewport.xy + (originClip * 0.5 + 0.5) * u_viewport.zw;\n clip += (floor(originDevice + 0.5) - originDevice) * 2.0 / max(u_viewport.zw, vec2(1.0));\n }\n\n gl_Position = vec4(clip, 0.0, 1.0);\n\n // Tile orientation: the diagonal flip transposes the corner-coordinate axes\n // before the UV corner is selected; flipX/flipY are already baked into the\n // (uMin,uMax)/(vMin,vMax) ordering by the CPU writer.\n int su = cornerX;\n int sv = cornerY;\n if (diagonal) { int t = su; su = sv; sv = t; }\n\n float u = (su == 0) ? a_uvBounds.x : a_uvBounds.z;\n float v = (sv == 0) ? a_uvBounds.y : a_uvBounds.w;\n v_texcoord = vec2(u, v);\n\n v_color = vec4(a_color.rgb * a_color.a, a_color.a);\n}\n";
3
+
4
+ //#endregion
5
+ export { tile_chunk_default as default };
6
+ //# sourceMappingURL=tile-chunk.vert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tile-chunk.vert.js","names":[],"sources":["../../../../src/webgl2/shaders/tile-chunk.vert"],"sourcesContent":["export default \"#version 300 es\\nprecision highp float;\\nprecision highp int;\\n\\n// Per-instance attributes (divisor = 1). One entry per tile quad.\\n// gl_VertexID 0..3 selects which corner of the quad this invocation computes.\\nlayout(location = 0) in vec4 a_quadBounds; // x0, y0, x1, y1 (chunk-local)\\nlayout(location = 1) in vec4 a_uvBounds; // uMin, vMin, uMax, vMax (flipX/Y + texture flipY baked)\\nlayout(location = 2) in vec4 a_color; // RGBA tint (layer opacity in alpha)\\nlayout(location = 3) in uint a_tileWord; // transform row (bits 0..28) | diagonal (bit 29)\\n\\nuniform mat3 u_projection;\\nuniform mat3 u_group;\\nuniform vec4 u_viewport; // device-pixel viewport rect (x, y, width, height)\\nuniform sampler2D u_transforms; // shared per-frame transform buffer (2 texels/row)\\n\\n// #exo-include transform-texture\\n\\nout vec2 v_texcoord;\\nout vec4 v_color;\\n\\nvoid main(void) {\\n // gl_VertexID 0..3 -> corner: 0=TL, 1=TR, 2=BL, 3=BR (TRIANGLE_STRIP order)\\n int vid = gl_VertexID;\\n int cornerX = vid & 1;\\n int cornerY = (vid >> 1) & 1;\\n\\n float localX = (cornerX == 0) ? a_quadBounds.x : a_quadBounds.z;\\n float localY = (cornerY == 0) ? a_quadBounds.y : a_quadBounds.w;\\n\\n int row = int(a_tileWord & {{tileRowMask}}u);\\n bool diagonal = (a_tileWord & {{tileDiagonalBit}}u) != 0u;\\n\\n vec4 m0 = texelFetch(u_transforms, exoTransformTexel(row, 0), 0); // a, b, c, d\\n vec4 m1 = texelFetch(u_transforms, exoTransformTexel(row, 1), 0); // tx, ty, snapMode, 0\\n\\n float worldX = (m0.x * localX) + (m0.y * localY) + m1.x;\\n float worldY = (m0.z * localX) + (m0.w * localY) + m1.y;\\n\\n vec2 clip = (u_projection * u_group * vec3(worldX, worldY, 1.0)).xy;\\n\\n // Render-only pixel snapping (m1.z: 0 = none, 1 = position, 2 = geometry —\\n // both non-zero modes snap the origin). Snap the chunk ORIGIN's device-pixel\\n // position and rigid-shift the whole tile quad by the same delta. floor(x+0.5)\\n // matches the CPU Math.round policy; GLSL round() is undefined at .5. Grid\\n // alignment is independent of the y-axis convention because the staged\\n // viewport rect is whole device pixels.\\n if (m1.z != 0.0) {\\n vec2 originClip = (u_projection * u_group * vec3(m1.x, m1.y, 1.0)).xy;\\n vec2 originDevice = u_viewport.xy + (originClip * 0.5 + 0.5) * u_viewport.zw;\\n clip += (floor(originDevice + 0.5) - originDevice) * 2.0 / max(u_viewport.zw, vec2(1.0));\\n }\\n\\n gl_Position = vec4(clip, 0.0, 1.0);\\n\\n // Tile orientation: the diagonal flip transposes the corner-coordinate axes\\n // before the UV corner is selected; flipX/flipY are already baked into the\\n // (uMin,uMax)/(vMin,vMax) ordering by the CPU writer.\\n int su = cornerX;\\n int sv = cornerY;\\n if (diagonal) { int t = su; su = sv; sv = t; }\\n\\n float u = (su == 0) ? a_uvBounds.x : a_uvBounds.z;\\n float v = (sv == 0) ? a_uvBounds.y : a_uvBounds.w;\\n v_texcoord = vec2(u, v);\\n\\n v_color = vec4(a_color.rgb * a_color.a, a_color.a);\\n}\\n\";"],"mappings":";AAAA,yBAAe"}
@@ -1,3 +1,4 @@
1
+ import type { WebGpuRetainedBatchPayload, WebGpuRetainedBatchReplayer, WebGpuRetainedNodeIndexRange } from '@codexo/exojs/renderer-sdk';
1
2
  import type { WebGpuBackend } from '@codexo/exojs/renderer-sdk';
2
3
  import { AbstractWebGpuRenderer } from '@codexo/exojs/renderer-sdk';
3
4
  import type { TileChunkNode } from '../TileChunkNode';
@@ -8,8 +9,21 @@ import type { TileChunkNode } from '../TileChunkNode';
8
9
  * instance buffer grows on demand rather than flushing in fixed runs.
9
10
  * @internal
10
11
  */
11
- export declare class WebGpuTileChunkRenderer extends AbstractWebGpuRenderer<TileChunkNode> {
12
+ export declare class WebGpuTileChunkRenderer extends AbstractWebGpuRenderer<TileChunkNode> implements WebGpuRetainedBatchReplayer {
13
+ /**
14
+ * Retained-batch capability opt-in: a tile chunk's per-flush
15
+ * instanced batches (fixed 32-byte layout, tile word at word 7) record and
16
+ * replay from group-owned resources. Pixel-snapped draws are excluded by
17
+ * the collect-time recordability predicate (and belt-and-braces poisoning
18
+ * in {@link render}); tile chunks have no custom-material path to exclude.
19
+ * @internal
20
+ */
21
+ readonly _supportsRetainedBatches = true;
12
22
  private readonly _projectionData;
23
+ private _writtenView;
24
+ private _writtenViewUpdateId;
25
+ private _hasWrittenProjection;
26
+ private readonly _stagedGroupData;
13
27
  private _device;
14
28
  private _shaderModule;
15
29
  private _uniformBindGroupLayout;
@@ -20,23 +34,75 @@ export declare class WebGpuTileChunkRenderer extends AbstractWebGpuRenderer<Tile
20
34
  private _transformStorageBuffer;
21
35
  private _indexBuffer;
22
36
  private _instanceBuffer;
23
- private _instanceCapacity;
37
+ private _instanceBufferCapacity;
38
+ private _instanceStagingCapacity;
24
39
  private _instanceData;
25
40
  private _instanceFloat32;
26
41
  private _instanceUint32;
27
42
  private readonly _pipelines;
43
+ private _textureBindGroups;
28
44
  private _quadIndex;
29
45
  private _maxNodeIndex;
46
+ private _batchNodeCount;
47
+ private _nodeBooked;
30
48
  private _currentBlendMode;
31
49
  private _currentTexture;
50
+ private _passDraws;
51
+ private _instancePassBytes;
52
+ private readonly _stagedReplayGroupData;
53
+ private readonly _recordTextures;
32
54
  protected onConnect(backend: WebGpuBackend): void;
33
55
  protected onDisconnect(): void;
34
56
  render(node: TileChunkNode): void;
35
57
  private _renderPage;
36
58
  flush(): void;
59
+ /**
60
+ * Whether the packed floats of the active group matrix differ from what the
61
+ * shared projection UBO currently holds at [16, 32). Stages the packed matrix
62
+ * into `_stagedGroupData` as a side effect (idempotent - safe to call more
63
+ * than once per flush).
64
+ */
65
+ private _groupContentChanged;
37
66
  destroy(): void;
38
67
  private _getOrCreateTransformBindGroup;
39
- private _createTextureBindGroup;
68
+ /**
69
+ * Build (or reuse) the group(1) texture bind group for `texture`. The
70
+ * binding is resolved BEFORE the cache lookup on purpose: resolving is what
71
+ * syncs a dirty/mutated texture's content to the GPU, so it must run every
72
+ * flush/replay even when the bind group itself is served from cache.
73
+ */
74
+ private _getOrCreateTextureBindGroup;
75
+ /** @internal See {@link WebGpuRetainedBatchReplayer._scanRetainedNodeIndexRange}. */
76
+ _scanRetainedNodeIndexRange(bytes: Uint8Array, range: WebGpuRetainedNodeIndexRange): void;
77
+ /** @internal See {@link WebGpuRetainedBatchReplayer._rebaseRetainedNodeIndices} (group-local indices). */
78
+ _rebaseRetainedNodeIndices(bytes: Uint8Array, base: number): void;
79
+ /**
80
+ * Replay one recorded batch from its group-owned bundle into the OPEN pass.
81
+ * Reuses only recorded DATA (instance bytes, transform rows, texture, blend
82
+ * mode); every piece of STATE is resolved live - pipeline via the
83
+ * `_getPipeline` cache, the group(1) texture bind group via the live
84
+ * texture-set cache (resolving re-syncs dirty content), and the group's
85
+ * 128-byte UBO (projection from the live view + the live composed group
86
+ * matrix) written only when its content changed. The same-frame
87
+ * double-replay hazard (one group under two views while the open pass
88
+ * already holds this bundle's draws) ends the pass first.
89
+ * @internal
90
+ */
91
+ _replayRetainedBatch(payload: WebGpuRetainedBatchPayload): void;
40
92
  private _getPipeline;
41
- private _ensureInstanceCapacity;
93
+ /**
94
+ * Grow the CPU staging array to hold `instanceCount` instances, carrying the
95
+ * quads packed so far. Flush-local: the array only ever holds the pending
96
+ * batch, so it is sized independently of the pass-scoped GPU buffer.
97
+ */
98
+ private _ensureStagingCapacity;
99
+ /**
100
+ * Resolve the GPU instance buffer for `requiredBytes` - the total this pass
101
+ * would reach by appending, not this flush's own bytes. Reallocation frees the
102
+ * buffer earlier draws in the open pass read, so the caller must have ended
103
+ * that pass (and restarted the cursor) before a growing call. Capacity
104
+ * doubles, so the split a growth costs converges away within a frame or two.
105
+ */
106
+ private _ensureInstanceBufferCapacity;
42
107
  }
108
+ //# sourceMappingURL=WebGpuTileChunkRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebGpuTileChunkRenderer.d.ts","sourceRoot":"","sources":["../../../src/webgpu/WebGpuTileChunkRenderer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,0BAA0B,EAC1B,2BAA2B,EAC3B,4BAA4B,EAC7B,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAQ,aAAa,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EACL,sBAAsB,EAWvB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AActD;;;;;;GAMG;AACH,qBAAa,uBAAwB,SAAQ,sBAAsB,CAAC,aAAa,CAAE,YAAW,2BAA2B;IACvH;;;;;;;OAOG;IACH,SAAgB,wBAAwB,QAAQ;IAEhD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA2E;IAW3G,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,oBAAoB,CAAM;IAClC,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAwB;IAEzD,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,aAAa,CAAgC;IACrD,OAAO,CAAC,uBAAuB,CAAmC;IAClE,OAAO,CAAC,uBAAuB,CAAmC;IAClE,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,mBAAmB,CAA6B;IACxD,OAAO,CAAC,uBAAuB,CAA0B;IACzD,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,eAAe,CAA0B;IAIjD,OAAO,CAAC,uBAAuB,CAAK;IACpC,OAAO,CAAC,wBAAwB,CAAK;IACrC,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,gBAAgB,CAAwC;IAChE,OAAO,CAAC,eAAe,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwC;IAKnE,OAAO,CAAC,kBAAkB,CAA8G;IAExI,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAAK;IAM1B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAA2B;IACpD,OAAO,CAAC,eAAe,CAAwB;IAe/C,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,kBAAkB,CAAK;IAG/B,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAwB;IAG/D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiD;IAEjF,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAsCjD,SAAS,CAAC,YAAY,IAAI,IAAI;IAgDvB,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IA0BxC,OAAO,CAAC,WAAW;IA0FZ,KAAK,IAAI,IAAI;IAiJpB;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAUrB,OAAO,IAAI,IAAI;IAItB,OAAO,CAAC,8BAA8B;IAiBtC;;;;;OAKG;IACH,OAAO,CAAC,4BAA4B;IA4BpC,qFAAqF;IAC9E,2BAA2B,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,4BAA4B,GAAG,IAAI;IAmBhG,0GAA0G;IACnG,0BAA0B,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAexE;;;;;;;;;;;OAWG;IACI,oBAAoB,CAAC,OAAO,EAAE,0BAA0B,GAAG,IAAI;IAkGtE,OAAO,CAAC,YAAY;IAyDpB;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAyB9B;;;;;;OAMG;IACH,OAAO,CAAC,6BAA6B;CAqBtC"}