spryte 0.2.1 → 0.3.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/README.md +18 -10
- package/dist/backend.d.ts +26 -3
- package/dist/backend.d.ts.map +1 -1
- package/dist/canvas2d.d.ts +10 -2
- package/dist/canvas2d.d.ts.map +1 -1
- package/dist/canvas2d.js +70 -4
- package/dist/canvas2d.js.map +1 -1
- package/dist/draw.d.ts +39 -18
- package/dist/draw.d.ts.map +1 -1
- package/dist/draw.js +156 -35
- package/dist/draw.js.map +1 -1
- package/dist/filters.d.ts +59 -0
- package/dist/filters.d.ts.map +1 -0
- package/dist/filters.js +188 -0
- package/dist/filters.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/mask.d.ts +13 -0
- package/dist/mask.d.ts.map +1 -0
- package/dist/mask.js +29 -0
- package/dist/mask.js.map +1 -0
- package/dist/offscreen.d.ts +26 -0
- package/dist/offscreen.d.ts.map +1 -0
- package/dist/offscreen.js +83 -0
- package/dist/offscreen.js.map +1 -0
- package/dist/panels.d.ts +44 -0
- package/dist/panels.d.ts.map +1 -0
- package/dist/panels.js +97 -0
- package/dist/panels.js.map +1 -0
- package/dist/renderer.js +1 -0
- package/dist/renderer.js.map +1 -1
- package/dist/shapes.d.ts +64 -0
- package/dist/shapes.d.ts.map +1 -0
- package/dist/shapes.js +367 -0
- package/dist/shapes.js.map +1 -0
- package/dist/webgl2.d.ts +9 -1
- package/dist/webgl2.d.ts.map +1 -1
- package/dist/webgl2.js +138 -6
- package/dist/webgl2.js.map +1 -1
- package/package.json +2 -2
package/dist/shapes.d.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { Matrix } from "./backend.js";
|
|
2
|
+
import { type Color } from "./color.js";
|
|
3
|
+
import type { Draw } from "./draw.js";
|
|
4
|
+
/**
|
|
5
|
+
* Filled polygon through `points` (x0, y0, x1, y1, …), antialiased. Concave is fine; it closes itself and
|
|
6
|
+
* shouldn't cross itself. `count` defaults to every pair in `points`.
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { polygon } from "spryte";
|
|
10
|
+
* polygon(draw, [0, 0, 20, 0, 10, 16], "#cffb2d");
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export declare function polygon(draw: Draw, points: ArrayLike<number>, color: Color, count?: number): void;
|
|
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 declare function polyline(draw: Draw, points: ArrayLike<number>, width: number, color: Color, closed?: boolean, count?: number): void;
|
|
16
|
+
/** Rectangle with rounded corners: filled, or outlined when `lineWidth` is given (the outline is centred on the edge). */
|
|
17
|
+
export declare function roundRect(draw: Draw, x: number, y: number, w: number, h: number, radius: number, color: Color, lineWidth?: number): void;
|
|
18
|
+
/** Circle outline, `width` wide, centred on `radius`. */
|
|
19
|
+
export declare function ring(draw: Draw, x: number, y: number, radius: number, width: number, color: Color): void;
|
|
20
|
+
/**
|
|
21
|
+
* Indexed triangles for the WebGL2 backend's `path()`: x, y, u, v (floats), a colour (RGBA bytes) and coverage,
|
|
22
|
+
* 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.
|
|
23
|
+
* @internal
|
|
24
|
+
*/
|
|
25
|
+
export declare class ShapeBuffer {
|
|
26
|
+
data: ArrayBuffer;
|
|
27
|
+
f32: Float32Array<ArrayBuffer>;
|
|
28
|
+
u32: Uint32Array<ArrayBuffer>;
|
|
29
|
+
indices: Uint32Array<ArrayBuffer>;
|
|
30
|
+
/** Vertices and indices written. */
|
|
31
|
+
count: number;
|
|
32
|
+
icount: number;
|
|
33
|
+
private m;
|
|
34
|
+
private color;
|
|
35
|
+
private xs;
|
|
36
|
+
private ys;
|
|
37
|
+
private nx;
|
|
38
|
+
private ny;
|
|
39
|
+
/** The inner ring of a fill, in the points' units (for ear clipping). */
|
|
40
|
+
private ix;
|
|
41
|
+
private iy;
|
|
42
|
+
/** Fill (`width` 0) or stroke `n` points. `aa` is one device pixel in the points' units; `color` is RGBA bytes in memory order. */
|
|
43
|
+
add(m: Matrix, points: ArrayLike<number>, n: number, closed: boolean, width: number, color: number, aa: number): void;
|
|
44
|
+
/** Copy points, dropping repeats; returns how many are left. Closed shapes also drop a last point equal to the first. */
|
|
45
|
+
private load;
|
|
46
|
+
/** Miter normals (left of travel) scaled so offsetting by 1 moves each edge by 1, clamped at MITER. */
|
|
47
|
+
private normals;
|
|
48
|
+
private fill;
|
|
49
|
+
private stroke;
|
|
50
|
+
/** Room for `v` more vertices and `i` more indices; returns the first new vertex's index. */
|
|
51
|
+
private reserve;
|
|
52
|
+
/** Two triangles joining edge (a, b) to edge (c, d). */
|
|
53
|
+
private quad;
|
|
54
|
+
private tri;
|
|
55
|
+
/** A textured quad: the unit square through `m`, sampling `u0, v0, u1, v1` from texture `unit`. */
|
|
56
|
+
sprite(m: Matrix, u0: number, v0: number, u1: number, v1: number, color: number, flash: number, unit: number): void;
|
|
57
|
+
private vertex;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Triangulate a simple polygon wound so its interior is on the left (positive signed area in y-down space).
|
|
61
|
+
* O(n²), fine for UI and debug shapes. Self-intersecting input still produces triangles, just not exact ones.
|
|
62
|
+
*/
|
|
63
|
+
export declare function earClip(xs: ArrayLike<number>, ys: ArrayLike<number>, n: number, tri: (a: number, b: number, c: number) => void): void;
|
|
64
|
+
//# sourceMappingURL=shapes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shapes.d.ts","sourceRoot":"","sources":["../src/shapes.ts"],"names":[],"mappings":"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"}
|
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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"}
|
package/dist/webgl2.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Backend, BlendMode, ClipRect, Matrix, RawContext, TextureSource } from "./backend.js";
|
|
2
2
|
import { type CopySpec } from "./copies.js";
|
|
3
3
|
import type { Shader } from "./shader.js";
|
|
4
|
+
import type { ShapeBuffer } from "./shapes.js";
|
|
4
5
|
import { RenderTarget } from "./target.js";
|
|
5
6
|
/** Instanced, multi-texture WebGL2 sprite batcher behind the `draw` API. */
|
|
6
7
|
export declare class WebGL2Backend implements Backend {
|
|
@@ -26,6 +27,9 @@ export declare class WebGL2Backend implements Backend {
|
|
|
26
27
|
private quadBuffer;
|
|
27
28
|
private copyPipe;
|
|
28
29
|
private each;
|
|
30
|
+
/** Made on the first shape, so apps that draw none never build them. */
|
|
31
|
+
private shapePipe;
|
|
32
|
+
private shapes;
|
|
29
33
|
private stagingScale;
|
|
30
34
|
private stagingRot;
|
|
31
35
|
private staging;
|
|
@@ -63,10 +67,11 @@ export declare class WebGL2Backend implements Backend {
|
|
|
63
67
|
copies(c: CopySpec): void;
|
|
64
68
|
/** Upload one float attribute: a Float32Array as is, anything else through a reused staging array. */
|
|
65
69
|
private attribute;
|
|
66
|
-
setBlend(mode: BlendMode): void;
|
|
70
|
+
setBlend(mode: BlendMode | "mask"): void;
|
|
67
71
|
setClip(rect: ClipRect | null): void;
|
|
68
72
|
end(): void;
|
|
69
73
|
resize(): void;
|
|
74
|
+
update(dst: TextureSource, x: number, y: number, from: HTMLCanvasElement | OffscreenCanvas, w: number, h: number): void;
|
|
70
75
|
invalidate(src: TextureSource): void;
|
|
71
76
|
/** Release every GPU object this backend created, so renderers can be created and destroyed repeatedly. */
|
|
72
77
|
dispose(): void;
|
|
@@ -77,6 +82,9 @@ export declare class WebGL2Backend implements Backend {
|
|
|
77
82
|
private targetStore;
|
|
78
83
|
private eachPipeline;
|
|
79
84
|
private copyPipeline;
|
|
85
|
+
path(m: Matrix, points: ArrayLike<number>, n: number, closed: boolean, width: number, color: number, aa: number, tessellator: new () => ShapeBuffer): void;
|
|
86
|
+
private flushShapes;
|
|
87
|
+
private shapePipeline;
|
|
80
88
|
private flush;
|
|
81
89
|
/** Upload `u_view` to a program if the destination size changed since it last drew. The program must be bound. */
|
|
82
90
|
private syncView;
|
package/dist/webgl2.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl2.d.ts","sourceRoot":"","sources":["../src/webgl2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACpG,OAAO,EAAE,KAAK,QAAQ,EAAU,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"webgl2.d.ts","sourceRoot":"","sources":["../src/webgl2.ts"],"names":[],"mappings":"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"}
|