@sadhaka/loom-engine 0.11.0 → 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.
Files changed (51) hide show
  1. package/COMMERCIAL_LICENSE_TERMS.md +74 -0
  2. package/README.md +230 -6
  3. package/dist/components/peer-sprite.d.ts +25 -0
  4. package/dist/components/peer-sprite.d.ts.map +1 -0
  5. package/dist/components/peer-sprite.js +48 -0
  6. package/dist/components/peer-sprite.js.map +1 -0
  7. package/dist/engine.d.ts +6 -1
  8. package/dist/engine.d.ts.map +1 -1
  9. package/dist/engine.js +35 -1
  10. package/dist/engine.js.map +1 -1
  11. package/dist/index.d.ts +19 -3
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +17 -2
  14. package/dist/index.js.map +1 -1
  15. package/dist/network/mock-multiplayer-bridge.d.ts +34 -0
  16. package/dist/network/mock-multiplayer-bridge.d.ts.map +1 -0
  17. package/dist/network/mock-multiplayer-bridge.js +91 -0
  18. package/dist/network/mock-multiplayer-bridge.js.map +1 -0
  19. package/dist/network/multiplayer-bridge.d.ts +45 -0
  20. package/dist/network/multiplayer-bridge.d.ts.map +1 -0
  21. package/dist/network/multiplayer-bridge.js +34 -0
  22. package/dist/network/multiplayer-bridge.js.map +1 -0
  23. package/dist/network/peer-pool.d.ts +46 -0
  24. package/dist/network/peer-pool.d.ts.map +1 -0
  25. package/dist/network/peer-pool.js +185 -0
  26. package/dist/network/peer-pool.js.map +1 -0
  27. package/dist/network/sse-multiplayer-bridge.d.ts +36 -0
  28. package/dist/network/sse-multiplayer-bridge.d.ts.map +1 -0
  29. package/dist/network/sse-multiplayer-bridge.js +264 -0
  30. package/dist/network/sse-multiplayer-bridge.js.map +1 -0
  31. package/dist/renderer/shaders/sprite-shader-source.d.ts +4 -0
  32. package/dist/renderer/shaders/sprite-shader-source.d.ts.map +1 -0
  33. package/dist/renderer/shaders/sprite-shader-source.js +83 -0
  34. package/dist/renderer/shaders/sprite-shader-source.js.map +1 -0
  35. package/dist/renderer/sprite-batcher.d.ts +30 -0
  36. package/dist/renderer/sprite-batcher.d.ts.map +1 -0
  37. package/dist/renderer/sprite-batcher.js +146 -0
  38. package/dist/renderer/sprite-batcher.js.map +1 -0
  39. package/dist/renderer/texture-atlas.d.ts +24 -0
  40. package/dist/renderer/texture-atlas.d.ts.map +1 -0
  41. package/dist/renderer/texture-atlas.js +173 -0
  42. package/dist/renderer/texture-atlas.js.map +1 -0
  43. package/dist/renderer/webgl2-device.d.ts +53 -0
  44. package/dist/renderer/webgl2-device.d.ts.map +1 -0
  45. package/dist/renderer/webgl2-device.js +596 -0
  46. package/dist/renderer/webgl2-device.js.map +1 -0
  47. package/dist/systems/peer-presence-system.d.ts +19 -0
  48. package/dist/systems/peer-presence-system.d.ts.map +1 -0
  49. package/dist/systems/peer-presence-system.js +118 -0
  50. package/dist/systems/peer-presence-system.js.map +1 -0
  51. package/package.json +11 -5
