spryte 0.2.3 → 0.4.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 (50) hide show
  1. package/README.md +11 -8
  2. package/dist/backend.d.ts +22 -5
  3. package/dist/backend.d.ts.map +1 -1
  4. package/dist/canvas2d.d.ts +11 -3
  5. package/dist/canvas2d.d.ts.map +1 -1
  6. package/dist/canvas2d.js +72 -4
  7. package/dist/canvas2d.js.map +1 -1
  8. package/dist/draw.d.ts +50 -20
  9. package/dist/draw.d.ts.map +1 -1
  10. package/dist/draw.js +48 -7
  11. package/dist/draw.js.map +1 -1
  12. package/dist/filters.d.ts +59 -0
  13. package/dist/filters.d.ts.map +1 -0
  14. package/dist/filters.js +188 -0
  15. package/dist/filters.js.map +1 -0
  16. package/dist/index.d.ts +6 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +6 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/mask.d.ts +13 -0
  21. package/dist/mask.d.ts.map +1 -0
  22. package/dist/mask.js +29 -0
  23. package/dist/mask.js.map +1 -0
  24. package/dist/offscreen.d.ts +26 -0
  25. package/dist/offscreen.d.ts.map +1 -0
  26. package/dist/offscreen.js +83 -0
  27. package/dist/offscreen.js.map +1 -0
  28. package/dist/panels.d.ts +44 -0
  29. package/dist/panels.d.ts.map +1 -0
  30. package/dist/panels.js +97 -0
  31. package/dist/panels.js.map +1 -0
  32. package/dist/phaser.d.ts +80 -0
  33. package/dist/phaser.d.ts.map +1 -0
  34. package/dist/phaser.js +100 -0
  35. package/dist/phaser.js.map +1 -0
  36. package/dist/renderer.js +1 -0
  37. package/dist/renderer.js.map +1 -1
  38. package/dist/shapes.d.ts +64 -0
  39. package/dist/shapes.d.ts.map +1 -0
  40. package/dist/shapes.js +367 -0
  41. package/dist/shapes.js.map +1 -0
  42. package/dist/shared.d.ts +29 -0
  43. package/dist/shared.d.ts.map +1 -0
  44. package/dist/shared.js +134 -0
  45. package/dist/shared.js.map +1 -0
  46. package/dist/webgl2.d.ts +29 -12
  47. package/dist/webgl2.d.ts.map +1 -1
  48. package/dist/webgl2.js +138 -19
  49. package/dist/webgl2.js.map +1 -1
  50. package/package.json +8 -2
