@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.
- package/COMMERCIAL_LICENSE_TERMS.md +74 -0
- package/README.md +230 -6
- package/dist/components/peer-sprite.d.ts +25 -0
- package/dist/components/peer-sprite.d.ts.map +1 -0
- package/dist/components/peer-sprite.js +48 -0
- package/dist/components/peer-sprite.js.map +1 -0
- package/dist/engine.d.ts +6 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +35 -1
- package/dist/engine.js.map +1 -1
- package/dist/index.d.ts +19 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -2
- package/dist/index.js.map +1 -1
- package/dist/network/mock-multiplayer-bridge.d.ts +34 -0
- package/dist/network/mock-multiplayer-bridge.d.ts.map +1 -0
- package/dist/network/mock-multiplayer-bridge.js +91 -0
- package/dist/network/mock-multiplayer-bridge.js.map +1 -0
- package/dist/network/multiplayer-bridge.d.ts +45 -0
- package/dist/network/multiplayer-bridge.d.ts.map +1 -0
- package/dist/network/multiplayer-bridge.js +34 -0
- package/dist/network/multiplayer-bridge.js.map +1 -0
- package/dist/network/peer-pool.d.ts +46 -0
- package/dist/network/peer-pool.d.ts.map +1 -0
- package/dist/network/peer-pool.js +185 -0
- package/dist/network/peer-pool.js.map +1 -0
- package/dist/network/sse-multiplayer-bridge.d.ts +36 -0
- package/dist/network/sse-multiplayer-bridge.d.ts.map +1 -0
- package/dist/network/sse-multiplayer-bridge.js +264 -0
- package/dist/network/sse-multiplayer-bridge.js.map +1 -0
- package/dist/renderer/shaders/sprite-shader-source.d.ts +4 -0
- package/dist/renderer/shaders/sprite-shader-source.d.ts.map +1 -0
- package/dist/renderer/shaders/sprite-shader-source.js +83 -0
- package/dist/renderer/shaders/sprite-shader-source.js.map +1 -0
- package/dist/renderer/sprite-batcher.d.ts +30 -0
- package/dist/renderer/sprite-batcher.d.ts.map +1 -0
- package/dist/renderer/sprite-batcher.js +146 -0
- package/dist/renderer/sprite-batcher.js.map +1 -0
- package/dist/renderer/texture-atlas.d.ts +24 -0
- package/dist/renderer/texture-atlas.d.ts.map +1 -0
- package/dist/renderer/texture-atlas.js +173 -0
- package/dist/renderer/texture-atlas.js.map +1 -0
- package/dist/renderer/webgl2-device.d.ts +53 -0
- package/dist/renderer/webgl2-device.d.ts.map +1 -0
- package/dist/renderer/webgl2-device.js +596 -0
- package/dist/renderer/webgl2-device.js.map +1 -0
- package/dist/systems/peer-presence-system.d.ts +19 -0
- package/dist/systems/peer-presence-system.d.ts.map +1 -0
- package/dist/systems/peer-presence-system.js +118 -0
- package/dist/systems/peer-presence-system.js.map +1 -0
- 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":"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"}
|
|
@@ -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"}
|