@@ -0,0 +1,596 @@
1
+ // WebGL2 backend for the Loom Engine.
2
+ //
3
+ // Phase 14.1 - lifts the Canvas2D ~2k sprite ceiling to 50k+ via
4
+ // instanced batching. Architecture:
5
+ //
6
+ // drawSprite/drawTile/drawParticle/drawText
7
+ // -> compute screen-space origin + size in JS (parity with
8
+ // Canvas2DDevice math)
9
+ // -> push instance into SpriteBatcher
10
+ // -> on atlas/blend-mode change: flush
11
+ // -> upload instance buffer (gl.bufferSubData)
12
+ // -> drawArraysInstanced(TRIANGLES, 0, 6, instanceCount)
13
+ // -> endFrame drains the last batch
14
+ //
15
+ // The Canvas2DDevice path is unchanged; this device implements the
16
+ // same IGraphicsDevice contract so consumers swap backends without
17
+ // touching call sites. Engine.create({ backend: 'webgl2' }) is the
18
+ // supported entry. EngineOptions.device lets advanced consumers
19
+ // inject a pre-built device for tree-shaking or shared-context
20
+ // scenarios.
21
+ //
22
+ // Context-loss handling: WebGL2 contexts can be lost when the GPU
23
+ // driver crashes, the tab is backgrounded for a long time, or a
24
+ // Chrome extension hijacks the context. We register webglcontext-
25
+ // lost / webglcontextrestored listeners and:
26
+ // lost -> preventDefault to opt into restore, mark all atlases
27
+ // + GL objects invalid, stop drawing.
28
+ // restored -> recompile shaders, recreate VAO + buffers, re-upload
29
+ // every TextureAtlas from its cached source image.
30
+ // Frames during the lost interval no-op cleanly.
31
+ import { worldToScreen, } from './camera.js';
32
+ import { ISO_HALF_W, ISO_HALF_H, ISO_Z_SCALE, } from './iso-projection.js';
33
+ import { TextureAtlas, makeParticleDiscAtlas } from './texture-atlas.js';
34
+ import { SpriteBatcher, FLOATS_PER_INSTANCE, } from './sprite-batcher.js';
35
+ import { SPRITE_VERT_SRC, SPRITE_FRAG_SRC, UNIT_QUAD_VERTICES, } from './shaders/sprite-shader-source.js';
36
+ import { registerBackend } from '../engine.js';
37
+ const SCRATCH_VEC2 = { x: 0, y: 0 };
38
+ const SCRATCH_FRAME_SIZE = { w: 0, h: 0 };
39
+ const SCRATCH_UV = new Float32Array(4);
40
+ const SCRATCH_STATS = { flushCount: 0, instanceTotal: 0, capacity: 0 };
41
+ // Vertex attribute indices. Must agree with the layout(location=) in
42
+ // sprite-shader-source.ts.
43
+ const ATTRIB_QUAD_VERTEX = 0;
44
+ const ATTRIB_ORIGIN = 1;
45
+ const ATTRIB_SIZE = 2;
46
+ const ATTRIB_UV_RECT = 3;
47
+ const ATTRIB_TINT = 4;
48
+ // Bytes per instance. 12 floats * 4 bytes.
49
+ const INSTANCE_STRIDE_BYTES = FLOATS_PER_INSTANCE * 4;
50
+ // Initial dynamic-buffer capacity in instances. Grows by doubling
51
+ // whenever the batcher's CPU buffer outgrows it.
52
+ const INITIAL_INSTANCE_CAPACITY = 1024;
53
+ // Cache cap for drawText baked textures. Beyond this, we evict the
54
+ // oldest insertion to bound memory. 256 unique strings is generous
55
+ // for a typical scene.
56
+ const TEXT_CACHE_LIMIT = 256;
57
+ export class WebGL2Device {
58
+ canvas;
59
+ viewportWidth;
60
+ viewportHeight;
61
+ gl;
62
+ program = null;
63
+ vao = null;
64
+ quadVBO = null;
65
+ instanceVBO = null;
66
+ // Bytes currently allocated for the instance VBO. Grows as the
67
+ // batcher reports a larger CPU buffer.
68
+ instanceVBOBytes = 0;
69
+ atlases = [];
70
+ nextAtlasHandle = 0;
71
+ camera = null;
72
+ drawCallCount = 0;
73
+ batcher;
74
+ // Lazy: only built on first drawParticle call. Tests bypass.
75
+ particleAtlas = null;
76
+ // drawText cache. Keyed by `${font}|${fillCss}|${align}|${baseline}|${text}`.
77
+ // Insertion-order Map gives us LRU-by-recency for free since Map
78
+ // iteration starts from oldest entry.
79
+ textCache = new Map();
80
+ // Context-loss state. While true, every draw is a no-op until we
81
+ // recover. Listeners track the live state.
82
+ contextLost = false;
83
+ boundOnLost = null;
84
+ boundOnRestored = null;
85
+ // Test/diagnostic hooks.
86
+ lastUpload = { count: 0, floats: 0 };
87
+ constructor(canvas, gl) {
88
+ this.canvas = canvas;
89
+ this.viewportWidth = canvas.width;
90
+ this.viewportHeight = canvas.height;
91
+ var ctx = gl ?? canvas.getContext('webgl2');
92
+ if (!ctx) {
93
+ throw new Error('WebGL2Device: failed to acquire webgl2 context. ' +
94
+ 'Browsers without WebGL2 (Safari < 15, etc.) should fall back to Canvas2DDevice.');
95
+ }
96
+ this.gl = ctx;
97
+ // Wire context-loss listeners early so partial setup failures
98
+ // still get cleaned up. canvas may be a stub in tests; guard the
99
+ // call to keep the path universal.
100
+ if (typeof canvas.addEventListener === 'function') {
101
+ this.boundOnLost = (e) => {
102
+ e.preventDefault();
103
+ this.handleContextLoss();
104
+ };
105
+ this.boundOnRestored = () => {
106
+ this.handleContextRestored();
107
+ };
108
+ canvas.addEventListener('webglcontextlost', this.boundOnLost, false);
109
+ canvas.addEventListener('webglcontextrestored', this.boundOnRestored, false);
110
+ }
111
+ // Pixel-art friendly defaults. Match Canvas2DDevice's
112
+ // imageSmoothingEnabled = false. Per-atlas overrides happen in
113
+ // texture-atlas.ts.
114
+ this.gl.disable(this.gl.DEPTH_TEST);
115
+ this.gl.disable(this.gl.CULL_FACE);
116
+ this.gl.enable(this.gl.BLEND);
117
+ this.initGLResources();
118
+ // Batcher with a flush handler that does the actual GL upload +
119
+ // draw. Bound here so we can reach this.gl + this.program.
120
+ this.batcher = new SpriteBatcher((atlas, blend, data, count) => this.executeFlush(atlas, blend, data, count), INITIAL_INSTANCE_CAPACITY);
121
+ }
122
+ // Compile + link program, build VAO + buffers. Idempotent: called
123
+ // from constructor and again on context-restore.
124
+ initGLResources() {
125
+ var gl = this.gl;
126
+ this.program = this.compileProgram();
127
+ if (!this.program)
128
+ return;
129
+ var vao = gl.createVertexArray();
130
+ if (!vao)
131
+ return;
132
+ gl.bindVertexArray(vao);
133
+ this.vao = vao;
134
+ // Static unit-quad. 6 vertices x 2 floats = 12 floats. Bound to
135
+ // attrib 0 with divisor 0.
136
+ var quad = gl.createBuffer();
137
+ if (!quad)
138
+ return;
139
+ gl.bindBuffer(gl.ARRAY_BUFFER, quad);
140
+ gl.bufferData(gl.ARRAY_BUFFER, UNIT_QUAD_VERTICES, gl.STATIC_DRAW);
141
+ gl.enableVertexAttribArray(ATTRIB_QUAD_VERTEX);
142
+ gl.vertexAttribPointer(ATTRIB_QUAD_VERTEX, 2, gl.FLOAT, false, 0, 0);
143
+ gl.vertexAttribDivisor(ATTRIB_QUAD_VERTEX, 0);
144
+ this.quadVBO = quad;
145
+ // Dynamic instance VBO. Bound to attribs 1..4 with divisor 1.
146
+ var inst = gl.createBuffer();
147
+ if (!inst)
148
+ return;
149
+ gl.bindBuffer(gl.ARRAY_BUFFER, inst);
150
+ var initBytes = INITIAL_INSTANCE_CAPACITY * INSTANCE_STRIDE_BYTES;
151
+ gl.bufferData(gl.ARRAY_BUFFER, initBytes, gl.DYNAMIC_DRAW);
152
+ this.instanceVBO = inst;
153
+ this.instanceVBOBytes = initBytes;
154
+ // origin: 2 floats at offset 0
155
+ gl.enableVertexAttribArray(ATTRIB_ORIGIN);
156
+ gl.vertexAttribPointer(ATTRIB_ORIGIN, 2, gl.FLOAT, false, INSTANCE_STRIDE_BYTES, 0);
157
+ gl.vertexAttribDivisor(ATTRIB_ORIGIN, 1);
158
+ // size: 2 floats at offset 8
159
+ gl.enableVertexAttribArray(ATTRIB_SIZE);
160
+ gl.vertexAttribPointer(ATTRIB_SIZE, 2, gl.FLOAT, false, INSTANCE_STRIDE_BYTES, 8);
161
+ gl.vertexAttribDivisor(ATTRIB_SIZE, 1);
162
+ // uvRect: 4 floats at offset 16
163
+ gl.enableVertexAttribArray(ATTRIB_UV_RECT);
164
+ gl.vertexAttribPointer(ATTRIB_UV_RECT, 4, gl.FLOAT, false, INSTANCE_STRIDE_BYTES, 16);
165
+ gl.vertexAttribDivisor(ATTRIB_UV_RECT, 1);
166
+ // tint: 4 floats at offset 32
167
+ gl.enableVertexAttribArray(ATTRIB_TINT);
168
+ gl.vertexAttribPointer(ATTRIB_TINT, 4, gl.FLOAT, false, INSTANCE_STRIDE_BYTES, 32);
169
+ gl.vertexAttribDivisor(ATTRIB_TINT, 1);
170
+ gl.bindVertexArray(null);
171
+ }
172
+ compileProgram() {
173
+ var gl = this.gl;
174
+ var vert = gl.createShader(gl.VERTEX_SHADER);
175
+ var frag = gl.createShader(gl.FRAGMENT_SHADER);
176
+ if (!vert || !frag)
177
+ return null;
178
+ gl.shaderSource(vert, SPRITE_VERT_SRC);
179
+ gl.compileShader(vert);
180
+ if (!gl.getShaderParameter(vert, gl.COMPILE_STATUS)) {
181
+ var vlog = gl.getShaderInfoLog(vert) ?? '';
182
+ gl.deleteShader(vert);
183
+ gl.deleteShader(frag);
184
+ throw new Error('WebGL2Device: vertex shader compile failed: ' + vlog);
185
+ }
186
+ gl.shaderSource(frag, SPRITE_FRAG_SRC);
187
+ gl.compileShader(frag);
188
+ if (!gl.getShaderParameter(frag, gl.COMPILE_STATUS)) {
189
+ var flog = gl.getShaderInfoLog(frag) ?? '';
190
+ gl.deleteShader(vert);
191
+ gl.deleteShader(frag);
192
+ throw new Error('WebGL2Device: fragment shader compile failed: ' + flog);
193
+ }
194
+ var program = gl.createProgram();
195
+ if (!program) {
196
+ gl.deleteShader(vert);
197
+ gl.deleteShader(frag);
198
+ return null;
199
+ }
200
+ gl.attachShader(program, vert);
201
+ gl.attachShader(program, frag);
202
+ gl.linkProgram(program);
203
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
204
+ var plog = gl.getProgramInfoLog(program) ?? '';
205
+ gl.deleteProgram(program);
206
+ gl.deleteShader(vert);
207
+ gl.deleteShader(frag);
208
+ throw new Error('WebGL2Device: program link failed: ' + plog);
209
+ }
210
+ // Shaders are owned by the program after attach + link.
211
+ gl.deleteShader(vert);
212
+ gl.deleteShader(frag);
213
+ var uViewport = gl.getUniformLocation(program, 'u_viewport');
214
+ var uAtlas = gl.getUniformLocation(program, 'u_atlas');
215
+ return { program: program, uViewport: uViewport, uAtlas: uAtlas };
216
+ }
217
+ handleContextLoss() {
218
+ this.contextLost = true;
219
+ // Mark all atlases invalid. Their GL textures are gone.
220
+ for (var i = 0; i < this.atlases.length; i++) {
221
+ var a = this.atlases[i];
222
+ if (a)
223
+ a.handleContextLoss();
224
+ }
225
+ this.textCache.forEach((t) => t.handleContextLoss());
226
+ if (this.particleAtlas)
227
+ this.particleAtlas.handleContextLoss();
228
+ // GL objects are invalid; drop refs so re-init works clean.
229
+ this.program = null;
230
+ this.vao = null;
231
+ this.quadVBO = null;
232
+ this.instanceVBO = null;
233
+ this.instanceVBOBytes = 0;
234
+ }
235
+ handleContextRestored() {
236
+ this.contextLost = false;
237
+ this.initGLResources();
238
+ var gl = this.gl;
239
+ // Re-upload every live atlas from its cached source image.
240
+ for (var i = 0; i < this.atlases.length; i++) {
241
+ var a = this.atlases[i];
242
+ if (a && !a.released)
243
+ a.upload(gl);
244
+ }
245
+ this.textCache.forEach((t) => t.upload(gl));
246
+ if (this.particleAtlas)
247
+ this.particleAtlas.upload(gl);
248
+ }
249
+ beginFrame() {
250
+ this.drawCallCount = 0;
251
+ this.batcher.beginFrame();
252
+ if (this.contextLost)
253
+ return;
254
+ var gl = this.gl;
255
+ gl.viewport(0, 0, this.viewportWidth, this.viewportHeight);
256
+ gl.clearColor(0, 0, 0, 1);
257
+ gl.clear(gl.COLOR_BUFFER_BIT);
258
+ if (this.program && this.vao) {
259
+ gl.useProgram(this.program.program);
260
+ gl.bindVertexArray(this.vao);
261
+ // Viewport uniform changes only with viewport size, which is
262
+ // currently fixed at construction. Set every frame anyway -
263
+ // negligible cost and keeps the path simple if dynamic resize
264
+ // is added later.
265
+ if (this.program.uViewport) {
266
+ gl.uniform2f(this.program.uViewport, this.viewportWidth, this.viewportHeight);
267
+ }
268
+ if (this.program.uAtlas) {
269
+ gl.uniform1i(this.program.uAtlas, 0);
270
+ }
271
+ gl.activeTexture(gl.TEXTURE0);
272
+ }
273
+ }
274
+ endFrame() {
275
+ this.batcher.endFrame();
276
+ if (this.contextLost)
277
+ return;
278
+ var gl = this.gl;
279
+ gl.bindVertexArray(null);
280
+ }
281
+ setCamera(cam) {
282
+ this.camera = cam;
283
+ }
284
+ registerAtlas(desc) {
285
+ var handle = this.nextAtlasHandle++;
286
+ var atlas = new TextureAtlas(this.contextLost ? null : this.gl, desc);
287
+ this.atlases[handle] = atlas;
288
+ return handle;
289
+ }
290
+ releaseAtlas(handle) {
291
+ var a = this.atlases[handle];
292
+ if (!a)
293
+ return;
294
+ a.dispose(this.contextLost ? null : this.gl);
295
+ this.atlases[handle] = null;
296
+ }
297
+ drawSprite(worldX, worldY, worldZ, atlas, frame, tint) {
298
+ if (this.contextLost)
299
+ return;
300
+ var a = this.atlases[atlas];
301
+ if (!a || a.released)
302
+ return;
303
+ var cam = this.camera;
304
+ if (!cam)
305
+ return;
306
+ if (!a.lookupFrameSize(frame, SCRATCH_FRAME_SIZE))
307
+ return;
308
+ if (!a.lookupUVRect(frame, SCRATCH_UV, 0))
309
+ return;
310
+ // Iso project: world (x, y, z) -> iso (sx, sy).
311
+ var isoX = (worldX - worldY) * ISO_HALF_W;
312
+ var isoY = (worldX + worldY) * ISO_HALF_H - worldZ * ISO_Z_SCALE;
313
+ worldToScreen(cam, isoX, isoY, SCRATCH_VEC2);
314
+ var dw = SCRATCH_FRAME_SIZE.w * cam.zoom;
315
+ var dh = SCRATCH_FRAME_SIZE.h * cam.zoom;
316
+ var dx = SCRATCH_VEC2.x - dw / 2;
317
+ var dy = SCRATCH_VEC2.y - dh;
318
+ var tr = 1, tg = 1, tb = 1, ta = 1;
319
+ if (tint) {
320
+ tr = tint.r;
321
+ tg = tint.g;
322
+ tb = tint.b;
323
+ ta = tint.a;
324
+ }
325
+ this.batcher.submit(a, 'alpha', dx, dy, dw, dh, SCRATCH_UV[0] ?? 0, SCRATCH_UV[1] ?? 0, SCRATCH_UV[2] ?? 1, SCRATCH_UV[3] ?? 1, tr, tg, tb, ta);
326
+ this.drawCallCount++;
327
+ }
328
+ drawTile(tileX, tileY, atlas, frame) {
329
+ if (this.contextLost)
330
+ return;
331
+ var a = this.atlases[atlas];
332
+ if (!a || a.released)
333
+ return;
334
+ var cam = this.camera;
335
+ if (!cam)
336
+ return;
337
+ if (!a.lookupFrameSize(frame, SCRATCH_FRAME_SIZE))
338
+ return;
339
+ if (!a.lookupUVRect(frame, SCRATCH_UV, 0))
340
+ return;
341
+ // Tile -> iso (no Z; ground plane).
342
+ var isoX = (tileX - tileY) * ISO_HALF_W;
343
+ var isoY = (tileX + tileY) * ISO_HALF_H;
344
+ worldToScreen(cam, isoX, isoY, SCRATCH_VEC2);
345
+ var dw = SCRATCH_FRAME_SIZE.w * cam.zoom;
346
+ var dh = SCRATCH_FRAME_SIZE.h * cam.zoom;
347
+ // Tile anchor: top of diamond aligned to iso point, drawn
348
+ // centered horizontally. Matches Canvas2DDevice.drawTile.
349
+ var dx = SCRATCH_VEC2.x - dw / 2;
350
+ var dy = SCRATCH_VEC2.y - dh / 2;
351
+ this.batcher.submit(a, 'alpha', dx, dy, dw, dh, SCRATCH_UV[0] ?? 0, SCRATCH_UV[1] ?? 0, SCRATCH_UV[2] ?? 1, SCRATCH_UV[3] ?? 1, 1, 1, 1, 1);
352
+ this.drawCallCount++;
353
+ }
354
+ drawText(worldX, worldY, text, style) {
355
+ if (this.contextLost)
356
+ return;
357
+ var cam = this.camera;
358
+ if (!cam)
359
+ return;
360
+ if (text.length === 0)
361
+ return;
362
+ var atlas = this.getOrBakeText(text, style);
363
+ if (!atlas)
364
+ return;
365
+ // Text overlay uses screen-space directly - no iso projection,
366
+ // matching Canvas2DDevice behavior so labels stay axis-aligned.
367
+ worldToScreen(cam, worldX, worldY, SCRATCH_VEC2);
368
+ var sx = SCRATCH_VEC2.x;
369
+ var sy = SCRATCH_VEC2.y;
370
+ if (!atlas.lookupFrameSize(0, SCRATCH_FRAME_SIZE))
371
+ return;
372
+ var dw = SCRATCH_FRAME_SIZE.w;
373
+ var dh = SCRATCH_FRAME_SIZE.h;
374
+ // Align is encoded into the baked frame directly (the fillText
375
+ // call honors textAlign / textBaseline before bake), so the quad
376
+ // anchor is just the screen position.
377
+ var dx = sx;
378
+ var dy = sy - dh; // baseline offset baked in; align top of quad
379
+ if (style.align === 'center') {
380
+ dx -= dw / 2;
381
+ }
382
+ else if (style.align === 'right') {
383
+ dx -= dw;
384
+ }
385
+ if (style.baseline === 'top') {
386
+ dy = sy;
387
+ }
388
+ else if (style.baseline === 'middle') {
389
+ dy = sy - dh / 2;
390
+ }
391
+ this.batcher.submit(atlas, 'alpha', dx, dy, dw, dh, 0, 0, 1, 1, style.fill.r, style.fill.g, style.fill.b, style.fill.a);
392
+ this.drawCallCount++;
393
+ }
394
+ drawParticle(worldX, worldY, worldZ, size, color, additive) {
395
+ if (this.contextLost)
396
+ return;
397
+ var cam = this.camera;
398
+ if (!cam)
399
+ return;
400
+ if (size <= 0 || color.a <= 0)
401
+ return;
402
+ if (!this.particleAtlas) {
403
+ this.particleAtlas = makeParticleDiscAtlas(this.gl);
404
+ }
405
+ var atlas = this.particleAtlas;
406
+ if (!atlas || atlas.released)
407
+ return;
408
+ var isoX = (worldX - worldY) * ISO_HALF_W;
409
+ var isoY = (worldX + worldY) * ISO_HALF_H - worldZ * ISO_Z_SCALE;
410
+ worldToScreen(cam, isoX, isoY, SCRATCH_VEC2);
411
+ var sx = SCRATCH_VEC2.x;
412
+ var sy = SCRATCH_VEC2.y;
413
+ var r = (size / 2) * cam.zoom;
414
+ var dx = sx - r;
415
+ var dy = sy - r;
416
+ var dw = r * 2;
417
+ var dh = r * 2;
418
+ var blend = additive ? 'add' : 'alpha';
419
+ this.batcher.submit(atlas, blend, dx, dy, dw, dh, 0, 0, 1, 1, color.r, color.g, color.b, color.a);
420
+ this.drawCallCount++;
421
+ }
422
+ getDrawCallCount() {
423
+ return this.drawCallCount;
424
+ }
425
+ // Tear down GL objects and detach context-loss listeners. Idempo-
426
+ // tent: safe to call from engine.dispose paths that may also be
427
+ // hit on hot-reload during dev.
428
+ dispose() {
429
+ var gl = this.gl;
430
+ if (this.boundOnLost && typeof this.canvas.removeEventListener === 'function') {
431
+ this.canvas.removeEventListener('webglcontextlost', this.boundOnLost, false);
432
+ }
433
+ if (this.boundOnRestored && typeof this.canvas.removeEventListener === 'function') {
434
+ this.canvas.removeEventListener('webglcontextrestored', this.boundOnRestored, false);
435
+ }
436
+ this.boundOnLost = null;
437
+ this.boundOnRestored = null;
438
+ if (!this.contextLost) {
439
+ for (var i = 0; i < this.atlases.length; i++) {
440
+ var a = this.atlases[i];
441
+ if (a)
442
+ a.dispose(gl);
443
+ }
444
+ this.atlases = [];
445
+ this.textCache.forEach((t) => t.dispose(gl));
446
+ this.textCache.clear();
447
+ if (this.particleAtlas) {
448
+ this.particleAtlas.dispose(gl);
449
+ this.particleAtlas = null;
450
+ }
451
+ if (this.quadVBO)
452
+ gl.deleteBuffer(this.quadVBO);
453
+ if (this.instanceVBO)
454
+ gl.deleteBuffer(this.instanceVBO);
455
+ if (this.vao)
456
+ gl.deleteVertexArray(this.vao);
457
+ if (this.program)
458
+ gl.deleteProgram(this.program.program);
459
+ }
460
+ this.quadVBO = null;
461
+ this.instanceVBO = null;
462
+ this.vao = null;
463
+ this.program = null;
464
+ }
465
+ // Diagnostic accessor for tests + perf benches.
466
+ getBatcherStats() {
467
+ this.batcher.getStats(SCRATCH_STATS);
468
+ return {
469
+ flushCount: SCRATCH_STATS.flushCount,
470
+ instanceTotal: SCRATCH_STATS.instanceTotal,
471
+ capacity: SCRATCH_STATS.capacity,
472
+ };
473
+ }
474
+ // Diagnostic accessor for tests: last upload size + count seen by
475
+ // the flush handler.
476
+ _peekLastUpload() {
477
+ return { count: this.lastUpload.count, floats: this.lastUpload.floats };
478
+ }
479
+ // The actual GL flush. Bound as a closure into SpriteBatcher at
480
+ // construction. Not part of the public API.
481
+ executeFlush(atlas, blend, data, count) {
482
+ if (this.contextLost)
483
+ return;
484
+ var gl = this.gl;
485
+ var program = this.program;
486
+ if (!program || !this.vao || !this.instanceVBO)
487
+ return;
488
+ if (!atlas.texture)
489
+ return; // atlas never uploaded (e.g. context-lost mid-frame)
490
+ // Atlas binding. Fragment shader samples u_atlas at unit 0.
491
+ gl.activeTexture(gl.TEXTURE0);
492
+ atlas.bind(gl);
493
+ // Blend mode mapping. Pre-multiplied alpha is left for a future
494
+ // pass; v1 uses straight alpha (matches Canvas2DDevice's default
495
+ // composite with PNG sources). 'add' is additive blend.
496
+ if (blend === 'add') {
497
+ gl.blendFunc(gl.SRC_ALPHA, gl.ONE);
498
+ }
499
+ else {
500
+ gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
501
+ }
502
+ // Upload instance data. Grow the VBO if the CPU buffer outgrew
503
+ // it. We upload a sub-range matching count, not the full buffer
504
+ // - smaller PCIe transfers when the batch is small.
505
+ var bytesNeeded = count * INSTANCE_STRIDE_BYTES;
506
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.instanceVBO);
507
+ if (bytesNeeded > this.instanceVBOBytes) {
508
+ // Grow to the next power of two of the CPU buffer size.
509
+ var newBytes = this.instanceVBOBytes;
510
+ while (newBytes < bytesNeeded)
511
+ newBytes *= 2;
512
+ gl.bufferData(gl.ARRAY_BUFFER, newBytes, gl.DYNAMIC_DRAW);
513
+ this.instanceVBOBytes = newBytes;
514
+ }
515
+ // Upload only the live prefix.
516
+ gl.bufferSubData(gl.ARRAY_BUFFER, 0, data.subarray(0, count * FLOATS_PER_INSTANCE));
517
+ gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, count);
518
+ this.lastUpload.count = count;
519
+ this.lastUpload.floats = count * FLOATS_PER_INSTANCE;
520
+ }
521
+ // Bake one (text, style) into a TextureAtlas with a single frame
522
+ // covering the whole canvas. Cached so repeated draws of the same
523
+ // string reuse the texture.
524
+ getOrBakeText(text, style) {
525
+ var fillKey = style.fill.r.toFixed(3) + ',' + style.fill.g.toFixed(3) + ',' +
526
+ style.fill.b.toFixed(3) + ',' + style.fill.a.toFixed(3);
527
+ var key = style.font + '|' + fillKey + '|' +
528
+ (style.align ?? 'left') + '|' + (style.baseline ?? 'alphabetic') + '|' +
529
+ text;
530
+ var hit = this.textCache.get(key);
531
+ if (hit && !hit.released && hit.texture)
532
+ return hit;
533
+ if (typeof document === 'undefined')
534
+ return null;
535
+ // Measure the text using a temporary canvas. measureText returns
536
+ // width; for height we use a conservative em-based estimate from
537
+ // the font string. For pixel-art fonts a tight measurement isn't
538
+ // critical because the texture is power-of-2 padded anyway.
539
+ var probe = document.createElement('canvas');
540
+ probe.width = 16;
541
+ probe.height = 16;
542
+ var probeCtx = probe.getContext('2d');
543
+ if (!probeCtx)
544
+ return null;
545
+ probeCtx.font = style.font;
546
+ var metrics = probeCtx.measureText(text);
547
+ var asc = metrics.actualBoundingBoxAscent ?? 12;
548
+ var desc = metrics.actualBoundingBoxDescent ?? 4;
549
+ var w = Math.max(1, Math.ceil(metrics.width));
550
+ var h = Math.max(1, Math.ceil(asc + desc));
551
+ // Pad by 2px each side so antialiasing edges aren't clamped.
552
+ var padW = w + 4;
553
+ var padH = h + 4;
554
+ var c = document.createElement('canvas');
555
+ c.width = padW;
556
+ c.height = padH;
557
+ var ctx = c.getContext('2d');
558
+ if (!ctx)
559
+ return null;
560
+ ctx.font = style.font;
561
+ ctx.textAlign = 'left';
562
+ ctx.textBaseline = 'alphabetic';
563
+ // Bake white text - the tint comes from the per-instance attrib
564
+ // multiplied in the fragment shader. This means one cache entry
565
+ // per (text, font, align, baseline) covers all colors. The fill
566
+ // key is still part of the cache key so future tinting variants
567
+ // (e.g. drop shadow fold-in) compose correctly without aliasing.
568
+ ctx.fillStyle = '#ffffff';
569
+ ctx.fillText(text, 2, 2 + asc);
570
+ var atlas = new TextureAtlas(this.gl, {
571
+ image: c,
572
+ frames: [{ x: 0, y: 0, w: padW, h: padH }],
573
+ name: 'text:' + key,
574
+ });
575
+ // Bound cache. Evict oldest if past limit. Map iteration order
576
+ // gives oldest-first so .keys().next() suffices.
577
+ if (this.textCache.size >= TEXT_CACHE_LIMIT) {
578
+ var firstKey = this.textCache.keys().next().value;
579
+ if (firstKey !== undefined) {
580
+ var oldest = this.textCache.get(firstKey);
581
+ if (oldest)
582
+ oldest.dispose(this.gl);
583
+ this.textCache.delete(firstKey);
584
+ }
585
+ }
586
+ this.textCache.set(key, atlas);
587
+ return atlas;
588
+ }
589
+ }
590
+ // Self-register the WebGL2 backend so consumers can write
591
+ // Engine.create({ backend: 'webgl2' }) once they import this module.
592
+ // Marked /*#__PURE__*/ so a bundler can eliminate the registration
593
+ // when WebGL2Device itself is unused, completing the tree-shake
594
+ // story for Canvas2D-only consumers.
595
+ /*#__PURE__*/ registerBackend('webgl2', (canvas) => new WebGL2Device(canvas));
596
+ //# sourceMappingURL=webgl2-device.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgl2-device.js","sourceRoot":"","sources":["../../src/renderer/webgl2-device.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,EAAE;AACF,iEAAiE;AACjE,oCAAoC;AACpC,EAAE;AACF,8CAA8C;AAC9C,+DAA+D;AAC/D,8BAA8B;AAC9B,0CAA0C;AAC1C,8CAA8C;AAC9C,wDAAwD;AACxD,kEAAkE;AAClE,wCAAwC;AACxC,EAAE;AACF,mEAAmE;AACnE,mEAAmE;AACnE,mEAAmE;AACnE,gEAAgE;AAChE,+DAA+D;AAC/D,aAAa;AACb,EAAE;AACF,kEAAkE;AAClE,gEAAgE;AAChE,kEAAkE;AAClE,6CAA6C;AAC7C,qEAAqE;AACrE,oDAAoD;AACpD,qEAAqE;AACrE,iEAAiE;AACjE,iDAAiD;AASjD,OAAO,EAEL,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,UAAU,EACV,UAAU,EACV,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EACL,aAAa,EAEb,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,eAAe,EACf,kBAAkB,GACnB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACpC,MAAM,kBAAkB,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAC1C,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;AACvC,MAAM,aAAa,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AAEvE,qEAAqE;AACrE,2BAA2B;AAC3B,MAAM,kBAAkB,GAAW,CAAC,CAAC;AACrC,MAAM,aAAa,GAAW,CAAC,CAAC;AAChC,MAAM,WAAW,GAAW,CAAC,CAAC;AAC9B,MAAM,cAAc,GAAW,CAAC,CAAC;AACjC,MAAM,WAAW,GAAW,CAAC,CAAC;AAE9B,2CAA2C;AAC3C,MAAM,qBAAqB,GAAW,mBAAmB,GAAG,CAAC,CAAC;AAE9D,kEAAkE;AAClE,iDAAiD;AACjD,MAAM,yBAAyB,GAAW,IAAI,CAAC;AAE/C,mEAAmE;AACnE,mEAAmE;AACnE,uBAAuB;AACvB,MAAM,gBAAgB,GAAW,GAAG,CAAC;AAQrC,MAAM,OAAO,YAAY;IACd,MAAM,CAAoB;IAC1B,aAAa,CAAS;IACtB,cAAc,CAAS;IAExB,EAAE,CAAyB;IAC3B,OAAO,GAAuB,IAAI,CAAC;IACnC,GAAG,GAAkC,IAAI,CAAC;IAC1C,OAAO,GAAuB,IAAI,CAAC;IACnC,WAAW,GAAuB,IAAI,CAAC;IAC/C,+DAA+D;IAC/D,uCAAuC;IAC/B,gBAAgB,GAAW,CAAC,CAAC;IAE7B,OAAO,GAA+B,EAAE,CAAC;IACzC,eAAe,GAAW,CAAC,CAAC;IAE5B,MAAM,GAAsB,IAAI,CAAC;IACjC,aAAa,GAAW,CAAC,CAAC;IAE1B,OAAO,CAAgB;IAE/B,6DAA6D;IACrD,aAAa,GAAwB,IAAI,CAAC;IAElD,8EAA8E;IAC9E,iEAAiE;IACjE,sCAAsC;IAC9B,SAAS,GAA8B,IAAI,GAAG,EAAE,CAAC;IAEzD,iEAAiE;IACjE,2CAA2C;IACnC,WAAW,GAAY,KAAK,CAAC;IAC7B,WAAW,GAAgC,IAAI,CAAC;IAChD,eAAe,GAAwB,IAAI,CAAC;IAEpD,yBAAyB;IACjB,UAAU,GAAsC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAEhF,YAAY,MAAyB,EAAE,EAA2B;QAChE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QAEpC,IAAI,GAAG,GAAG,EAAE,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,kDAAkD;gBAClD,iFAAiF,CAClF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,EAAE,GAAG,GAA6B,CAAC;QAExC,8DAA8D;QAC9D,iEAAiE;QACjE,mCAAmC;QACnC,IAAI,OAAQ,MAAyC,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;YACtF,IAAI,CAAC,WAAW,GAAG,CAAC,CAAQ,EAAE,EAAE;gBAC9B,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,CAAC,CAAC;YACF,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE;gBAC1B,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC/B,CAAC,CAAC;YACF,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAA4B,EAAE,KAAK,CAAC,CAAC;YACtF,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,EAAE,IAAI,CAAC,eAAgC,EAAE,KAAK,CAAC,CAAC;QAChG,CAAC;QAED,sDAAsD;QACtD,+DAA+D;QAC/D,oBAAoB;QACpB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAE9B,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,gEAAgE;QAChE,2DAA2D;QAC3D,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAC9B,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,EAC3E,yBAAyB,CAC1B,CAAC;IACJ,CAAC;IAED,kEAAkE;IAClE,iDAAiD;IACzC,eAAe;QACrB,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,IAAI,GAAG,GAAG,EAAE,CAAC,iBAAiB,EAAE,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAEf,gEAAgE;QAChE,2BAA2B;QAC3B,IAAI,IAAI,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACrC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,kBAAkB,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;QACnE,EAAE,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;QAC/C,EAAE,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACrE,EAAE,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,8DAA8D;QAC9D,IAAI,IAAI,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,SAAS,GAAG,yBAAyB,GAAG,qBAAqB,CAAC;QAClE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC;QAC3D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QAElC,+BAA+B;QAC/B,EAAE,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC;QAC1C,EAAE,CAAC,mBAAmB,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC;QACpF,EAAE,CAAC,mBAAmB,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QAEzC,6BAA6B;QAC7B,EAAE,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;QACxC,EAAE,CAAC,mBAAmB,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC;QAClF,EAAE,CAAC,mBAAmB,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAEvC,gCAAgC;QAChC,EAAE,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAC;QAC3C,EAAE,CAAC,mBAAmB,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;QACtF,EAAE,CAAC,mBAAmB,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QAE1C,8BAA8B;QAC9B,EAAE,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;QACxC,EAAE,CAAC,mBAAmB,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;QACnF,EAAE,CAAC,mBAAmB,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAEvC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAEO,cAAc;QACpB,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACjB,IAAI,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;QAC7C,IAAI,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAChC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACvC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;YACpD,IAAI,IAAI,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3C,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACtB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,8CAA8C,GAAG,IAAI,CAAC,CAAC;QACzE,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACvC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;YACpD,IAAI,IAAI,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3C,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACtB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,gDAAgD,GAAG,IAAI,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,OAAO,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACtB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/B,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/B,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;YACrD,IAAI,IAAI,GAAG,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/C,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC1B,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACtB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,qCAAqC,GAAG,IAAI,CAAC,CAAC;QAChE,CAAC;QACD,wDAAwD;QACxD,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACtB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,SAAS,GAAG,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC7D,IAAI,MAAM,GAAG,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACvD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACpE,CAAC;IAEO,iBAAiB;QACvB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,wDAAwD;QACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC;gBAAE,CAAC,CAAC,iBAAiB,EAAE,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACrD,IAAI,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC;QAC/D,4DAA4D;QAC5D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;IAC5B,CAAC;IAEO,qBAAqB;QAC3B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACjB,2DAA2D;QAC3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ;gBAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,UAAU;QACR,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACjB,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3D,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;QAE9B,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACpC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7B,6DAA6D;YAC7D,4DAA4D;YAC5D,8DAA8D;YAC9D,kBAAkB;YAClB,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBAC3B,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YAChF,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACxB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACvC,CAAC;YACD,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACjB,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,SAAS,CAAC,GAAyB;QACjC,IAAI,CAAC,MAAM,GAAG,GAAiB,CAAC;IAClC,CAAC;IAED,aAAa,CAAC,IAAqB;QACjC,IAAI,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACpC,IAAI,KAAK,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;QAC7B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,YAAY,CAAC,MAAmB;QAC9B,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAC9B,CAAC;IAED,UAAU,CACR,MAAc,EACd,MAAc,EACd,MAAc,EACd,KAAkB,EAClB,KAAa,EACb,IAA0B;QAE1B,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ;YAAE,OAAO;QAC7B,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QACtB,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,kBAAkB,CAAC;YAAE,OAAO;QAC1D,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;YAAE,OAAO;QAElD,gDAAgD;QAChD,IAAI,IAAI,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,UAAU,CAAC;QAC1C,IAAI,IAAI,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,UAAU,GAAG,MAAM,GAAG,WAAW,CAAC;QACjE,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QAE7C,IAAI,EAAE,GAAG,kBAAkB,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;QACzC,IAAI,EAAE,GAAG,kBAAkB,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;QACzC,IAAI,EAAE,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,IAAI,EAAE,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACnC,IAAI,IAAI,EAAE,CAAC;YACT,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;YACZ,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;YACZ,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;YACZ,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACd,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CACjB,CAAC,EAAE,OAAO,EACV,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EACd,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EACtC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EACtC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CACf,CAAC;QACF,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,QAAQ,CACN,KAAa,EACb,KAAa,EACb,KAAkB,EAClB,KAAa;QAEb,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ;YAAE,OAAO;QAC7B,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QACtB,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,kBAAkB,CAAC;YAAE,OAAO;QAC1D,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;YAAE,OAAO;QAElD,oCAAoC;QACpC,IAAI,IAAI,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,UAAU,CAAC;QACxC,IAAI,IAAI,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,UAAU,CAAC;QACxC,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QAE7C,IAAI,EAAE,GAAG,kBAAkB,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;QACzC,IAAI,EAAE,GAAG,kBAAkB,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;QACzC,0DAA0D;QAC1D,0DAA0D;QAC1D,IAAI,EAAE,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,IAAI,EAAE,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAEjC,IAAI,CAAC,OAAO,CAAC,MAAM,CACjB,CAAC,EAAE,OAAO,EACV,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EACd,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EACtC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EACtC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CACX,CAAC;QACF,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,QAAQ,CACN,MAAc,EACd,MAAc,EACd,IAAY,EACZ,KAAgB;QAEhB,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QACtB,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE9B,IAAI,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,+DAA+D;QAC/D,gEAAgE;QAChE,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QACjD,IAAI,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC;QACxB,IAAI,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC;QAExB,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,EAAE,kBAAkB,CAAC;YAAE,OAAO;QAC1D,IAAI,EAAE,GAAG,kBAAkB,CAAC,CAAC,CAAC;QAC9B,IAAI,EAAE,GAAG,kBAAkB,CAAC,CAAC,CAAC;QAE9B,+DAA+D;QAC/D,iEAAiE;QACjE,sCAAsC;QACtC,IAAI,EAAE,GAAG,EAAE,CAAC;QACZ,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,8CAA8C;QAChE,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC7B,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACf,CAAC;aAAM,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YACnC,EAAE,IAAI,EAAE,CAAC;QACX,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YAC7B,EAAE,GAAG,EAAE,CAAC;QACV,CAAC;aAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACvC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CACjB,KAAK,EAAE,OAAO,EACd,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EACd,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EACV,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CACvD,CAAC;QACF,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,YAAY,CACV,MAAc,EACd,MAAc,EACd,MAAc,EACd,IAAY,EACZ,KAA0B,EAC1B,QAAiB;QAEjB,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QACtB,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC;YAAE,OAAO;QAEtC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC;QAC/B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ;YAAE,OAAO;QAErC,IAAI,IAAI,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,UAAU,CAAC;QAC1C,IAAI,IAAI,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,UAAU,GAAG,MAAM,GAAG,WAAW,CAAC;QACjE,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QAC7C,IAAI,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC;QACxB,IAAI,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;QAE9B,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAChB,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAChB,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QAEf,IAAI,KAAK,GAAc,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;QAClD,IAAI,CAAC,OAAO,CAAC,MAAM,CACjB,KAAK,EAAE,KAAK,EACZ,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EACd,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EACV,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CACnC,CAAC;QACF,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,kEAAkE;IAClE,gEAAgE;IAChE,gCAAgC;IAChC,OAAO;QACL,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACjB,IAAI,IAAI,CAAC,WAAW,IAAI,OAAQ,IAAI,CAAC,MAA4C,CAAC,mBAAmB,KAAK,UAAU,EAAE,CAAC;YACrH,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAA4B,EAAE,KAAK,CAAC,CAAC;QAChG,CAAC;QACD,IAAI,IAAI,CAAC,eAAe,IAAI,OAAQ,IAAI,CAAC,MAA4C,CAAC,mBAAmB,KAAK,UAAU,EAAE,CAAC;YACzH,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,sBAAsB,EAAE,IAAI,CAAC,eAAgC,EAAE,KAAK,CAAC,CAAC;QACxG,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACxB,IAAI,CAAC;oBAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvB,CAAC;YACD,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;YAClB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC5B,CAAC;YACD,IAAI,IAAI,CAAC,OAAO;gBAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,IAAI,CAAC,WAAW;gBAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxD,IAAI,IAAI,CAAC,GAAG;gBAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7C,IAAI,IAAI,CAAC,OAAO;gBAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,gDAAgD;IAChD,eAAe;QACb,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACrC,OAAO;YACL,UAAU,EAAE,aAAa,CAAC,UAAU;YACpC,aAAa,EAAE,aAAa,CAAC,aAAa;YAC1C,QAAQ,EAAE,aAAa,CAAC,QAAQ;SACjC,CAAC;IACJ,CAAC;IAED,kEAAkE;IAClE,qBAAqB;IACrB,eAAe;QACb,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;IAC1E,CAAC;IAED,gEAAgE;IAChE,4CAA4C;IACpC,YAAY,CAClB,KAAmB,EACnB,KAAgB,EAChB,IAAkB,EAClB,KAAa;QAEb,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACjB,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QACvD,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,CAAC,qDAAqD;QAEjF,4DAA4D;QAC5D,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,gEAAgE;QAChE,iEAAiE;QACjE,wDAAwD;QACxD,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YACpB,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC;QACrD,CAAC;QAED,+DAA+D;QAC/D,gEAAgE;QAChE,oDAAoD;QACpD,IAAI,WAAW,GAAG,KAAK,GAAG,qBAAqB,CAAC;QAChD,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,IAAI,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxC,wDAAwD;YACxD,IAAI,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACrC,OAAO,QAAQ,GAAG,WAAW;gBAAE,QAAQ,IAAI,CAAC,CAAC;YAC7C,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC;YAC1D,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;QACnC,CAAC;QACD,+BAA+B;QAC/B,EAAE,CAAC,aAAa,CACd,EAAE,CAAC,YAAY,EAAE,CAAC,EAClB,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,GAAG,mBAAmB,CAAC,CAC9C,CAAC;QAEF,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAElD,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,KAAK,GAAG,mBAAmB,CAAC;IACvD,CAAC;IAED,iEAAiE;IACjE,kEAAkE;IAClE,4BAA4B;IACpB,aAAa,CAAC,IAAY,EAAE,KAAgB;QAClD,IAAI,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;YACzE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG;YACxC,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,YAAY,CAAC,GAAG,GAAG;YACtE,IAAI,CAAC;QACP,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,OAAO;YAAE,OAAO,GAAG,CAAC;QACpD,IAAI,OAAO,QAAQ,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QAEjD,iEAAiE;QACjE,iEAAiE;QACjE,iEAAiE;QACjE,4DAA4D;QAC5D,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7C,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;QACjB,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;QAClB,IAAI,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3B,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QAC3B,IAAI,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,GAAG,GAAG,OAAO,CAAC,uBAAuB,IAAI,EAAE,CAAC;QAChD,IAAI,IAAI,GAAG,OAAO,CAAC,wBAAwB,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;QAE3C,6DAA6D;QAC7D,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAEjB,IAAI,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;QACf,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC;QAChB,IAAI,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACtB,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC;QACvB,GAAG,CAAC,YAAY,GAAG,YAAY,CAAC;QAChC,gEAAgE;QAChE,gEAAgE;QAChE,gEAAgE;QAChE,gEAAgE;QAChE,iEAAiE;QACjE,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;QAC1B,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;QAE/B,IAAI,KAAK,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE;YACpC,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;YAC1C,IAAI,EAAE,OAAO,GAAG,GAAG;SACpB,CAAC,CAAC;QAEH,+DAA+D;QAC/D,iDAAiD;QACjD,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,gBAAgB,EAAE,CAAC;YAC5C,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAA2B,CAAC;YACxE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC1C,IAAI,MAAM;oBAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACpC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED,0DAA0D;AAC1D,qEAAqE;AACrE,mEAAmE;AACnE,gEAAgE;AAChE,qCAAqC;AACrC,aAAa,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { System } from '../system.js';
2
+ import type { World } from '../world.js';
3
+ export declare class PeerPresenceSystem implements System {
4
+ readonly name: string;
5
+ update(world: World, _dt: number): void;
6
+ }
7
+ export declare class PeerRenderSystem implements System {
8
+ readonly name: string;
9
+ private scratchTextStyle;
10
+ private scratchTint;
11
+ private readonly labelYOffset;
12
+ private readonly showNames;
13
+ constructor(opts?: {
14
+ labelYOffset?: number;
15
+ showNames?: boolean;
16
+ });
17
+ update(world: World, _dt: number): void;
18
+ }
19
+ //# sourceMappingURL=peer-presence-system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-presence-system.d.ts","sourceRoot":"","sources":["../../src/systems/peer-presence-system.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAiBzC,qBAAa,kBAAmB,YAAW,MAAM;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAmB;IAExC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;CAwBxC;AAKD,qBAAa,gBAAiB,YAAW,MAAM;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAiB;IAGtC,OAAO,CAAC,gBAAgB,CAKtB;IACF,OAAO,CAAC,WAAW,CAEjB;IAMF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;gBAExB,IAAI,GAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAO;IAKrE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;CAgCxC"}