package/dist/shapes.js ADDED
@@ -0,0 +1,367 @@
1
+ import { toRGBA } from "./color.js";
2
+ /**
3
+ * Filled polygon through `points` (x0, y0, x1, y1, …), antialiased. Concave is fine; it closes itself and
4
+ * shouldn't cross itself. `count` defaults to every pair in `points`.
5
+ *
6
+ * ```ts
7
+ * import { polygon } from "spryte";
8
+ * polygon(draw, [0, 0, 20, 0, 10, 16], "#cffb2d");
9
+ * ```
10
+ */
11
+ export function polygon(draw, points, color, count = points.length >> 1) {
12
+ path(draw, points, count, true, 0, color);
13
+ }
14
+ /** Line through `points` (x0, y0, x1, y1, …), `width` wide, with mitred joins and flat ends. `closed` joins the last point to the first. */
15
+ export function polyline(draw, points, width, color, closed = false, count = points.length >> 1) {
16
+ if (width > 0)
17
+ path(draw, points, count, closed, width, color);
18
+ }
19
+ /** Rectangle with rounded corners: filled, or outlined when `lineWidth` is given (the outline is centred on the edge). */
20
+ export function roundRect(draw, x, y, w, h, radius, color, lineWidth) {
21
+ const r = Math.max(0, Math.min(radius, w / 2, h / 2));
22
+ const steps = r > 0 ? arcSteps(draw, r, Math.PI / 2) : 0;
23
+ const pts = scratch((steps + 1) * 4);
24
+ let k = 0;
25
+ const corner = (cx, cy, from) => {
26
+ for (let i = 0; i <= steps; i++) {
27
+ const a = from + (i / Math.max(steps, 1)) * (Math.PI / 2);
28
+ pts[k++] = cx + Math.cos(a) * r;
29
+ pts[k++] = cy + Math.sin(a) * r;
30
+ }
31
+ };
32
+ corner(x + w - r, y + r, -Math.PI / 2);
33
+ corner(x + w - r, y + h - r, 0);
34
+ corner(x + r, y + h - r, Math.PI / 2);
35
+ corner(x + r, y + r, Math.PI);
36
+ path(draw, pts, k >> 1, true, lineWidth ?? 0, color);
37
+ }
38
+ /** Circle outline, `width` wide, centred on `radius`. */
39
+ export function ring(draw, x, y, radius, width, color) {
40
+ if (radius <= 0 || width <= 0)
41
+ return;
42
+ const steps = arcSteps(draw, radius, Math.PI * 2);
43
+ const pts = scratch(steps * 2);
44
+ for (let i = 0; i < steps; i++) {
45
+ const a = (i / steps) * Math.PI * 2;
46
+ pts[i * 2] = x + Math.cos(a) * radius;
47
+ pts[i * 2 + 1] = y + Math.sin(a) * radius;
48
+ }
49
+ path(draw, pts, steps, true, width, color);
50
+ }
51
+ function path(draw, points, n, closed, width, color) {
52
+ if (n < 2)
53
+ return;
54
+ const m = draw.m;
55
+ // One device pixel in local units, for the WebGL2 edge feather.
56
+ const aa = 1 / (draw.renderScale * Math.sqrt(Math.abs(m[0] * m[3] - m[1] * m[2])) || 1);
57
+ draw.quads++;
58
+ draw.backend.path(m, points, n, closed, width, draw.withAlpha(toRGBA(color), 1), aa, ShapeBuffer);
59
+ }
60
+ /** Segments for an arc of `radius` spanning `angle`: about one per 4 device pixels of arc, at least 2. */
61
+ function arcSteps(draw, radius, angle) {
62
+ const m = draw.m;
63
+ const device = radius * Math.hypot(m[0], m[1]) * draw.renderScale;
64
+ return Math.max(2, Math.min(256, Math.ceil((device * angle) / 4)));
65
+ }
66
+ let points = new Float32Array(64);
67
+ function scratch(n) {
68
+ if (points.length < n)
69
+ points = new Float32Array(2 ** Math.ceil(Math.log2(n)));
70
+ return points;
71
+ }
72
+ /** Longest miter, in half line widths, before it's cut short (Canvas 2D bevels past the same limit). */
73
+ const MITER = 4;
74
+ /**
75
+ * Indexed triangles for the WebGL2 backend's `path()`: x, y, u, v (floats), a colour (RGBA bytes) and coverage,
76
+ * flash and texture unit (bytes) per vertex, 24 bytes. Sprites can join as textured quads (`sprite`). Edges get a feather one device pixel wide fading to coverage 0, which antialiases without MSAA.
77
+ * @internal
78
+ */
79
+ export class ShapeBuffer {
80
+ data = new ArrayBuffer(1 << 16);
81
+ f32 = new Float32Array(this.data);
82
+ u32 = new Uint32Array(this.data);
83
+ indices = new Uint32Array(1 << 14);
84
+ /** Vertices and indices written. */
85
+ count = 0;
86
+ icount = 0;
87
+ m = [1, 0, 0, 1, 0, 0];
88
+ color = 0;
89
+ xs = new Float64Array(64);
90
+ ys = new Float64Array(64);
91
+ nx = new Float64Array(64);
92
+ ny = new Float64Array(64);
93
+ /** The inner ring of a fill, in the points' units (for ear clipping). */
94
+ ix = new Float64Array(64);
95
+ iy = new Float64Array(64);
96
+ /** Fill (`width` 0) or stroke `n` points. `aa` is one device pixel in the points' units; `color` is RGBA bytes in memory order. */
97
+ add(m, points, n, closed, width, color, aa) {
98
+ this.m = m;
99
+ this.color = color;
100
+ n = this.load(points, n, closed || width === 0);
101
+ if (width === 0)
102
+ this.fill(n, aa);
103
+ else
104
+ this.stroke(n, closed, width, aa);
105
+ }
106
+ /** Copy points, dropping repeats; returns how many are left. Closed shapes also drop a last point equal to the first. */
107
+ load(points, n, closed) {
108
+ if (this.xs.length < n) {
109
+ const size = 2 ** Math.ceil(Math.log2(n));
110
+ this.xs = new Float64Array(size);
111
+ this.ys = new Float64Array(size);
112
+ this.nx = new Float64Array(size);
113
+ this.ny = new Float64Array(size);
114
+ this.ix = new Float64Array(size);
115
+ this.iy = new Float64Array(size);
116
+ }
117
+ let k = 0;
118
+ for (let i = 0; i < n; i++) {
119
+ const x = points[i * 2];
120
+ const y = points[i * 2 + 1];
121
+ if (k > 0 && x === this.xs[k - 1] && y === this.ys[k - 1])
122
+ continue;
123
+ this.xs[k] = x;
124
+ this.ys[k] = y;
125
+ k++;
126
+ }
127
+ if (closed && k > 1 && this.xs[0] === this.xs[k - 1] && this.ys[0] === this.ys[k - 1])
128
+ k--;
129
+ return k;
130
+ }
131
+ /** Miter normals (left of travel) scaled so offsetting by 1 moves each edge by 1, clamped at MITER. */
132
+ normals(n, closed) {
133
+ const { xs, ys, nx, ny } = this;
134
+ for (let i = 0; i < n; i++) {
135
+ const p = i > 0 ? i - 1 : closed ? n - 1 : i;
136
+ const q = i < n - 1 ? i + 1 : closed ? 0 : i;
137
+ // Left normals of the edges into and out of this point.
138
+ let ax = ys[p] - ys[i];
139
+ let ay = xs[i] - xs[p];
140
+ let bx = ys[i] - ys[q];
141
+ let by = xs[q] - xs[i];
142
+ const la = Math.sqrt(ax * ax + ay * ay);
143
+ const lb = Math.sqrt(bx * bx + by * by);
144
+ if (la > 0) {
145
+ ax /= la;
146
+ ay /= la;
147
+ }
148
+ if (lb > 0) {
149
+ bx /= lb;
150
+ by /= lb;
151
+ }
152
+ if (la === 0) {
153
+ ax = bx;
154
+ ay = by;
155
+ }
156
+ else if (lb === 0) {
157
+ bx = ax;
158
+ by = ay;
159
+ }
160
+ let mx = ax + bx;
161
+ let my = ay + by;
162
+ const lm = Math.sqrt(mx * mx + my * my);
163
+ if (lm < 1e-9) {
164
+ mx = ax;
165
+ my = ay;
166
+ }
167
+ else {
168
+ mx /= lm;
169
+ my /= lm;
170
+ const s = Math.min(MITER, 1 / Math.max(mx * ax + my * ay, 1e-9));
171
+ mx *= s;
172
+ my *= s;
173
+ }
174
+ nx[i] = mx;
175
+ ny[i] = my;
176
+ }
177
+ }
178
+ fill(n, aa) {
179
+ if (n < 3)
180
+ return;
181
+ const { xs, ys, nx, ny, ix, iy } = this;
182
+ // Wind one way, so left normals point inward.
183
+ let area = 0;
184
+ for (let i = 0, j = n - 1; i < n; j = i++)
185
+ area += xs[j] * ys[i] - xs[i] * ys[j];
186
+ if (area === 0)
187
+ return;
188
+ if (area < 0) {
189
+ xs.subarray(0, n).reverse();
190
+ ys.subarray(0, n).reverse();
191
+ }
192
+ this.normals(n, true);
193
+ const h = aa / 2;
194
+ const isConvex = convex(xs, ys, n);
195
+ // Inner ring (coverage 1) a half pixel in, then the outer ring (coverage 0) a half pixel out.
196
+ const base = this.reserve(2 * n, 3 * (n - 2) + 6 * n);
197
+ for (let i = 0; i < n; i++) {
198
+ ix[i] = xs[i] + nx[i] * h;
199
+ iy[i] = ys[i] + ny[i] * h;
200
+ this.vertex(ix[i], iy[i], 1);
201
+ }
202
+ for (let i = 0; i < n; i++)
203
+ this.vertex(xs[i] - nx[i] * h, ys[i] - ny[i] * h, 0);
204
+ // Convex (round rects, most UI shapes): a fan, no ear clipping.
205
+ if (isConvex)
206
+ for (let i = 1; i + 1 < n; i++)
207
+ this.tri(base, base + i, base + i + 1);
208
+ else
209
+ earClip(ix, iy, n, (a, b, c) => this.tri(base + a, base + b, base + c));
210
+ for (let i = 0; i < n; i++) {
211
+ const j = i === n - 1 ? 0 : i + 1;
212
+ this.quad(base + i, base + n + i, base + j, base + n + j);
213
+ }
214
+ }
215
+ stroke(n, closed, width, aa) {
216
+ if (n < 2)
217
+ return;
218
+ if (closed && n < 3)
219
+ closed = false;
220
+ const { xs, ys, nx, ny } = this;
221
+ this.normals(n, closed);
222
+ const half = width / 2;
223
+ const hi = Math.max(half - aa / 2, 0);
224
+ const ho = half + aa / 2;
225
+ // Lines thinner than a pixel fade instead of shrinking below one.
226
+ const core = Math.min(1, width / aa);
227
+ const segments = closed ? n : n - 1;
228
+ // Four vertices per point across the line: left edge, left core, right core, right edge.
229
+ const base = this.reserve(4 * n, 18 * segments);
230
+ for (let i = 0; i < n; i++) {
231
+ const x = xs[i];
232
+ const y = ys[i];
233
+ const ax = nx[i];
234
+ const ay = ny[i];
235
+ this.vertex(x + ax * ho, y + ay * ho, 0);
236
+ this.vertex(x + ax * hi, y + ay * hi, core);
237
+ this.vertex(x - ax * hi, y - ay * hi, core);
238
+ this.vertex(x - ax * ho, y - ay * ho, 0);
239
+ }
240
+ for (let i = 0; i < segments; i++) {
241
+ const a = base + i * 4;
242
+ const b = base + (i === n - 1 ? 0 : i + 1) * 4;
243
+ this.quad(a, a + 1, b, b + 1);
244
+ this.quad(a + 1, a + 2, b + 1, b + 2);
245
+ this.quad(a + 2, a + 3, b + 2, b + 3);
246
+ }
247
+ }
248
+ /** Room for `v` more vertices and `i` more indices; returns the first new vertex's index. */
249
+ reserve(v, i) {
250
+ if ((this.count + v) * 24 > this.data.byteLength) {
251
+ const old = this.f32;
252
+ this.data = new ArrayBuffer(2 ** Math.ceil(Math.log2((this.count + v) * 24)));
253
+ this.f32 = new Float32Array(this.data);
254
+ this.u32 = new Uint32Array(this.data);
255
+ this.f32.set(old.subarray(0, this.count * 6));
256
+ }
257
+ if (this.icount + i > this.indices.length) {
258
+ const old = this.indices;
259
+ this.indices = new Uint32Array(2 ** Math.ceil(Math.log2(this.icount + i)));
260
+ this.indices.set(old.subarray(0, this.icount));
261
+ }
262
+ return this.count;
263
+ }
264
+ /** Two triangles joining edge (a, b) to edge (c, d). */
265
+ quad(a, b, c, d) {
266
+ this.tri(a, b, c);
267
+ this.tri(b, d, c);
268
+ }
269
+ tri(a, b, c) {
270
+ const k = this.icount;
271
+ this.indices[k] = a;
272
+ this.indices[k + 1] = b;
273
+ this.indices[k + 2] = c;
274
+ this.icount = k + 3;
275
+ }
276
+ /** A textured quad: the unit square through `m`, sampling `u0, v0, u1, v1` from texture `unit`. */
277
+ sprite(m, u0, v0, u1, v1, color, flash, unit) {
278
+ const base = this.reserve(4, 6);
279
+ const extra = 0xff | (Math.round(flash * 255) << 8) | (unit << 16);
280
+ const { f32, u32 } = this;
281
+ for (let c = 0; c < 4; c++) {
282
+ const cx = c & 1;
283
+ const cy = c >> 1;
284
+ const f = (base + c) * 6;
285
+ f32[f] = m[0] * cx + m[2] * cy + m[4];
286
+ f32[f + 1] = m[1] * cx + m[3] * cy + m[5];
287
+ f32[f + 2] = cx ? u1 : u0;
288
+ f32[f + 3] = cy ? v1 : v0;
289
+ u32[f + 4] = color;
290
+ u32[f + 5] = extra;
291
+ }
292
+ this.count += 4;
293
+ this.quad(base, base + 1, base + 2, base + 3);
294
+ }
295
+ vertex(x, y, coverage) {
296
+ const m = this.m;
297
+ const f = this.count * 6;
298
+ this.f32[f] = m[0] * x + m[2] * y + m[4];
299
+ this.f32[f + 1] = m[1] * x + m[3] * y + m[5];
300
+ this.f32[f + 2] = 0;
301
+ this.f32[f + 3] = 0;
302
+ this.u32[f + 4] = this.color;
303
+ // Coverage, no flash, and texture unit 255: none (the fragment stage reads white).
304
+ this.u32[f + 5] = Math.round(coverage * 255) | (255 << 16);
305
+ this.count++;
306
+ }
307
+ }
308
+ /** Every turn the same way (or straight), for a polygon wound with positive area. */
309
+ function convex(xs, ys, n) {
310
+ for (let i = 0; i < n; i++)
311
+ if (cross(xs, ys, i, (i + 1) % n, (i + 2) % n) < 0)
312
+ return false;
313
+ return true;
314
+ }
315
+ /** Reused by `earClip`, so filling shapes every frame doesn't allocate. */
316
+ const INDICES = [];
317
+ /**
318
+ * Triangulate a simple polygon wound so its interior is on the left (positive signed area in y-down space).
319
+ * O(n²), fine for UI and debug shapes. Self-intersecting input still produces triangles, just not exact ones.
320
+ */
321
+ export function earClip(xs, ys, n, tri) {
322
+ const idx = INDICES;
323
+ idx.length = 0;
324
+ for (let k = 0; k < n; k++)
325
+ idx.push(k);
326
+ let guard = 0;
327
+ let i = 0;
328
+ while (idx.length > 3 && guard < idx.length) {
329
+ const len = idx.length;
330
+ const a = idx[(i + len - 1) % len];
331
+ const b = idx[i % len];
332
+ const c = idx[(i + 1) % len];
333
+ if (isEar(xs, ys, idx, a, b, c)) {
334
+ tri(a, b, c);
335
+ idx.splice(i % len, 1);
336
+ guard = 0;
337
+ }
338
+ else {
339
+ i++;
340
+ guard++;
341
+ }
342
+ i %= idx.length;
343
+ }
344
+ if (idx.length === 3)
345
+ tri(idx[0], idx[1], idx[2]);
346
+ // No ear left (degenerate or self-intersecting): fan the rest.
347
+ else
348
+ for (let k = 1; k + 1 < idx.length; k++)
349
+ tri(idx[0], idx[k], idx[k + 1]);
350
+ }
351
+ function cross(xs, ys, a, b, c) {
352
+ const ax = xs[a];
353
+ const ay = ys[a];
354
+ return (xs[b] - ax) * (ys[c] - ay) - (ys[b] - ay) * (xs[c] - ax);
355
+ }
356
+ function isEar(xs, ys, idx, a, b, c) {
357
+ if (cross(xs, ys, a, b, c) <= 0)
358
+ return false;
359
+ for (const p of idx) {
360
+ if (p === a || p === b || p === c)
361
+ continue;
362
+ if (cross(xs, ys, a, b, p) >= 0 && cross(xs, ys, b, c, p) >= 0 && cross(xs, ys, c, a, p) >= 0)
363
+ return false;
364
+ }
365
+ return true;
366
+ }
367
+ //# sourceMappingURL=shapes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapes.js","sourceRoot":"","sources":["../src/shapes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { Draw } from "./draw.js";
2
+ export interface SharedRendererOptions {
3
+ /** Linear filtering for images by default. Pass false for pixel art. Default true. */
4
+ smooth?: boolean;
5
+ }
6
+ /** spryte drawing on a WebGL2 context another engine owns. See `createSharedRenderer`. */
7
+ export interface SharedRenderer {
8
+ readonly draw: Draw;
9
+ /**
10
+ * Where the next `draw.begin()` draws: the host's framebuffer (null for the canvas) and its size in pixels. Call it
11
+ * when the host's destination changes, such as a filter or post-processing pass that renders into its own
12
+ * framebuffer. Until it's called, drawing goes to the canvas at its current size.
13
+ */
14
+ target(framebuffer: WebGLFramebuffer | null, width: number, height: number): void;
15
+ }
16
+ /**
17
+ * A `Draw` for a WebGL2 context another engine owns (Phaser, PixiJS, your own code), to draw with spryte inside the
18
+ * host's frame and in its draw order, on one GPU context with no overlay canvas. Create it inside the slot the host
19
+ * gives you for foreign drawing, since creating it changes GL state. Each frame, in that slot:
20
+ * `shared.target(...)` if the host's destination changed, `draw.begin(null, width, height, scale)` (null draws
21
+ * over the host's frame), draw, `draw.end()`.
22
+ *
23
+ * What spryte sets at `begin()` and leaves to the host afterwards is listed in `docs/architecture.md`. The host's
24
+ * scissor and stencil are respected: a camera viewport or mask applies to spryte's drawing too, and spryte's own
25
+ * clips intersect the host's scissor. Context loss is the host's: it must `preventDefault` on `webglcontextlost`
26
+ * for the browser to restore the context, and spryte rebuilds its GPU objects at the first `begin()` after.
27
+ */
28
+ export declare function createSharedRenderer(gl: WebGL2RenderingContext, options?: SharedRendererOptions): SharedRenderer;
29
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,MAAM,WAAW,qBAAqB;IACpC,sFAAsF;IACtF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,0FAA0F;AAC1F,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB;;;;OAIG;IACH,MAAM,CAAC,WAAW,EAAE,gBAAgB,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACnF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,sBAAsB,EAAE,OAAO,GAAE,qBAA0B,GAAG,cAAc,CAapH"}
package/dist/shared.js ADDED
@@ -0,0 +1,134 @@
1
+ import { Draw } from "./draw.js";
2
+ import { WebGL2Backend } from "./webgl2.js";
3
+ /**
4
+ * A `Draw` for a WebGL2 context another engine owns (Phaser, PixiJS, your own code), to draw with spryte inside the
5
+ * host's frame and in its draw order, on one GPU context with no overlay canvas. Create it inside the slot the host
6
+ * gives you for foreign drawing, since creating it changes GL state. Each frame, in that slot:
7
+ * `shared.target(...)` if the host's destination changed, `draw.begin(null, width, height, scale)` (null draws
8
+ * over the host's frame), draw, `draw.end()`.
9
+ *
10
+ * What spryte sets at `begin()` and leaves to the host afterwards is listed in `docs/architecture.md`. The host's
11
+ * scissor and stencil are respected: a camera viewport or mask applies to spryte's drawing too, and spryte's own
12
+ * clips intersect the host's scissor. Context loss is the host's: it must `preventDefault` on `webglcontextlost`
13
+ * for the browser to restore the context, and spryte rebuilds its GPU objects at the first `begin()` after.
14
+ */
15
+ export function createSharedRenderer(gl, options = {}) {
16
+ const backend = new SharedBackend(gl);
17
+ const draw = new Draw(backend, options.smooth ?? true);
18
+ draw.resize(gl.drawingBufferWidth, gl.drawingBufferHeight);
19
+ return {
20
+ draw,
21
+ target(framebuffer, width, height) {
22
+ backend.fb = framebuffer;
23
+ backend.fbW = width;
24
+ backend.fbH = height;
25
+ draw.resize(width, height);
26
+ },
27
+ };
28
+ }
29
+ /**
30
+ * The WebGL2 backend on a host's context: draws into the host's framebuffer, assumes nothing about GL state between
31
+ * frames, keeps the host's scissor and stencil, and leaves no sampler objects bound (a host written for WebGL1 never
32
+ * binds samplers, so spryte's would override its texture filtering).
33
+ */
34
+ class SharedBackend extends WebGL2Backend {
35
+ fb = null;
36
+ fbW;
37
+ fbH;
38
+ /** The host's scissor box at `begin()`, or null when its scissor test was off. */
39
+ hostScissor = null;
40
+ constructor(gl) {
41
+ super(gl);
42
+ this.fbW = gl.drawingBufferWidth;
43
+ this.fbH = gl.drawingBufferHeight;
44
+ // The host owns context loss; begin() notices it instead.
45
+ gl.canvas.removeEventListener("webglcontextlost", this.onLost);
46
+ gl.canvas.removeEventListener("webglcontextrestored", this.onRestored);
47
+ }
48
+ begin(clear, width, height) {
49
+ const gl = this.gl;
50
+ if (gl.isContextLost()) {
51
+ this.lost = true;
52
+ return;
53
+ }
54
+ if (this.lost)
55
+ this.onRestored();
56
+ // The host drew since last frame: rebind everything spryte otherwise assumes stays bound.
57
+ gl.useProgram(this.active.program);
58
+ gl.bindVertexArray(this.vao);
59
+ gl.enable(gl.BLEND);
60
+ gl.blendEquation(gl.FUNC_ADD);
61
+ this.applyBlend();
62
+ gl.disable(gl.DEPTH_TEST);
63
+ gl.disable(gl.CULL_FACE);
64
+ gl.colorMask(true, true, true, true);
65
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
66
+ // Scissor and stencil stay as the host set them: its camera viewport or mask applies to spryte too.
67
+ this.hostScissor = gl.isEnabled(gl.SCISSOR_TEST) ? gl.getParameter(gl.SCISSOR_BOX) : null;
68
+ super.begin(clear, width, height);
69
+ }
70
+ bindOutput() {
71
+ const gl = this.gl;
72
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this.fb);
73
+ gl.viewport(0, 0, this.fbW, this.fbH);
74
+ this.outH = this.fbH;
75
+ // Back on the host's framebuffer, where its scissor applies again (a render target had it off).
76
+ this.scissor(null);
77
+ }
78
+ setClip(rect) {
79
+ // Inside a render target the host's scissor doesn't apply: it's in the host framebuffer's pixels.
80
+ if (this.target || this.lost) {
81
+ super.setClip(rect);
82
+ return;
83
+ }
84
+ this.flush();
85
+ this.scissor(rect);
86
+ }
87
+ setTarget(target, clear, width, height) {
88
+ if (target && !this.lost && this.hostScissor) {
89
+ // Submit what's queued for the host's framebuffer under its scissor, then draw the target unscissored.
90
+ this.flush();
91
+ this.gl.disable(this.gl.SCISSOR_TEST);
92
+ }
93
+ super.setTarget(target, clear, width, height);
94
+ }
95
+ end() {
96
+ this.flush();
97
+ if (this.lost)
98
+ return;
99
+ const gl = this.gl;
100
+ this.scissor(null);
101
+ for (let i = 0; i < 8; i++)
102
+ gl.bindSampler(i, null);
103
+ }
104
+ /** Set the scissor to spryte's clip (in the host framebuffer's top-left pixels) intersected with the host's. */
105
+ scissor(rect) {
106
+ const gl = this.gl;
107
+ const host = this.hostScissor;
108
+ if (!rect) {
109
+ if (host) {
110
+ gl.enable(gl.SCISSOR_TEST);
111
+ gl.scissor(host[0], host[1], host[2], host[3]);
112
+ }
113
+ else
114
+ gl.disable(gl.SCISSOR_TEST);
115
+ return;
116
+ }
117
+ // WebGL's scissor origin is bottom-left.
118
+ let x = rect.x;
119
+ let y = this.fbH - rect.y - rect.h;
120
+ let w = rect.w;
121
+ let h = rect.h;
122
+ if (host) {
123
+ const x1 = Math.min(x + w, host[0] + host[2]);
124
+ const y1 = Math.min(y + h, host[1] + host[3]);
125
+ x = Math.max(x, host[0]);
126
+ y = Math.max(y, host[1]);
127
+ w = Math.max(0, x1 - x);
128
+ h = Math.max(0, y1 - y);
129
+ }
130
+ gl.enable(gl.SCISSOR_TEST);
131
+ gl.scissor(x, y, w, h);
132
+ }
133
+ }
134
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"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"}