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/filters.js
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { offscreen, pass, restore, whole } from "./offscreen.js";
|
|
2
|
+
import { Shader } from "./shader.js";
|
|
3
|
+
/**
|
|
4
|
+
* Run `fn` and draw the result through `filters`, in order. Same units, transform and clips as outside;
|
|
5
|
+
* nests with masks and targets. Each filter pass is an offscreen pass the size of the destination, so filter
|
|
6
|
+
* groups, not single sprites.
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { blur, filter, grayscale } from "spryte";
|
|
10
|
+
* filter(draw, [grayscale()], () => drawWorld(draw)); // paused
|
|
11
|
+
* draw.blend("add");
|
|
12
|
+
* filter(draw, [blur(4)], () => drawLights(draw)); // glow: a blurred copy added under the sharp one
|
|
13
|
+
* draw.blend("normal");
|
|
14
|
+
* drawLights(draw);
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export function filter(draw, filters, fn) {
|
|
18
|
+
if (filters.length === 0) {
|
|
19
|
+
fn();
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const o = offscreen(draw);
|
|
23
|
+
let result = o.a;
|
|
24
|
+
let css = "";
|
|
25
|
+
try {
|
|
26
|
+
pass(draw, o, o.a, fn, true);
|
|
27
|
+
const scale = o.pw / o.lw;
|
|
28
|
+
if (draw.backend.setFilter) {
|
|
29
|
+
// Canvas 2D: the browser's own filters, applied as the result is drawn.
|
|
30
|
+
css = filters
|
|
31
|
+
.map((f) => f.css(scale) ?? "")
|
|
32
|
+
.join(" ")
|
|
33
|
+
.trim();
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// Ping-pong between the two targets, one pass at a time.
|
|
37
|
+
for (const f of filters)
|
|
38
|
+
for (const p of f.passes) {
|
|
39
|
+
const from = result;
|
|
40
|
+
result = from === o.a ? o.b : o.a;
|
|
41
|
+
pass(draw, o, result, () => {
|
|
42
|
+
for (const [name, value] of p.uniforms(1 / o.pw, 1 / o.ph, scale))
|
|
43
|
+
p.shader.set(name, value);
|
|
44
|
+
whole(draw, from, o, p.shader, p.smooth);
|
|
45
|
+
}, true);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
restore(draw, o);
|
|
51
|
+
}
|
|
52
|
+
if (css)
|
|
53
|
+
draw.backend.setFilter?.(css);
|
|
54
|
+
whole(draw, result, o);
|
|
55
|
+
if (css)
|
|
56
|
+
draw.backend.setFilter?.("none");
|
|
57
|
+
}
|
|
58
|
+
// Shared shaders, so filters made every frame never recompile. Samples outside the image are transparent,
|
|
59
|
+
// as in CSS filters.
|
|
60
|
+
let blurShader;
|
|
61
|
+
let matrixShader;
|
|
62
|
+
const BLUR = `
|
|
63
|
+
uniform vec2 dir;
|
|
64
|
+
uniform float sigma;
|
|
65
|
+
bool inside(vec2 uv) {
|
|
66
|
+
return all(greaterThanEqual(uv, vec2(0.0))) && all(lessThanEqual(uv, vec2(1.0)));
|
|
67
|
+
}
|
|
68
|
+
vec4 tap(vec2 uv) {
|
|
69
|
+
return inside(uv) ? source(uv) : vec4(0.0);
|
|
70
|
+
}
|
|
71
|
+
// Texels i and i + 1 from uv along d, weighted k1 and k2, in one linear sample at f. At the image's edge only
|
|
72
|
+
// texel i is inside: sample it alone, since outside is transparent (clamping would repeat the edge texel).
|
|
73
|
+
vec4 pair(vec2 uv, vec2 d, float i, float k1, float k2, float f) {
|
|
74
|
+
if (inside(uv + d * (i + 1.0))) return source(uv + d * f) * (k1 + k2);
|
|
75
|
+
return tap(uv + d * i) * k1;
|
|
76
|
+
}
|
|
77
|
+
vec4 effect(vec4 color, vec2 uv) {
|
|
78
|
+
// Out to 3 sigma, two texels per tap: linear filtering samples between texels i and i + 1 at the point
|
|
79
|
+
// that weights them as the Gaussian does, halving the taps.
|
|
80
|
+
float n = min(ceil(sigma * 3.0), 128.0);
|
|
81
|
+
float s2 = 2.0 * sigma * sigma;
|
|
82
|
+
vec4 sum = tap(uv);
|
|
83
|
+
float total = 1.0;
|
|
84
|
+
for (int j = 0; j < 64; j++) {
|
|
85
|
+
float i = 1.0 + 2.0 * float(j);
|
|
86
|
+
if (i > n) break;
|
|
87
|
+
float k1 = exp(-i * i / s2);
|
|
88
|
+
float k2 = exp(-(i + 1.0) * (i + 1.0) / s2);
|
|
89
|
+
float k = k1 + k2;
|
|
90
|
+
float f = (i * k1 + (i + 1.0) * k2) / k;
|
|
91
|
+
sum += pair(uv, dir, i, k1, k2, f) + pair(uv, -dir, i, k1, k2, f);
|
|
92
|
+
total += 2.0 * k;
|
|
93
|
+
}
|
|
94
|
+
return sum / total * color;
|
|
95
|
+
}`;
|
|
96
|
+
const MATRIX = `
|
|
97
|
+
uniform vec4 r;
|
|
98
|
+
uniform vec4 g;
|
|
99
|
+
uniform vec4 b;
|
|
100
|
+
uniform vec4 a;
|
|
101
|
+
uniform vec4 o;
|
|
102
|
+
vec4 effect(vec4 color, vec2 uv) {
|
|
103
|
+
vec4 p = source(uv);
|
|
104
|
+
vec4 c = p.a > 0.0 ? vec4(p.rgb / p.a, p.a) : vec4(0.0);
|
|
105
|
+
vec4 q = clamp(vec4(dot(r, c), dot(g, c), dot(b, c), dot(a, c)) + o, 0.0, 1.0);
|
|
106
|
+
return vec4(q.rgb * q.a, q.a) * color;
|
|
107
|
+
}`;
|
|
108
|
+
/**
|
|
109
|
+
* Gaussian blur. `radius` is the standard deviation in logical units, the same as CSS `blur()`. Two passes of
|
|
110
|
+
* up to 65 taps; blurs over about 40 device pixels are cut short, so blur a smaller target and scale it up instead.
|
|
111
|
+
*/
|
|
112
|
+
export function blur(radius) {
|
|
113
|
+
blurShader ??= new Shader(BLUR);
|
|
114
|
+
const shader = blurShader;
|
|
115
|
+
const pass = (x, y) => ({
|
|
116
|
+
shader,
|
|
117
|
+
smooth: true,
|
|
118
|
+
uniforms: (tw, th, scale) => [
|
|
119
|
+
["dir", [x * tw, y * th]],
|
|
120
|
+
["sigma", Math.max(radius * scale, 1e-3)],
|
|
121
|
+
],
|
|
122
|
+
});
|
|
123
|
+
return {
|
|
124
|
+
passes: radius > 0 ? [pass(1, 0), pass(0, 1)] : [],
|
|
125
|
+
css: (scale) => (radius > 0 ? `blur(${radius * scale}px)` : null),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Colour matrix: 20 numbers, four rows of `[r, g, b, a, offset]` (offset 0..1), applied to unpremultiplied
|
|
130
|
+
* colour. WebGL2 only; on Canvas 2D this one draws unfiltered. The named filters below work on both.
|
|
131
|
+
*/
|
|
132
|
+
export function colorMatrix(m) {
|
|
133
|
+
return matrix(m, null);
|
|
134
|
+
}
|
|
135
|
+
/** 0 (unchanged) to 1 (grey). CSS `grayscale()`. */
|
|
136
|
+
export function grayscale(amount = 1) {
|
|
137
|
+
const s = 1 - amount;
|
|
138
|
+
return rgb([0.2126 + 0.7874 * s, 0.7152 - 0.7152 * s, 0.0722 - 0.0722 * s], [0.2126 - 0.2126 * s, 0.7152 + 0.2848 * s, 0.0722 - 0.0722 * s], [0.2126 - 0.2126 * s, 0.7152 - 0.7152 * s, 0.0722 + 0.9278 * s], `grayscale(${amount})`);
|
|
139
|
+
}
|
|
140
|
+
/** 0 (unchanged) to 1 (full sepia). CSS `sepia()`. */
|
|
141
|
+
export function sepia(amount = 1) {
|
|
142
|
+
const s = 1 - amount;
|
|
143
|
+
return rgb([0.393 + 0.607 * s, 0.769 - 0.769 * s, 0.189 - 0.189 * s], [0.349 - 0.349 * s, 0.686 + 0.314 * s, 0.168 - 0.168 * s], [0.272 - 0.272 * s, 0.534 - 0.534 * s, 0.131 + 0.869 * s], `sepia(${amount})`);
|
|
144
|
+
}
|
|
145
|
+
/** 0 is grey, 1 unchanged, above 1 more vivid. CSS `saturate()`. */
|
|
146
|
+
export function saturate(amount) {
|
|
147
|
+
const s = amount;
|
|
148
|
+
return rgb([0.213 + 0.787 * s, 0.715 - 0.715 * s, 0.072 - 0.072 * s], [0.213 - 0.213 * s, 0.715 + 0.285 * s, 0.072 - 0.072 * s], [0.213 - 0.213 * s, 0.715 - 0.715 * s, 0.072 + 0.928 * s], `saturate(${amount})`);
|
|
149
|
+
}
|
|
150
|
+
/** Rotate hues by `radians`. CSS `hue-rotate()`. */
|
|
151
|
+
export function hueRotate(radians) {
|
|
152
|
+
const c = Math.cos(radians);
|
|
153
|
+
const s = Math.sin(radians);
|
|
154
|
+
return rgb([0.213 + c * 0.787 - s * 0.213, 0.715 - c * 0.715 - s * 0.715, 0.072 - c * 0.072 + s * 0.928], [0.213 - c * 0.213 + s * 0.143, 0.715 + c * 0.285 + s * 0.14, 0.072 - c * 0.072 - s * 0.283], [0.213 - c * 0.213 - s * 0.787, 0.715 - c * 0.715 + s * 0.715, 0.072 + c * 0.928 + s * 0.072], `hue-rotate(${radians}rad)`);
|
|
155
|
+
}
|
|
156
|
+
/** Multiply colour: 0 black, 1 unchanged. CSS `brightness()`. */
|
|
157
|
+
export function brightness(amount) {
|
|
158
|
+
return matrix([amount, 0, 0, 0, 0, 0, amount, 0, 0, 0, 0, 0, amount, 0, 0, 0, 0, 0, 1, 0], `brightness(${amount})`);
|
|
159
|
+
}
|
|
160
|
+
/** 0 flat grey, 1 unchanged, above 1 more contrast. CSS `contrast()`. */
|
|
161
|
+
export function contrast(amount) {
|
|
162
|
+
const o = 0.5 - 0.5 * amount;
|
|
163
|
+
return matrix([amount, 0, 0, 0, o, 0, amount, 0, 0, o, 0, 0, amount, 0, o, 0, 0, 0, 1, 0], `contrast(${amount})`);
|
|
164
|
+
}
|
|
165
|
+
/** 0 unchanged, 1 inverted. CSS `invert()`. */
|
|
166
|
+
export function invert(amount = 1) {
|
|
167
|
+
const k = 1 - 2 * amount;
|
|
168
|
+
return matrix([k, 0, 0, 0, amount, 0, k, 0, 0, amount, 0, 0, k, 0, amount, 0, 0, 0, 1, 0], `invert(${amount})`);
|
|
169
|
+
}
|
|
170
|
+
function rgb(r, g, b, css) {
|
|
171
|
+
return matrix([...r, 0, 0, ...g, 0, 0, ...b, 0, 0, 0, 0, 0, 1, 0], css);
|
|
172
|
+
}
|
|
173
|
+
function matrix(m, css) {
|
|
174
|
+
if (m.length !== 20)
|
|
175
|
+
throw new Error(`spryte: a colour matrix has 20 numbers, got ${m.length}`);
|
|
176
|
+
matrixShader ??= new Shader(MATRIX);
|
|
177
|
+
const shader = matrixShader;
|
|
178
|
+
const row = (i) => [m[i], m[i + 1], m[i + 2], m[i + 3]];
|
|
179
|
+
const uniforms = [
|
|
180
|
+
["r", row(0)],
|
|
181
|
+
["g", row(5)],
|
|
182
|
+
["b", row(10)],
|
|
183
|
+
["a", row(15)],
|
|
184
|
+
["o", [m[4], m[9], m[14], m[19]]],
|
|
185
|
+
];
|
|
186
|
+
return { passes: [{ shader, uniforms: () => uniforms }], css: () => css };
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=filters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.js","sourceRoot":"","sources":["../src/filters.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,8 +2,12 @@ export type { BlendMode, ClipRect, Matrix, RawContext, TextureSource } from "./b
|
|
|
2
2
|
export { BitmapFont, type BitmapFontOptions, type Glyph } from "./bitmap-font.js";
|
|
3
3
|
export { type Color, rgbaToCss, toRGBA } from "./color.js";
|
|
4
4
|
export type { SpritesEach } from "./copies.js";
|
|
5
|
-
export { Draw, type Frame, type SpriteDrawOptions, type TextDrawOptions } from "./draw.js";
|
|
5
|
+
export { Draw, type Frame, type SpriteDrawOptions, type TextDrawOptions, } from "./draw.js";
|
|
6
|
+
export { blur, brightness, colorMatrix, contrast, type Filter, filter, grayscale, hueRotate, invert, saturate, sepia, } from "./filters.js";
|
|
7
|
+
export { mask } from "./mask.js";
|
|
8
|
+
export { nineSlice, type PanelDrawOptions, type TiledDrawOptions, tiled } from "./panels.js";
|
|
6
9
|
export { createRenderer, type RendererOptions } from "./renderer.js";
|
|
7
10
|
export { Shader, type UniformValue } from "./shader.js";
|
|
11
|
+
export { polygon, polyline, ring, roundRect } from "./shapes.js";
|
|
8
12
|
export { RenderTarget } from "./target.js";
|
|
9
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,KAAK,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,KAAK,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EACL,IAAI,EACJ,KAAK,KAAK,EACV,KAAK,iBAAiB,EACtB,KAAK,eAAe,GACrB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,IAAI,EACJ,UAAU,EACV,WAAW,EACX,QAAQ,EACR,KAAK,MAAM,EACX,MAAM,EACN,SAAS,EACT,SAAS,EACT,MAAM,EACN,QAAQ,EACR,KAAK,GACN,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
export { BitmapFont } from "./bitmap-font.js";
|
|
2
2
|
export { rgbaToCss, toRGBA } from "./color.js";
|
|
3
|
-
export { Draw } from "./draw.js";
|
|
3
|
+
export { Draw, } from "./draw.js";
|
|
4
|
+
export { blur, brightness, colorMatrix, contrast, filter, grayscale, hueRotate, invert, saturate, sepia, } from "./filters.js";
|
|
5
|
+
export { mask } from "./mask.js";
|
|
6
|
+
export { nineSlice, tiled } from "./panels.js";
|
|
4
7
|
export { createRenderer } from "./renderer.js";
|
|
5
8
|
export { Shader } from "./shader.js";
|
|
9
|
+
export { polygon, polyline, ring, roundRect } from "./shapes.js";
|
|
6
10
|
export { RenderTarget } from "./target.js";
|
|
7
11
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAsC,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAc,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAE3D,OAAO,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAsC,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAc,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAE3D,OAAO,EACL,IAAI,GAIL,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,IAAI,EACJ,UAAU,EACV,WAAW,EACX,QAAQ,EAER,MAAM,EACN,SAAS,EACT,SAAS,EACT,MAAM,EACN,QAAQ,EACR,KAAK,GACN,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAgD,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAwB,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,MAAM,EAAqB,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/mask.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Draw } from "./draw.js";
|
|
2
|
+
/**
|
|
3
|
+
* Run `fn`, keeping what it draws only where `shape` draws: a sprite (soft, using its alpha), shapes, text,
|
|
4
|
+
* anything. Same units, transform and clips as outside. Nests, and works inside `draw.into()`. Costs two
|
|
5
|
+
* offscreen passes the size of the destination, so mask a group of things at once rather than each sprite.
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { mask } from "spryte";
|
|
9
|
+
* mask(draw, () => draw.circle(px, py, 40, "#fff"), () => drawLevel(draw)); // spotlight
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export declare function mask(draw: Draw, shape: () => void, fn: () => void): void;
|
|
13
|
+
//# sourceMappingURL=mask.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mask.d.ts","sourceRoot":"","sources":["../src/mask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGtC;;;;;;;;;GASG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAqBxE"}
|
package/dist/mask.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { offscreen, pass, restore, whole } from "./offscreen.js";
|
|
2
|
+
/**
|
|
3
|
+
* Run `fn`, keeping what it draws only where `shape` draws: a sprite (soft, using its alpha), shapes, text,
|
|
4
|
+
* anything. Same units, transform and clips as outside. Nests, and works inside `draw.into()`. Costs two
|
|
5
|
+
* offscreen passes the size of the destination, so mask a group of things at once rather than each sprite.
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { mask } from "spryte";
|
|
9
|
+
* mask(draw, () => draw.circle(px, py, 40, "#fff"), () => drawLevel(draw)); // spotlight
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export function mask(draw, shape, fn) {
|
|
13
|
+
const o = offscreen(draw);
|
|
14
|
+
try {
|
|
15
|
+
pass(draw, o, o.a, fn, true);
|
|
16
|
+
draw.alpha = 1;
|
|
17
|
+
pass(draw, o, o.b, shape, true);
|
|
18
|
+
// Keep content where the shape drew: one quad over the whole target, so both backends agree.
|
|
19
|
+
pass(draw, o, o.a, () => {
|
|
20
|
+
draw.backend.setBlend("mask");
|
|
21
|
+
whole(draw, o.b, o);
|
|
22
|
+
}, false);
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
restore(draw, o);
|
|
26
|
+
}
|
|
27
|
+
whole(draw, o.a, o);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=mask.js.map
|
package/dist/mask.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mask.js","sourceRoot":"","sources":["../src/mask.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEjE;;;;;;;;;GASG;AACH,MAAM,UAAU,IAAI,CAAC,IAAU,EAAE,KAAiB,EAAE,EAAc;IAChE,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,CAAC;QACH,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAChC,6FAA6F;QAC7F,IAAI,CACF,IAAI,EACJ,CAAC,EACD,CAAC,CAAC,CAAC,EACH,GAAG,EAAE;YACH,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC9B,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,CAAC,EACD,KAAK,CACN,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ClipRect } from "./backend.js";
|
|
2
|
+
import type { Draw } from "./draw.js";
|
|
3
|
+
import type { Shader } from "./shader.js";
|
|
4
|
+
import { RenderTarget } from "./target.js";
|
|
5
|
+
/** @internal One level of offscreen drawing: the destination's size and two targets matching its pixels. */
|
|
6
|
+
export interface Offscreen {
|
|
7
|
+
outer: RenderTarget | null;
|
|
8
|
+
lw: number;
|
|
9
|
+
lh: number;
|
|
10
|
+
pw: number;
|
|
11
|
+
ph: number;
|
|
12
|
+
a: RenderTarget;
|
|
13
|
+
b: RenderTarget;
|
|
14
|
+
blend: Draw["blendMode"];
|
|
15
|
+
alpha: number;
|
|
16
|
+
clip: ClipRect | null;
|
|
17
|
+
}
|
|
18
|
+
/** @internal */
|
|
19
|
+
export declare function offscreen(draw: Draw): Offscreen;
|
|
20
|
+
/** @internal Draw `fn` into `into` (cleared when `clear`), in the outer units and clip, starting from normal blending. */
|
|
21
|
+
export declare function pass(draw: Draw, o: Offscreen, into: RenderTarget, fn: () => void, clear: boolean): void;
|
|
22
|
+
/** @internal Back to the outer destination, clip, alpha and blend. */
|
|
23
|
+
export declare function restore(draw: Draw, o: Offscreen): void;
|
|
24
|
+
/** @internal Draw a pooled target over the whole destination, 1:1 and untransformed, through `shader` (default none). 1:1 means `smooth` only matters to shaders sampling between texels. */
|
|
25
|
+
export declare function whole(draw: Draw, t: RenderTarget, o: Offscreen, shader?: Shader | null, smooth?: boolean): void;
|
|
26
|
+
//# sourceMappingURL=offscreen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offscreen.d.ts","sourceRoot":"","sources":["../src/offscreen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,4GAA4G;AAC5G,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,YAAY,CAAC;IAChB,CAAC,EAAE,YAAY,CAAC;IAChB,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;CACvB;AAED,gBAAgB;AAChB,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,CAmB/C;AAgBD,0HAA0H;AAC1H,wBAAgB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAWvG;AAED,sEAAsE;AACtE,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,GAAG,IAAI,CAOtD;AAED,6LAA6L;AAC7L,wBAAgB,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,GAAE,MAAM,GAAG,IAAW,EAAE,MAAM,UAAQ,GAAG,IAAI,CAanH"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { RenderTarget } from "./target.js";
|
|
2
|
+
/** Two pooled targets per level of mask or filter nesting, kept between frames and remade when the size changes. */
|
|
3
|
+
const pools = new WeakMap();
|
|
4
|
+
/** @internal */
|
|
5
|
+
export function offscreen(draw) {
|
|
6
|
+
const outer = draw.target;
|
|
7
|
+
const lw = outer ? outer.width : draw.viewW;
|
|
8
|
+
const lh = outer ? outer.height : draw.viewH;
|
|
9
|
+
const pw = outer ? outer.width : draw.backingW || Math.round(draw.viewW * draw.renderScale);
|
|
10
|
+
const ph = outer ? outer.height : draw.backingH || Math.round(draw.viewH * draw.renderScale);
|
|
11
|
+
const level = draw.maskDepth++;
|
|
12
|
+
return {
|
|
13
|
+
outer,
|
|
14
|
+
lw,
|
|
15
|
+
lh,
|
|
16
|
+
pw,
|
|
17
|
+
ph,
|
|
18
|
+
a: pooled(draw, level * 2, pw, ph),
|
|
19
|
+
b: pooled(draw, level * 2 + 1, pw, ph),
|
|
20
|
+
blend: draw.blendMode,
|
|
21
|
+
alpha: draw.alpha,
|
|
22
|
+
clip: draw.clips.at(-1) ?? null,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function pooled(draw, i, w, h) {
|
|
26
|
+
let pool = pools.get(draw);
|
|
27
|
+
if (!pool) {
|
|
28
|
+
pool = [];
|
|
29
|
+
pools.set(draw, pool);
|
|
30
|
+
}
|
|
31
|
+
const t = pool[i];
|
|
32
|
+
if (t && t.width === w && t.height === h)
|
|
33
|
+
return t;
|
|
34
|
+
if (t)
|
|
35
|
+
draw.backend.disposeTarget(t);
|
|
36
|
+
const fresh = new RenderTarget(w, h);
|
|
37
|
+
pool[i] = fresh;
|
|
38
|
+
return fresh;
|
|
39
|
+
}
|
|
40
|
+
/** @internal Draw `fn` into `into` (cleared when `clear`), in the outer units and clip, starting from normal blending. */
|
|
41
|
+
export function pass(draw, o, into, fn, clear) {
|
|
42
|
+
draw.target = into;
|
|
43
|
+
draw.backend.setTarget(into, clear ? 0 : null, o.lw, o.lh);
|
|
44
|
+
// Targets match the destination's pixels, so clips carry over as they are.
|
|
45
|
+
if (o.clip)
|
|
46
|
+
draw.backend.setClip(o.clip);
|
|
47
|
+
draw.blend("normal");
|
|
48
|
+
try {
|
|
49
|
+
fn();
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
if (o.clip)
|
|
53
|
+
draw.backend.setClip(null);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** @internal Back to the outer destination, clip, alpha and blend. */
|
|
57
|
+
export function restore(draw, o) {
|
|
58
|
+
draw.target = o.outer;
|
|
59
|
+
draw.backend.setTarget(o.outer, null, o.lw, o.lh);
|
|
60
|
+
if (o.clip)
|
|
61
|
+
draw.backend.setClip(o.clip);
|
|
62
|
+
draw.maskDepth--;
|
|
63
|
+
draw.alpha = o.alpha;
|
|
64
|
+
draw.blend(o.blend);
|
|
65
|
+
}
|
|
66
|
+
/** @internal Draw a pooled target over the whole destination, 1:1 and untransformed, through `shader` (default none). 1:1 means `smooth` only matters to shaders sampling between texels. */
|
|
67
|
+
export function whole(draw, t, o, shader = null, smooth = false) {
|
|
68
|
+
const outer = draw.shader;
|
|
69
|
+
if (outer !== shader)
|
|
70
|
+
draw.backend.setShader(shader);
|
|
71
|
+
const m = draw.tmp;
|
|
72
|
+
m[0] = o.lw;
|
|
73
|
+
m[1] = 0;
|
|
74
|
+
m[2] = 0;
|
|
75
|
+
m[3] = o.lh;
|
|
76
|
+
m[4] = 0;
|
|
77
|
+
m[5] = 0;
|
|
78
|
+
draw.quads++;
|
|
79
|
+
draw.backend.quad(m, t, 0, 0, t.width, t.height, 0xffffffff, 0, smooth);
|
|
80
|
+
if (outer !== shader)
|
|
81
|
+
draw.backend.setShader(outer);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=offscreen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offscreen.js","sourceRoot":"","sources":["../src/offscreen.ts"],"names":[],"mappings":"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"}
|
package/dist/panels.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { TextureSource } from "./backend.js";
|
|
2
|
+
import type { Color } from "./color.js";
|
|
3
|
+
import type { Draw, Frame } from "./draw.js";
|
|
4
|
+
/** Options for `nineSlice` and `tiled`. */
|
|
5
|
+
export interface PanelDrawOptions {
|
|
6
|
+
/** Multiplied with the global alpha. */
|
|
7
|
+
alpha?: number;
|
|
8
|
+
/** Colour multiplier. Default white. */
|
|
9
|
+
tint?: Color;
|
|
10
|
+
/** 0..1 mix toward white. */
|
|
11
|
+
flash?: number;
|
|
12
|
+
/** Linear filtering. Default: the renderer's setting. */
|
|
13
|
+
smooth?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface TiledDrawOptions extends PanelDrawOptions {
|
|
16
|
+
/** Scroll the pattern, in source pixels before `scale` (wraps). */
|
|
17
|
+
offsetX?: number;
|
|
18
|
+
offsetY?: number;
|
|
19
|
+
/** Tile size multiplier. Default 1. */
|
|
20
|
+
scale?: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Stretch a frame over a `w × h` box at `x, y` (top-left) without stretching its corners: the classic UI panel.
|
|
24
|
+
* `insets` are the corner sizes in source pixels, one number or `[left, top, right, bottom]`. Edges stretch,
|
|
25
|
+
* the centre fills, and corners shrink evenly if the box is smaller than they are. Nine quads, any backend.
|
|
26
|
+
*
|
|
27
|
+
* ```ts
|
|
28
|
+
* import { nineSlice } from "spryte";
|
|
29
|
+
* nineSlice(draw, panel, 8, 8, 120, 48, 6);
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare function nineSlice(draw: Draw, frame: Frame | TextureSource, x: number, y: number, w: number, h: number, insets: number | readonly [number, number, number, number], o?: PanelDrawOptions): void;
|
|
33
|
+
/**
|
|
34
|
+
* Fill a `w × h` box at `x, y` (top-left) with a frame repeated edge to edge: scrolling backgrounds, floors,
|
|
35
|
+
* water. `offsetX/offsetY` scroll the pattern. Works on frames inside an atlas (no texture wrapping), one
|
|
36
|
+
* quad per visible tile, on any backend.
|
|
37
|
+
*
|
|
38
|
+
* ```ts
|
|
39
|
+
* import { tiled } from "spryte";
|
|
40
|
+
* tiled(draw, water, 0, 120, 320, 60, { offsetX: t * 20 });
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function tiled(draw: Draw, frame: Frame | TextureSource, x: number, y: number, w: number, h: number, o?: TiledDrawOptions): void;
|
|
44
|
+
//# sourceMappingURL=panels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panels.d.ts","sourceRoot":"","sources":["../src/panels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAE7C,2CAA2C;AAC3C,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACxD,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,GAAG,aAAa,EAC5B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAC1D,CAAC,GAAE,gBAAuB,GACzB,IAAI,CAwBN;AAED;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CACnB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,GAAG,aAAa,EAC5B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,GAAE,gBAAuB,GACzB,IAAI,CA2BN"}
|
package/dist/panels.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
const NONE = Object.freeze({});
|
|
2
|
+
/**
|
|
3
|
+
* Stretch a frame over a `w × h` box at `x, y` (top-left) without stretching its corners: the classic UI panel.
|
|
4
|
+
* `insets` are the corner sizes in source pixels, one number or `[left, top, right, bottom]`. Edges stretch,
|
|
5
|
+
* the centre fills, and corners shrink evenly if the box is smaller than they are. Nine quads, any backend.
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { nineSlice } from "spryte";
|
|
9
|
+
* nineSlice(draw, panel, 8, 8, 120, 48, 6);
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export function nineSlice(draw, frame, x, y, w, h, insets, o = NONE) {
|
|
13
|
+
const f = "image" in frame ? frame : draw.wholeImage(frame);
|
|
14
|
+
const [l, t, r, b] = typeof insets === "number" ? [insets, insets, insets, insets] : insets;
|
|
15
|
+
// Corners keep their size unless they don't fit.
|
|
16
|
+
const kx = Math.min(1, w / Math.max(l + r, 1e-9));
|
|
17
|
+
const ky = Math.min(1, h / Math.max(t + b, 1e-9));
|
|
18
|
+
const xs = [x, x + l * kx, x + w - r * kx, x + w];
|
|
19
|
+
const ys = [y, y + t * ky, y + h - b * ky, y + h];
|
|
20
|
+
const us = [f.x, f.x + l, f.x + f.w - r, f.x + f.w];
|
|
21
|
+
const vs = [f.y, f.y + t, f.y + f.h - b, f.y + f.h];
|
|
22
|
+
const color = draw.spriteColor(o);
|
|
23
|
+
const smooth = o.smooth ?? draw.smooth;
|
|
24
|
+
for (let j = 0; j < 3; j++)
|
|
25
|
+
for (let i = 0; i < 3; i++) {
|
|
26
|
+
const pw = xs[i + 1] - xs[i];
|
|
27
|
+
const ph = ys[j + 1] - ys[j];
|
|
28
|
+
const sw = us[i + 1] - us[i];
|
|
29
|
+
const sh = vs[j + 1] - vs[j];
|
|
30
|
+
if (pw <= 0 || ph <= 0 || sw <= 0 || sh <= 0)
|
|
31
|
+
continue;
|
|
32
|
+
draw.local(xs[i], ys[j], pw, ph);
|
|
33
|
+
if (!smooth)
|
|
34
|
+
snapEdges(draw);
|
|
35
|
+
draw.quads++;
|
|
36
|
+
draw.backend.quad(draw.tmp, f.image, us[i], vs[j], sw, sh, color, o.flash ?? 0, smooth);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Fill a `w × h` box at `x, y` (top-left) with a frame repeated edge to edge: scrolling backgrounds, floors,
|
|
41
|
+
* water. `offsetX/offsetY` scroll the pattern. Works on frames inside an atlas (no texture wrapping), one
|
|
42
|
+
* quad per visible tile, on any backend.
|
|
43
|
+
*
|
|
44
|
+
* ```ts
|
|
45
|
+
* import { tiled } from "spryte";
|
|
46
|
+
* tiled(draw, water, 0, 120, 320, 60, { offsetX: t * 20 });
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export function tiled(draw, frame, x, y, w, h, o = NONE) {
|
|
50
|
+
const f = "image" in frame ? frame : draw.wholeImage(frame);
|
|
51
|
+
const k = o.scale ?? 1;
|
|
52
|
+
const tw = f.w * k;
|
|
53
|
+
const th = f.h * k;
|
|
54
|
+
if (!(tw > 0 && th > 0 && w > 0 && h > 0))
|
|
55
|
+
return;
|
|
56
|
+
const color = draw.spriteColor(o);
|
|
57
|
+
const smooth = o.smooth ?? draw.smooth;
|
|
58
|
+
const flash = o.flash ?? 0;
|
|
59
|
+
const tiles = (Math.ceil(w / tw) + 1) * (Math.ceil(h / th) + 1);
|
|
60
|
+
if (tiles > 1_000_000)
|
|
61
|
+
throw new Error(`spryte: tiled() would draw ${tiles} tiles; use a larger frame or scale`);
|
|
62
|
+
const ox = ((((o.offsetX ?? 0) * k) % tw) + tw) % tw;
|
|
63
|
+
const oy = ((((o.offsetY ?? 0) * k) % th) + th) % th;
|
|
64
|
+
for (let ty = y - oy; ty < y + h; ty += th) {
|
|
65
|
+
const y0 = Math.max(ty, y);
|
|
66
|
+
const y1 = Math.min(ty + th, y + h);
|
|
67
|
+
if (y1 <= y0)
|
|
68
|
+
continue;
|
|
69
|
+
for (let tx = x - ox; tx < x + w; tx += tw) {
|
|
70
|
+
const x0 = Math.max(tx, x);
|
|
71
|
+
const x1 = Math.min(tx + tw, x + w);
|
|
72
|
+
if (x1 <= x0)
|
|
73
|
+
continue;
|
|
74
|
+
draw.local(x0, y0, x1 - x0, y1 - y0);
|
|
75
|
+
if (!smooth)
|
|
76
|
+
snapEdges(draw);
|
|
77
|
+
draw.quads++;
|
|
78
|
+
draw.backend.quad(draw.tmp, f.image, f.x + (x0 - tx) / k, f.y + (y0 - ty) / k, (x1 - x0) / k, (y1 - y0) / k, color, flash, smooth);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Pixel art: put an unrotated quad's edges on whole units, like `sprite()`. Neighbouring quads share edges,
|
|
84
|
+
* so they round the same way and never gap or overlap.
|
|
85
|
+
*/
|
|
86
|
+
function snapEdges(draw) {
|
|
87
|
+
const t = draw.tmp;
|
|
88
|
+
if (t[1] !== 0 || t[2] !== 0)
|
|
89
|
+
return;
|
|
90
|
+
const x0 = Math.round(t[4]);
|
|
91
|
+
const y0 = Math.round(t[5]);
|
|
92
|
+
t[0] = Math.round(t[4] + t[0]) - x0;
|
|
93
|
+
t[3] = Math.round(t[5] + t[3]) - y0;
|
|
94
|
+
t[4] = x0;
|
|
95
|
+
t[5] = y0;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=panels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panels.js","sourceRoot":"","sources":["../src/panels.ts"],"names":[],"mappings":"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"}
|
package/dist/renderer.js
CHANGED
package/dist/renderer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAe5C;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,MAAyB,EAAE,OAAO,GAAoB,EAAE;IACrF,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;IACzC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,qGAAqG;QACrG,sGAAsG;QACtG,qFAAqF;QACrF,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE;YACrC,KAAK,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK;YACnC,SAAS,EAAE,KAAK;YAChB,kBAAkB,EAAE,IAAI;YACxB,eAAe,EAAE,kBAAkB;SACpC,CAAC,CAAC;QACH,IAAI,EAAE;YAAE,OAAO,IAAI,IAAI,CAAC,IAAI,aAAa,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;QACvE,IAAI,MAAM,KAAK,QAAQ;YACrB,MAAM,IAAI,KAAK,CAAC,+FAA+F,CAAC,CAAC;IACrH,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,sGAAsG,CAAC,CAAC;IAClI,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;IAC5D,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,EAClD,CAAC,KAAK,EAAE,EAAE;QACR,MAAM,IAAI,KAAK,CAAC,+CAA+C,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9E,CAAC,CACF,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,OAAO,CAAC,GAA6B;IAC5C,MAAM,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IACtB,OAAO;QACL,IAAI,EAAE,IAAI;QACV,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;QACxB,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI;QACb,GAAG,EAAE,IAAI;QACT,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,IAAI;QACnB,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAe5C;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,MAAyB,EAAE,OAAO,GAAoB,EAAE;IACrF,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;IACzC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,qGAAqG;QACrG,sGAAsG;QACtG,qFAAqF;QACrF,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE;YACrC,KAAK,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK;YACnC,SAAS,EAAE,KAAK;YAChB,kBAAkB,EAAE,IAAI;YACxB,eAAe,EAAE,kBAAkB;SACpC,CAAC,CAAC;QACH,IAAI,EAAE;YAAE,OAAO,IAAI,IAAI,CAAC,IAAI,aAAa,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;QACvE,IAAI,MAAM,KAAK,QAAQ;YACrB,MAAM,IAAI,KAAK,CAAC,+FAA+F,CAAC,CAAC;IACrH,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,sGAAsG,CAAC,CAAC;IAClI,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;IAC5D,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,EAClD,CAAC,KAAK,EAAE,EAAE;QACR,MAAM,IAAI,KAAK,CAAC,+CAA+C,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9E,CAAC,CACF,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,OAAO,CAAC,GAA6B;IAC5C,MAAM,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IACtB,OAAO;QACL,IAAI,EAAE,IAAI;QACV,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;QACxB,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI;QACb,GAAG,EAAE,IAAI;QACT,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,IAAI;QACnB,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
|