@codexo/exojs-tilemap 0.13.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.
- package/LICENSE +21 -0
- package/README.md +187 -0
- package/dist/esm/TileChunk.d.ts +136 -0
- package/dist/esm/TileChunk.js +192 -0
- package/dist/esm/TileChunk.js.map +1 -0
- package/dist/esm/TileChunkNode.d.ts +59 -0
- package/dist/esm/TileChunkNode.js +89 -0
- package/dist/esm/TileChunkNode.js.map +1 -0
- package/dist/esm/TileLayer.d.ts +229 -0
- package/dist/esm/TileLayer.js +450 -0
- package/dist/esm/TileLayer.js.map +1 -0
- package/dist/esm/TileLayerNode.d.ts +81 -0
- package/dist/esm/TileLayerNode.js +142 -0
- package/dist/esm/TileLayerNode.js.map +1 -0
- package/dist/esm/TileMap.d.ts +178 -0
- package/dist/esm/TileMap.js +262 -0
- package/dist/esm/TileMap.js.map +1 -0
- package/dist/esm/TileMapBand.d.ts +97 -0
- package/dist/esm/TileMapBand.js +161 -0
- package/dist/esm/TileMapBand.js.map +1 -0
- package/dist/esm/TileMapNode.d.ts +71 -0
- package/dist/esm/TileMapNode.js +113 -0
- package/dist/esm/TileMapNode.js.map +1 -0
- package/dist/esm/TileMapView.d.ts +182 -0
- package/dist/esm/TileMapView.js +342 -0
- package/dist/esm/TileMapView.js.map +1 -0
- package/dist/esm/TileSet.d.ts +99 -0
- package/dist/esm/TileSet.js +157 -0
- package/dist/esm/TileSet.js.map +1 -0
- package/dist/esm/chunkGeometry.d.ts +71 -0
- package/dist/esm/chunkGeometry.js +98 -0
- package/dist/esm/chunkGeometry.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +10 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/pixelSnap.d.ts +12 -0
- package/dist/esm/pixelSnap.js +19 -0
- package/dist/esm/pixelSnap.js.map +1 -0
- package/dist/esm/public.d.ts +18 -0
- package/dist/esm/register.d.ts +1 -0
- package/dist/esm/register.js +20 -0
- package/dist/esm/register.js.map +1 -0
- package/dist/esm/tilemapExtension.d.ts +18 -0
- package/dist/esm/tilemapExtension.js +52 -0
- package/dist/esm/tilemapExtension.js.map +1 -0
- package/dist/esm/types.d.ts +139 -0
- package/dist/esm/types.js +121 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/webgl2/WebGl2TileChunkRenderer.d.ts +39 -0
- package/dist/esm/webgl2/WebGl2TileChunkRenderer.js +339 -0
- package/dist/esm/webgl2/WebGl2TileChunkRenderer.js.map +1 -0
- package/dist/esm/webgpu/WebGpuTileChunkRenderer.d.ts +42 -0
- package/dist/esm/webgpu/WebGpuTileChunkRenderer.js +390 -0
- package/dist/esm/webgpu/WebGpuTileChunkRenderer.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { WebGl2Backend } from '@codexo/exojs/rendering';
|
|
2
|
+
import { AbstractWebGl2Renderer } from '@codexo/exojs/rendering';
|
|
3
|
+
import type { TileChunkNode } from '../TileChunkNode';
|
|
4
|
+
/**
|
|
5
|
+
* Instanced WebGL2 renderer for {@link TileChunkNode}. Each tile is one
|
|
6
|
+
* instanced quad; tiles are batched by `(shader, tileset texture)` and one
|
|
7
|
+
* `drawArraysInstanced` is issued per batch. Per-chunk transforms ride on the
|
|
8
|
+
* shared transform buffer (one row per chunk node), so the chunk geometry is
|
|
9
|
+
* orientation-neutral and never re-uploaded for a camera pan.
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export declare class WebGl2TileChunkRenderer extends AbstractWebGl2Renderer<TileChunkNode> {
|
|
13
|
+
private readonly _shader;
|
|
14
|
+
private readonly _batchSize;
|
|
15
|
+
private readonly _instanceData;
|
|
16
|
+
private readonly _instanceFloat32;
|
|
17
|
+
private readonly _instanceUint32;
|
|
18
|
+
private readonly _transformUnitScratch;
|
|
19
|
+
private _quadIndex;
|
|
20
|
+
private _maxNodeIndex;
|
|
21
|
+
private _currentBlendMode;
|
|
22
|
+
private _currentTexture;
|
|
23
|
+
private _currentView;
|
|
24
|
+
private _currentViewId;
|
|
25
|
+
private _instanceBuffer;
|
|
26
|
+
private _vao;
|
|
27
|
+
private _connection;
|
|
28
|
+
constructor(batchSize: number);
|
|
29
|
+
render(node: TileChunkNode): void;
|
|
30
|
+
private _renderPage;
|
|
31
|
+
private _writeRun;
|
|
32
|
+
flush(): void;
|
|
33
|
+
protected onConnect(backend: WebGl2Backend): void;
|
|
34
|
+
protected onDisconnect(): void;
|
|
35
|
+
destroy(): void;
|
|
36
|
+
private _createConnection;
|
|
37
|
+
private _createBufferRuntime;
|
|
38
|
+
private _createVaoRuntime;
|
|
39
|
+
}
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { AbstractWebGl2Renderer, Shader, RenderingPrimitives, createWebGl2ShaderProgram, WebGl2RenderBuffer, BufferTypes, BufferUsage, WebGl2VertexArrayObject } from '@codexo/exojs/rendering';
|
|
2
|
+
|
|
3
|
+
// One instance = one tile quad. Layout matches the engine's instanced-quad
|
|
4
|
+
// convention (NineSlice/Repeating): float32x4 local rect, unorm16x4 UV bounds,
|
|
5
|
+
// unorm8x4 tint, uint32 tile word (transform row + diagonal bit).
|
|
6
|
+
const instanceStrideBytes = 32;
|
|
7
|
+
const wordsPerInstance = instanceStrideBytes / Uint32Array.BYTES_PER_ELEMENT;
|
|
8
|
+
const transformTextureUnit = 1;
|
|
9
|
+
// Tile word packing: transform-buffer row in the low 29 bits, diagonal flip in
|
|
10
|
+
// bit 29. flipX/flipY are baked into the UV bounds at write time; the shader
|
|
11
|
+
// only needs the diagonal axis swap.
|
|
12
|
+
const TILE_ROW_MASK = 0x1fffffff;
|
|
13
|
+
const TILE_DIAGONAL_BIT = 0x20000000;
|
|
14
|
+
const tileVertexSource = `#version 300 es
|
|
15
|
+
precision highp float;
|
|
16
|
+
precision highp int;
|
|
17
|
+
|
|
18
|
+
// Per-instance attributes (divisor = 1). One entry per tile quad.
|
|
19
|
+
// gl_VertexID 0..3 selects which corner of the quad this invocation computes.
|
|
20
|
+
layout(location = 0) in vec4 a_quadBounds; // x0, y0, x1, y1 (chunk-local)
|
|
21
|
+
layout(location = 1) in vec4 a_uvBounds; // uMin, vMin, uMax, vMax (flipX/Y + texture flipY baked)
|
|
22
|
+
layout(location = 2) in vec4 a_color; // RGBA tint (layer opacity in alpha)
|
|
23
|
+
layout(location = 3) in uint a_tileWord; // transform row (bits 0..28) | diagonal (bit 29)
|
|
24
|
+
|
|
25
|
+
uniform mat3 u_projection;
|
|
26
|
+
uniform sampler2D u_transforms; // shared per-frame transform buffer (2 texels/row)
|
|
27
|
+
|
|
28
|
+
out vec2 v_texcoord;
|
|
29
|
+
out vec4 v_color;
|
|
30
|
+
|
|
31
|
+
void main(void) {
|
|
32
|
+
// gl_VertexID 0..3 -> corner: 0=TL, 1=TR, 2=BL, 3=BR (TRIANGLE_STRIP order)
|
|
33
|
+
int vid = gl_VertexID;
|
|
34
|
+
int cornerX = vid & 1;
|
|
35
|
+
int cornerY = (vid >> 1) & 1;
|
|
36
|
+
|
|
37
|
+
float localX = (cornerX == 0) ? a_quadBounds.x : a_quadBounds.z;
|
|
38
|
+
float localY = (cornerY == 0) ? a_quadBounds.y : a_quadBounds.w;
|
|
39
|
+
|
|
40
|
+
int row = int(a_tileWord & ${TILE_ROW_MASK}u);
|
|
41
|
+
bool diagonal = (a_tileWord & ${TILE_DIAGONAL_BIT}u) != 0u;
|
|
42
|
+
|
|
43
|
+
vec4 m0 = texelFetch(u_transforms, ivec2(0, row), 0); // a, b, c, d
|
|
44
|
+
vec4 m1 = texelFetch(u_transforms, ivec2(1, row), 0); // tx, ty, 0, 0
|
|
45
|
+
|
|
46
|
+
float worldX = (m0.x * localX) + (m0.y * localY) + m1.x;
|
|
47
|
+
float worldY = (m0.z * localX) + (m0.w * localY) + m1.y;
|
|
48
|
+
|
|
49
|
+
gl_Position = vec4((u_projection * vec3(worldX, worldY, 1.0)).xy, 0.0, 1.0);
|
|
50
|
+
|
|
51
|
+
// Tile orientation: the diagonal flip transposes the corner-coordinate axes
|
|
52
|
+
// before the UV corner is selected; flipX/flipY are already baked into the
|
|
53
|
+
// (uMin,uMax)/(vMin,vMax) ordering by the CPU writer.
|
|
54
|
+
int su = cornerX;
|
|
55
|
+
int sv = cornerY;
|
|
56
|
+
if (diagonal) { int t = su; su = sv; sv = t; }
|
|
57
|
+
|
|
58
|
+
float u = (su == 0) ? a_uvBounds.x : a_uvBounds.z;
|
|
59
|
+
float v = (sv == 0) ? a_uvBounds.y : a_uvBounds.w;
|
|
60
|
+
v_texcoord = vec2(u, v);
|
|
61
|
+
|
|
62
|
+
v_color = vec4(a_color.rgb * a_color.a, a_color.a);
|
|
63
|
+
}`;
|
|
64
|
+
const tileFragmentSource = `#version 300 es
|
|
65
|
+
precision highp float;
|
|
66
|
+
|
|
67
|
+
uniform sampler2D u_texture;
|
|
68
|
+
|
|
69
|
+
in vec2 v_texcoord;
|
|
70
|
+
in vec4 v_color;
|
|
71
|
+
|
|
72
|
+
layout(location = 0) out vec4 fragColor;
|
|
73
|
+
|
|
74
|
+
void main(void) {
|
|
75
|
+
vec4 sampleColor = texture(u_texture, v_texcoord);
|
|
76
|
+
fragColor = sampleColor * v_color;
|
|
77
|
+
}`;
|
|
78
|
+
/**
|
|
79
|
+
* Instanced WebGL2 renderer for {@link TileChunkNode}. Each tile is one
|
|
80
|
+
* instanced quad; tiles are batched by `(shader, tileset texture)` and one
|
|
81
|
+
* `drawArraysInstanced` is issued per batch. Per-chunk transforms ride on the
|
|
82
|
+
* shared transform buffer (one row per chunk node), so the chunk geometry is
|
|
83
|
+
* orientation-neutral and never re-uploaded for a camera pan.
|
|
84
|
+
* @internal
|
|
85
|
+
*/
|
|
86
|
+
class WebGl2TileChunkRenderer extends AbstractWebGl2Renderer {
|
|
87
|
+
_shader;
|
|
88
|
+
_batchSize;
|
|
89
|
+
_instanceData;
|
|
90
|
+
_instanceFloat32;
|
|
91
|
+
_instanceUint32;
|
|
92
|
+
_transformUnitScratch = new Int32Array([transformTextureUnit]);
|
|
93
|
+
_quadIndex = 0;
|
|
94
|
+
_maxNodeIndex = 0;
|
|
95
|
+
_currentBlendMode = null;
|
|
96
|
+
_currentTexture = null;
|
|
97
|
+
_currentView = null;
|
|
98
|
+
_currentViewId = -1;
|
|
99
|
+
_instanceBuffer = null;
|
|
100
|
+
_vao = null;
|
|
101
|
+
_connection = null;
|
|
102
|
+
constructor(batchSize) {
|
|
103
|
+
super();
|
|
104
|
+
this._batchSize = batchSize;
|
|
105
|
+
this._shader = new Shader(tileVertexSource, tileFragmentSource);
|
|
106
|
+
this._instanceData = new ArrayBuffer(batchSize * instanceStrideBytes);
|
|
107
|
+
this._instanceFloat32 = new Float32Array(this._instanceData);
|
|
108
|
+
this._instanceUint32 = new Uint32Array(this._instanceData);
|
|
109
|
+
}
|
|
110
|
+
render(node) {
|
|
111
|
+
const pages = node.pages;
|
|
112
|
+
if (pages.length === 0) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const backend = this.getBackend();
|
|
116
|
+
const blendMode = node.blendMode;
|
|
117
|
+
const tintRgba = node.tint.toRgba();
|
|
118
|
+
const command = backend.activeDrawCommand;
|
|
119
|
+
const nodeIndex = command !== null ? command.nodeIndex : backend._pushTransform(node);
|
|
120
|
+
for (const page of pages) {
|
|
121
|
+
this._renderPage(backend, page.texture, page.quads, blendMode, tintRgba, nodeIndex);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
_renderPage(backend, texture, quads, blendMode, tintRgba, nodeIndex) {
|
|
125
|
+
if (quads.length === 0) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const textureChanged = this._currentTexture !== null && texture !== this._currentTexture;
|
|
129
|
+
const blendModeChanged = blendMode !== this._currentBlendMode;
|
|
130
|
+
if (this._quadIndex > 0 && (blendModeChanged || textureChanged || this._quadIndex + quads.length > this._batchSize)) {
|
|
131
|
+
this.flush();
|
|
132
|
+
}
|
|
133
|
+
if (this._currentBlendMode === null || this._currentBlendMode !== blendMode) {
|
|
134
|
+
this._currentBlendMode = blendMode;
|
|
135
|
+
backend.setBlendMode(blendMode);
|
|
136
|
+
}
|
|
137
|
+
if (this._currentTexture !== texture) {
|
|
138
|
+
this._currentTexture = texture;
|
|
139
|
+
backend.bindTexture(texture, 0);
|
|
140
|
+
}
|
|
141
|
+
const flipY = texture.flipY;
|
|
142
|
+
// A chunk page may hold more tiles than the fixed batch buffer; write in
|
|
143
|
+
// batch-sized runs, flushing (and re-establishing state) between runs.
|
|
144
|
+
let offset = 0;
|
|
145
|
+
while (offset < quads.length) {
|
|
146
|
+
const remaining = quads.length - offset;
|
|
147
|
+
const runSize = Math.min(remaining, this._batchSize);
|
|
148
|
+
this._writeRun(quads, offset, runSize, flipY, tintRgba, nodeIndex);
|
|
149
|
+
offset += runSize;
|
|
150
|
+
if (offset < quads.length) {
|
|
151
|
+
this.flush();
|
|
152
|
+
this._currentBlendMode = blendMode;
|
|
153
|
+
backend.setBlendMode(blendMode);
|
|
154
|
+
this._currentTexture = texture;
|
|
155
|
+
backend.bindTexture(texture, 0);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
_writeRun(quads, offset, count, flipY, tintRgba, nodeIndex) {
|
|
160
|
+
const f32 = this._instanceFloat32;
|
|
161
|
+
const u32 = this._instanceUint32;
|
|
162
|
+
const baseWord = nodeIndex & TILE_ROW_MASK;
|
|
163
|
+
for (let i = 0; i < count; i++) {
|
|
164
|
+
const q = quads[offset + i];
|
|
165
|
+
const idx = this._quadIndex * wordsPerInstance;
|
|
166
|
+
f32[idx + 0] = q.x0;
|
|
167
|
+
f32[idx + 1] = q.y0;
|
|
168
|
+
f32[idx + 2] = q.x1;
|
|
169
|
+
f32[idx + 3] = q.y1;
|
|
170
|
+
// Bake flipX/flipY into the UV corner ordering; the diagonal axis swap is
|
|
171
|
+
// resolved in the shader. Texture flipY (uploaded-flipped atlases) is an
|
|
172
|
+
// additional vertical swap that composes with the tile flipY.
|
|
173
|
+
const flipX = (q.orient & 1) !== 0;
|
|
174
|
+
const tileFlipY = (q.orient & 2) !== 0;
|
|
175
|
+
const diagonal = (q.orient & 4) !== 0;
|
|
176
|
+
const uA = flipX ? q.u1 : q.u0;
|
|
177
|
+
const uB = flipX ? q.u0 : q.u1;
|
|
178
|
+
let vA = tileFlipY ? q.v1 : q.v0;
|
|
179
|
+
let vB = tileFlipY ? q.v0 : q.v1;
|
|
180
|
+
if (flipY) {
|
|
181
|
+
const swap = vA;
|
|
182
|
+
vA = vB;
|
|
183
|
+
vB = swap;
|
|
184
|
+
}
|
|
185
|
+
const uMin = (uA * 0xffff) & 0xffff;
|
|
186
|
+
const vMin = (vA * 0xffff) & 0xffff;
|
|
187
|
+
const uMax = (uB * 0xffff) & 0xffff;
|
|
188
|
+
const vMax = (vB * 0xffff) & 0xffff;
|
|
189
|
+
u32[idx + 4] = uMin | (vMin << 16);
|
|
190
|
+
u32[idx + 5] = uMax | (vMax << 16);
|
|
191
|
+
u32[idx + 6] = tintRgba;
|
|
192
|
+
u32[idx + 7] = (diagonal ? baseWord | TILE_DIAGONAL_BIT : baseWord) >>> 0;
|
|
193
|
+
this._quadIndex++;
|
|
194
|
+
}
|
|
195
|
+
if (nodeIndex > this._maxNodeIndex) {
|
|
196
|
+
this._maxNodeIndex = nodeIndex;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
flush() {
|
|
200
|
+
const backend = this.getBackendOrNull();
|
|
201
|
+
const instanceBuffer = this._instanceBuffer;
|
|
202
|
+
const vao = this._vao;
|
|
203
|
+
if (this._quadIndex === 0 || backend === null || instanceBuffer === null || vao === null) {
|
|
204
|
+
this._quadIndex = 0;
|
|
205
|
+
this._maxNodeIndex = 0;
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const view = backend.view;
|
|
209
|
+
if (this._currentView !== view || this._currentViewId !== view.updateId) {
|
|
210
|
+
this._currentView = view;
|
|
211
|
+
this._currentViewId = view.updateId;
|
|
212
|
+
this._shader.getUniform('u_projection').setValue(view.getTransform().toArray(false));
|
|
213
|
+
}
|
|
214
|
+
if (this._currentTexture !== null) {
|
|
215
|
+
this._shader.getUniform('u_texture').setValue(new Int32Array([0]));
|
|
216
|
+
}
|
|
217
|
+
backend.bindTransformBufferTexture(transformTextureUnit, this._maxNodeIndex + 1);
|
|
218
|
+
this._shader.getUniform('u_transforms').setValue(this._transformUnitScratch);
|
|
219
|
+
this._shader.sync();
|
|
220
|
+
backend.bindVertexArrayObject(vao);
|
|
221
|
+
instanceBuffer.upload(this._instanceFloat32.subarray(0, this._quadIndex * wordsPerInstance));
|
|
222
|
+
vao.drawInstanced(4, 0, this._quadIndex, RenderingPrimitives.TriangleStrip);
|
|
223
|
+
backend.stats.batches++;
|
|
224
|
+
backend.stats.drawCalls++;
|
|
225
|
+
this._quadIndex = 0;
|
|
226
|
+
this._maxNodeIndex = 0;
|
|
227
|
+
}
|
|
228
|
+
onConnect(backend) {
|
|
229
|
+
const gl = backend.context;
|
|
230
|
+
this._shader.connect(createWebGl2ShaderProgram(gl));
|
|
231
|
+
this._connection = this._createConnection(gl);
|
|
232
|
+
this._instanceBuffer = new WebGl2RenderBuffer(BufferTypes.ArrayBuffer, this._instanceData, BufferUsage.DynamicDraw).connect(this._createBufferRuntime(this._connection));
|
|
233
|
+
this._shader.sync();
|
|
234
|
+
this._vao = new WebGl2VertexArrayObject(RenderingPrimitives.TriangleStrip)
|
|
235
|
+
.addAttribute(this._instanceBuffer, this._shader.getAttribute('a_quadBounds'), gl.FLOAT, false, instanceStrideBytes, 0, false, 1)
|
|
236
|
+
.addAttribute(this._instanceBuffer, this._shader.getAttribute('a_uvBounds'), gl.UNSIGNED_SHORT, true, instanceStrideBytes, 16, false, 1)
|
|
237
|
+
.addAttribute(this._instanceBuffer, this._shader.getAttribute('a_color'), gl.UNSIGNED_BYTE, true, instanceStrideBytes, 24, false, 1)
|
|
238
|
+
.addAttribute(this._instanceBuffer, this._shader.getAttribute('a_tileWord'), gl.UNSIGNED_INT, false, instanceStrideBytes, 28, true, 1)
|
|
239
|
+
.connect(this._createVaoRuntime(this._connection));
|
|
240
|
+
}
|
|
241
|
+
onDisconnect() {
|
|
242
|
+
this._shader.disconnect();
|
|
243
|
+
this._instanceBuffer?.destroy();
|
|
244
|
+
this._instanceBuffer = null;
|
|
245
|
+
this._vao?.destroy();
|
|
246
|
+
this._vao = null;
|
|
247
|
+
this._connection = null;
|
|
248
|
+
this._currentBlendMode = null;
|
|
249
|
+
this._currentTexture = null;
|
|
250
|
+
this._currentView = null;
|
|
251
|
+
this._currentViewId = -1;
|
|
252
|
+
this._quadIndex = 0;
|
|
253
|
+
this._maxNodeIndex = 0;
|
|
254
|
+
}
|
|
255
|
+
destroy() {
|
|
256
|
+
this.disconnect();
|
|
257
|
+
this._shader.destroy();
|
|
258
|
+
}
|
|
259
|
+
_createConnection(gl) {
|
|
260
|
+
const vaoHandle = gl.createVertexArray();
|
|
261
|
+
if (vaoHandle === null) {
|
|
262
|
+
throw new Error('WebGl2TileChunkRenderer: could not create vertex array object.');
|
|
263
|
+
}
|
|
264
|
+
return { gl, buffers: new Map(), vaoHandle };
|
|
265
|
+
}
|
|
266
|
+
_createBufferRuntime(connection) {
|
|
267
|
+
const handle = connection.gl.createBuffer();
|
|
268
|
+
if (handle === null) {
|
|
269
|
+
throw new Error('WebGl2TileChunkRenderer: could not create render buffer.');
|
|
270
|
+
}
|
|
271
|
+
return {
|
|
272
|
+
bind: (buffer) => {
|
|
273
|
+
connection.gl.bindBuffer(buffer.type, handle);
|
|
274
|
+
},
|
|
275
|
+
upload: (buffer, offset) => {
|
|
276
|
+
const gl = connection.gl;
|
|
277
|
+
const data = buffer.data;
|
|
278
|
+
const state = connection.buffers.get(buffer);
|
|
279
|
+
gl.bindBuffer(buffer.type, handle);
|
|
280
|
+
if (state && state.dataByteLength >= data.byteLength) {
|
|
281
|
+
gl.bufferSubData(buffer.type, offset, data);
|
|
282
|
+
state.dataByteLength = data.byteLength;
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
gl.bufferData(buffer.type, data, buffer.usage);
|
|
286
|
+
connection.buffers.set(buffer, { handle, dataByteLength: data.byteLength });
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
destroy: (buffer) => {
|
|
290
|
+
connection.gl.deleteBuffer(handle);
|
|
291
|
+
connection.buffers.delete(buffer);
|
|
292
|
+
buffer.disconnect();
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
_createVaoRuntime(connection) {
|
|
297
|
+
let appliedVersion = -1;
|
|
298
|
+
return {
|
|
299
|
+
bind: (vao) => {
|
|
300
|
+
const gl = connection.gl;
|
|
301
|
+
gl.bindVertexArray(connection.vaoHandle);
|
|
302
|
+
if (appliedVersion !== vao.version) {
|
|
303
|
+
let lastBuffer = null;
|
|
304
|
+
for (const attribute of vao.attributes) {
|
|
305
|
+
if (lastBuffer !== attribute.buffer) {
|
|
306
|
+
attribute.buffer.bind();
|
|
307
|
+
lastBuffer = attribute.buffer;
|
|
308
|
+
}
|
|
309
|
+
if (attribute.integer) {
|
|
310
|
+
gl.vertexAttribIPointer(attribute.location, attribute.size, attribute.type, attribute.stride, attribute.start);
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
gl.vertexAttribPointer(attribute.location, attribute.size, attribute.type, attribute.normalized, attribute.stride, attribute.start);
|
|
314
|
+
}
|
|
315
|
+
gl.enableVertexAttribArray(attribute.location);
|
|
316
|
+
gl.vertexAttribDivisor(attribute.location, attribute.divisor);
|
|
317
|
+
}
|
|
318
|
+
appliedVersion = vao.version;
|
|
319
|
+
}
|
|
320
|
+
},
|
|
321
|
+
unbind: () => {
|
|
322
|
+
connection.gl.bindVertexArray(null);
|
|
323
|
+
},
|
|
324
|
+
draw: (_vao, size, start, type) => {
|
|
325
|
+
connection.gl.drawArrays(type, start, size);
|
|
326
|
+
},
|
|
327
|
+
drawInstanced: (_vao, count, start, instanceCount, type) => {
|
|
328
|
+
connection.gl.drawArraysInstanced(type, start, count, instanceCount);
|
|
329
|
+
},
|
|
330
|
+
destroy: (vao) => {
|
|
331
|
+
connection.gl.deleteVertexArray(connection.vaoHandle);
|
|
332
|
+
vao.disconnect();
|
|
333
|
+
},
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
export { WebGl2TileChunkRenderer };
|
|
339
|
+
//# sourceMappingURL=WebGl2TileChunkRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebGl2TileChunkRenderer.js","sources":["../../../../src/webgl2/WebGl2TileChunkRenderer.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { WebGpuBackend } from '@codexo/exojs/rendering';
|
|
2
|
+
import { AbstractWebGpuRenderer } from '@codexo/exojs/rendering';
|
|
3
|
+
import type { TileChunkNode } from '../TileChunkNode';
|
|
4
|
+
/**
|
|
5
|
+
* Instanced WebGPU renderer for {@link TileChunkNode}, the parity counterpart of
|
|
6
|
+
* the WebGL2 renderer. Same instance layout and orientation handling; per-chunk
|
|
7
|
+
* transforms ride on the backend's shared transform storage buffer, and the
|
|
8
|
+
* instance buffer grows on demand rather than flushing in fixed runs.
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export declare class WebGpuTileChunkRenderer extends AbstractWebGpuRenderer<TileChunkNode> {
|
|
12
|
+
private readonly _projectionData;
|
|
13
|
+
private _device;
|
|
14
|
+
private _shaderModule;
|
|
15
|
+
private _uniformBindGroupLayout;
|
|
16
|
+
private _textureBindGroupLayout;
|
|
17
|
+
private _pipelineLayout;
|
|
18
|
+
private _uniformBuffer;
|
|
19
|
+
private _transformBindGroup;
|
|
20
|
+
private _transformStorageBuffer;
|
|
21
|
+
private _indexBuffer;
|
|
22
|
+
private _instanceBuffer;
|
|
23
|
+
private _instanceCapacity;
|
|
24
|
+
private _instanceData;
|
|
25
|
+
private _instanceFloat32;
|
|
26
|
+
private _instanceUint32;
|
|
27
|
+
private readonly _pipelines;
|
|
28
|
+
private _quadIndex;
|
|
29
|
+
private _maxNodeIndex;
|
|
30
|
+
private _currentBlendMode;
|
|
31
|
+
private _currentTexture;
|
|
32
|
+
protected onConnect(backend: WebGpuBackend): void;
|
|
33
|
+
protected onDisconnect(): void;
|
|
34
|
+
render(node: TileChunkNode): void;
|
|
35
|
+
private _renderPage;
|
|
36
|
+
flush(): void;
|
|
37
|
+
destroy(): void;
|
|
38
|
+
private _getOrCreateTransformBindGroup;
|
|
39
|
+
private _createTextureBindGroup;
|
|
40
|
+
private _getPipeline;
|
|
41
|
+
private _ensureInstanceCapacity;
|
|
42
|
+
}
|