mesh-avatar 0.1.1 → 0.2.1
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 +7 -0
- package/dist/engine/sprites.d.ts +6 -2
- package/dist/index.js +1200 -1194
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -21,115 +21,115 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
21
21
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
22
|
SOFTWARE.
|
|
23
23
|
*/
|
|
24
|
-
const
|
|
24
|
+
const te = (n, e, t) => {
|
|
25
25
|
(typeof n != "number" || !Number.isFinite(n)) && t.push(`${e}: expected a finite number`);
|
|
26
26
|
}, Oe = (n, e, t) => {
|
|
27
|
-
|
|
27
|
+
te(n, e, t), typeof n == "number" && n <= 0 && t.push(`${e}: must be positive`);
|
|
28
28
|
}, xe = (n, e, t) => {
|
|
29
29
|
Oe(n, e, t), typeof n == "number" && !Number.isInteger(n) && t.push(`${e}: expected an integer`);
|
|
30
30
|
}, _e = (n, e, t) => {
|
|
31
|
-
|
|
31
|
+
te(n, e, t), typeof n == "number" && !Number.isInteger(n) && t.push(`${e}: expected an integer`);
|
|
32
32
|
}, kt = (n, e, t) => {
|
|
33
33
|
(typeof n != "string" || !n.trim()) && t.push(`${e}: expected a non-empty string`);
|
|
34
|
-
},
|
|
34
|
+
}, de = (n, e = 0, t = 1 / 0) => (r, a, s) => {
|
|
35
35
|
if (!Array.isArray(r)) {
|
|
36
36
|
s.push(`${a}: expected an array`);
|
|
37
37
|
return;
|
|
38
38
|
}
|
|
39
|
-
(r.length < e || r.length > t) && s.push(`${a}: expected ${e}..${t} items`), r.forEach((
|
|
40
|
-
},
|
|
41
|
-
|
|
42
|
-
},
|
|
39
|
+
(r.length < e || r.length > t) && s.push(`${a}: expected ${e}..${t} items`), r.forEach((l, m) => n(l, `${a}[${m}]`, s));
|
|
40
|
+
}, ge = de(te, 2, 2), ce = (n, e, t) => {
|
|
41
|
+
ge(n, e, t), Array.isArray(n) && n.length === 2 && n[0] >= n[1] && t.push(`${e}: start must be less than end`);
|
|
42
|
+
}, se = (n, e = []) => (t, r, a) => {
|
|
43
43
|
if (!t || typeof t != "object" || Array.isArray(t)) {
|
|
44
44
|
a.push(`${r}: expected an object`);
|
|
45
45
|
return;
|
|
46
46
|
}
|
|
47
47
|
const s = t;
|
|
48
|
-
for (const [
|
|
49
|
-
s[
|
|
50
|
-
}, Ne = { cx:
|
|
51
|
-
|
|
52
|
-
},
|
|
48
|
+
for (const [l, m] of Object.entries(n))
|
|
49
|
+
s[l] === void 0 && e.includes(l) || m(s[l], `${r}.${l}`, a);
|
|
50
|
+
}, Ne = { cx: te, cy: te, rx: Oe, ry: Oe }, ye = se(Ne), $e = de(ge, 3), _t = de(ge, 2), Ke = (n, e, t) => {
|
|
51
|
+
te(n, e, t), typeof n == "number" && (n < 0 || n > 1) && t.push(`${e}: must be between 0 and 1`);
|
|
52
|
+
}, pn = (n) => se({
|
|
53
53
|
version: (e, t, r) => {
|
|
54
54
|
e !== 1 && r.push(`${t}: only version 1 is supported`);
|
|
55
55
|
},
|
|
56
|
-
image:
|
|
57
|
-
head:
|
|
56
|
+
image: se({ width: xe, height: xe }),
|
|
57
|
+
head: se({
|
|
58
58
|
...Ne,
|
|
59
|
-
shiftX:
|
|
60
|
-
shiftY:
|
|
61
|
-
pivotX:
|
|
62
|
-
pivotY:
|
|
63
|
-
maxRoll:
|
|
64
|
-
weightBand:
|
|
65
|
-
turnBand:
|
|
59
|
+
shiftX: te,
|
|
60
|
+
shiftY: te,
|
|
61
|
+
pivotX: te,
|
|
62
|
+
pivotY: te,
|
|
63
|
+
maxRoll: te,
|
|
64
|
+
weightBand: ce,
|
|
65
|
+
turnBand: ce
|
|
66
66
|
}),
|
|
67
|
-
body:
|
|
68
|
-
pivotX:
|
|
69
|
-
pivotY:
|
|
70
|
-
maxRoll:
|
|
71
|
-
breathBand:
|
|
72
|
-
rollBand:
|
|
67
|
+
body: se({
|
|
68
|
+
pivotX: te,
|
|
69
|
+
pivotY: te,
|
|
70
|
+
maxRoll: te,
|
|
71
|
+
breathBand: ce,
|
|
72
|
+
rollBand: ce,
|
|
73
73
|
chest: ye,
|
|
74
|
-
shoulders:
|
|
74
|
+
shoulders: de(ye)
|
|
75
75
|
}),
|
|
76
|
-
face:
|
|
76
|
+
face: se({
|
|
77
77
|
nose: ye,
|
|
78
78
|
mouth: ye,
|
|
79
79
|
eyeA: ye,
|
|
80
80
|
eyeB: ye,
|
|
81
81
|
earL: ye,
|
|
82
82
|
earR: ye,
|
|
83
|
-
brow:
|
|
84
|
-
jaw:
|
|
83
|
+
brow: se({ ...Ne, band: ce }),
|
|
84
|
+
jaw: se({ ...Ne, band: ce })
|
|
85
85
|
}),
|
|
86
|
-
buns:
|
|
87
|
-
eyes:
|
|
86
|
+
buns: se({ bunL: ye, bunR: ye }, ["bunL", "bunR"]),
|
|
87
|
+
eyes: de(se({
|
|
88
88
|
opening: $e,
|
|
89
89
|
roi: $e,
|
|
90
|
-
x0:
|
|
91
|
-
x1:
|
|
92
|
-
top:
|
|
93
|
-
bot:
|
|
90
|
+
x0: te,
|
|
91
|
+
x1: te,
|
|
92
|
+
top: de(te, 24, 24),
|
|
93
|
+
bot: de(te, 24, 24)
|
|
94
94
|
}, n ? ["x0", "x1", "top", "bot"] : []), 2, 2),
|
|
95
|
-
mouth:
|
|
96
|
-
cx:
|
|
97
|
-
cy:
|
|
98
|
-
angle:
|
|
95
|
+
mouth: se({
|
|
96
|
+
cx: te,
|
|
97
|
+
cy: te,
|
|
98
|
+
angle: te,
|
|
99
99
|
halfLen: Oe,
|
|
100
|
-
bow:
|
|
101
|
-
area:
|
|
100
|
+
bow: te,
|
|
101
|
+
area: se({ ...Ne, angle: te })
|
|
102
102
|
}),
|
|
103
|
-
cheeks:
|
|
104
|
-
strands:
|
|
105
|
-
accessories:
|
|
103
|
+
cheeks: de(ge, 2, 2),
|
|
104
|
+
strands: de(se({ name: kt, nodes: _t, sigma: Oe, k: Oe, max: Oe })),
|
|
105
|
+
accessories: de(se({
|
|
106
106
|
name: kt,
|
|
107
|
-
pivot:
|
|
108
|
-
tip:
|
|
107
|
+
pivot: ge,
|
|
108
|
+
tip: ge,
|
|
109
109
|
split: Ke,
|
|
110
|
-
box:
|
|
111
|
-
color:
|
|
110
|
+
box: de(_e, 4, 4),
|
|
111
|
+
color: se({ redness: Ke, minRed: te })
|
|
112
112
|
})),
|
|
113
|
-
hand:
|
|
113
|
+
hand: se({
|
|
114
114
|
outline: $e,
|
|
115
115
|
jaw: _t,
|
|
116
|
-
jawRange:
|
|
116
|
+
jawRange: ce,
|
|
117
117
|
background: $e,
|
|
118
|
-
elbow:
|
|
119
|
-
wrist:
|
|
120
|
-
knuckle:
|
|
121
|
-
contact:
|
|
118
|
+
elbow: ge,
|
|
119
|
+
wrist: ge,
|
|
120
|
+
knuckle: ge,
|
|
121
|
+
contact: ge,
|
|
122
122
|
forearmShare: Ke,
|
|
123
|
-
armBand:
|
|
124
|
-
wristBand:
|
|
125
|
-
handBand:
|
|
126
|
-
fingerXBand:
|
|
127
|
-
fingerYBand:
|
|
128
|
-
pinBand:
|
|
123
|
+
armBand: ce,
|
|
124
|
+
wristBand: ce,
|
|
125
|
+
handBand: ce,
|
|
126
|
+
fingerXBand: ce,
|
|
127
|
+
fingerYBand: ce,
|
|
128
|
+
pinBand: ce
|
|
129
129
|
}),
|
|
130
|
-
mesh:
|
|
130
|
+
mesh: se({
|
|
131
131
|
baseCell: xe,
|
|
132
|
-
fine:
|
|
132
|
+
fine: se({
|
|
133
133
|
x0: _e,
|
|
134
134
|
x1: _e,
|
|
135
135
|
y0: _e,
|
|
@@ -142,30 +142,30 @@ const Q = (n, e, t) => {
|
|
|
142
142
|
eyeCell: xe,
|
|
143
143
|
spriteCell: xe
|
|
144
144
|
}),
|
|
145
|
-
view:
|
|
145
|
+
view: se({ padTop: te, padSide: te, gazeCenter: ge }, ["gazeCenter"])
|
|
146
146
|
}, ["buns", "strands", "accessories", "hand"]);
|
|
147
|
-
function
|
|
147
|
+
function Gt(n, e = {}) {
|
|
148
148
|
const t = [];
|
|
149
|
-
if (
|
|
149
|
+
if (pn(e.draft ?? !1)(n, "rig", t), t.length) return t;
|
|
150
150
|
const r = n;
|
|
151
151
|
r.eyes.forEach((a, s) => {
|
|
152
|
-
const
|
|
153
|
-
if (!(e.draft &&
|
|
154
|
-
if (
|
|
152
|
+
const l = ["x0", "x1", "top", "bot"];
|
|
153
|
+
if (!(e.draft && l.every((m) => a[m] === void 0))) {
|
|
154
|
+
if (l.some((m) => a[m] === void 0)) {
|
|
155
155
|
t.push(`rig.eyes[${s}]: supply all x0/x1/top/bot fields or omit all in a draft`);
|
|
156
156
|
return;
|
|
157
157
|
}
|
|
158
|
-
a.x0 >= a.x1 && t.push(`rig.eyes[${s}].x1: must exceed x0`), a.top.some((
|
|
158
|
+
a.x0 >= a.x1 && t.push(`rig.eyes[${s}].x1: must exceed x0`), a.top.some((m, b) => m > a.bot[b]) && t.push(`rig.eyes[${s}].top: must not exceed bottom curve`);
|
|
159
159
|
}
|
|
160
160
|
}), (r.mesh.fine.x0 >= r.mesh.fine.x1 || r.mesh.fine.y0 >= r.mesh.fine.y1) && t.push("rig.mesh.fine: rectangle must have positive area"), (r.view.padTop <= -1 || r.view.padTop >= 1 || r.view.padSide <= -0.5) && t.push("rig.view: margins must leave a positive viewport");
|
|
161
161
|
for (const [a, s] of (r.strands ?? []).entries())
|
|
162
|
-
s.nodes.some((
|
|
162
|
+
s.nodes.some((l, m) => m > 0 && l[0] === s.nodes[m - 1][0] && l[1] === s.nodes[m - 1][1]) && t.push(`rig.strands[${a}].nodes: consecutive nodes must differ`);
|
|
163
163
|
for (const [a, s] of (r.accessories ?? []).entries())
|
|
164
|
-
(s.box[0] < 0 || s.box[1] < 0 || s.box[2] > r.image.width || s.box[3] > r.image.height) && t.push(`rig.accessories[${a}].box: rectangle must stay inside the image`), (s.split <= 0 || s.split >= 1) && t.push(`rig.accessories[${a}].split: must be strictly between 0 and 1`), s.pivot.every((
|
|
164
|
+
(s.box[0] < 0 || s.box[1] < 0 || s.box[2] > r.image.width || s.box[3] > r.image.height) && t.push(`rig.accessories[${a}].box: rectangle must stay inside the image`), (s.split <= 0 || s.split >= 1) && t.push(`rig.accessories[${a}].split: must be strictly between 0 and 1`), s.pivot.every((l, m) => l === s.tip[m]) && t.push(`rig.accessories[${a}].tip: must differ from pivot`), (s.box[0] >= s.box[2] || s.box[1] >= s.box[3]) && t.push(`rig.accessories[${a}].box: rectangle must have positive area`);
|
|
165
165
|
return t;
|
|
166
166
|
}
|
|
167
167
|
function bt(n) {
|
|
168
|
-
const e =
|
|
168
|
+
const e = Gt(n);
|
|
169
169
|
if (e.length) throw new Error(`Invalid rig:
|
|
170
170
|
${e.join(`
|
|
171
171
|
`)}`);
|
|
@@ -192,183 +192,183 @@ const De = [
|
|
|
192
192
|
{ id: "handAngle", label: "Wrist angle", min: -10, max: 10, def: 0, group: "Hand" },
|
|
193
193
|
{ id: "fingerTap", label: "Finger tap", min: 0, max: 1, def: 0, group: "Hand" }
|
|
194
194
|
];
|
|
195
|
-
function
|
|
196
|
-
const e = { w: n.image.width, h: n.image.height }, t = (
|
|
197
|
-
function s(
|
|
198
|
-
const
|
|
199
|
-
return
|
|
200
|
-
}
|
|
201
|
-
function
|
|
202
|
-
|
|
203
|
-
const N = s(
|
|
204
|
-
return [(
|
|
205
|
-
}
|
|
206
|
-
const
|
|
207
|
-
function
|
|
208
|
-
let N = 0,
|
|
209
|
-
for (const [R,
|
|
210
|
-
const [
|
|
211
|
-
N +=
|
|
212
|
-
}
|
|
213
|
-
const
|
|
214
|
-
return { top:
|
|
215
|
-
}
|
|
216
|
-
function
|
|
217
|
-
const
|
|
218
|
-
return
|
|
219
|
-
}
|
|
220
|
-
function
|
|
221
|
-
const
|
|
222
|
-
return
|
|
223
|
-
}
|
|
224
|
-
const u = n.mouth, S = n.cheeks,
|
|
225
|
-
const
|
|
226
|
-
return
|
|
195
|
+
function dn(n) {
|
|
196
|
+
const e = { w: n.image.width, h: n.image.height }, t = (g, A, E) => E ? Math.exp(-(((g - E.cx) / E.rx) ** 2 + ((A - E.cy) / E.ry) ** 2)) : 0, r = 24, a = n.eyes;
|
|
197
|
+
function s(g, A) {
|
|
198
|
+
const E = Math.min(1, Math.max(0, A)) * (r - 1), k = Math.min(Math.floor(E), r - 2), N = E - k;
|
|
199
|
+
return g[k] + (g[k + 1] - g[k]) * N;
|
|
200
|
+
}
|
|
201
|
+
function l(g, A, E, k) {
|
|
202
|
+
A = Math.min(1, Math.max(0, A));
|
|
203
|
+
const N = s(g.top, A), z = s(g.bot, A), F = 1 - E, j = 4 * A * (1 - A), M = s(g.bot, 0.5) - s(g.top, 0.5), R = g.top[0] + (g.top[r - 1] - g.top[0]) * A - 0.3 * M * j, W = Math.max(N, z + 1 + (R - z - 1) * k);
|
|
204
|
+
return [(W - N) * Math.max(F, -0.07), F > 0 ? (W - z) * F * k : 0];
|
|
205
|
+
}
|
|
206
|
+
const m = [[-2, 1], [-1, 2], [0, 3], [1, 2], [2, 1]], b = 5;
|
|
207
|
+
function d(g, A, E, k) {
|
|
208
|
+
let N = 0, z = 0;
|
|
209
|
+
for (const [R, W] of m) {
|
|
210
|
+
const [Q, ne] = l(g, (A + R * b - g.x0) / (g.x1 - g.x0), E, k);
|
|
211
|
+
N += Q * W / 9, z += ne * W / 9;
|
|
212
|
+
}
|
|
213
|
+
const F = Math.min(1, Math.max(0, (A - g.x0) / (g.x1 - g.x0))), j = s(g.top, F), M = s(g.bot, F);
|
|
214
|
+
return { top: j, bot: M, b: 1 - E, lid: j + N, bc: M + z };
|
|
215
|
+
}
|
|
216
|
+
function p(g, A, E, k, N, z) {
|
|
217
|
+
const F = d(g, E, N, z);
|
|
218
|
+
return A === "lash" ? F.lid - (F.top - k) * (1 - 0.3 * Math.min(1, Math.max(0, F.b))) : A === "low" ? k + (F.bc - F.bot) : A === "crease" ? k + (F.lid - F.top) * 0.22 : k;
|
|
219
|
+
}
|
|
220
|
+
function i(g, A, E) {
|
|
221
|
+
const k = Math.min(1, Math.max(0, 1 - A));
|
|
222
|
+
return g === "low" ? 1 - Math.min(1, k * E * 1.2) : g === "crease" ? 1 - 0.45 * k : 1;
|
|
223
|
+
}
|
|
224
|
+
const u = n.mouth, S = n.cheeks, y = n.head, c = n.body, v = (g, A, E) => {
|
|
225
|
+
const k = Math.min(1, Math.max(0, (E - g) / (A - g)));
|
|
226
|
+
return k * k * (3 - 2 * k);
|
|
227
227
|
};
|
|
228
|
-
function x(
|
|
229
|
-
return 1 -
|
|
228
|
+
function x(g, A) {
|
|
229
|
+
return 1 - v(...y.weightBand, A);
|
|
230
230
|
}
|
|
231
|
-
function o(
|
|
232
|
-
return 1 -
|
|
231
|
+
function o(g, A) {
|
|
232
|
+
return 1 - v(...y.turnBand, A);
|
|
233
233
|
}
|
|
234
|
-
const
|
|
235
|
-
function
|
|
236
|
-
let
|
|
237
|
-
const
|
|
238
|
-
for (let
|
|
239
|
-
const [
|
|
240
|
-
|
|
234
|
+
const h = n.strands ?? [];
|
|
235
|
+
function T(g, A, E) {
|
|
236
|
+
let k = 1 / 0, N = 0;
|
|
237
|
+
const z = E.length - 1;
|
|
238
|
+
for (let F = 0; F < z; F++) {
|
|
239
|
+
const [j, M] = E[F], [R, W] = E[F + 1], Q = R - j, ne = W - M, ee = Math.min(1, Math.max(0, ((g - j) * Q + (A - M) * ne) / (Q * Q + ne * ne))), he = Math.hypot(g - j - Q * ee, A - M - ne * ee);
|
|
240
|
+
he < k && (k = he, N = (F + ee) / z);
|
|
241
241
|
}
|
|
242
|
-
return [
|
|
242
|
+
return [k, N];
|
|
243
243
|
}
|
|
244
|
-
function
|
|
245
|
-
if (
|
|
246
|
-
const
|
|
244
|
+
function f(g, A, E) {
|
|
245
|
+
if (E < 0.02) return [];
|
|
246
|
+
const k = [];
|
|
247
247
|
let N = 0;
|
|
248
|
-
|
|
249
|
-
const [M, R] =
|
|
250
|
-
|
|
248
|
+
h.forEach((F, j) => {
|
|
249
|
+
const [M, R] = T(g, A, F.nodes), W = Math.exp(-((M / F.sigma) ** 2));
|
|
250
|
+
W < 0.02 || (k.push([j, W, R]), N += W);
|
|
251
251
|
});
|
|
252
|
-
const
|
|
253
|
-
return
|
|
252
|
+
const z = Math.max(1, N);
|
|
253
|
+
return k.map(([F, j, M]) => [F, E * j / z * v(0.04, 0.55, M), M]);
|
|
254
254
|
}
|
|
255
|
-
function
|
|
255
|
+
function w(g, A, E = 1) {
|
|
256
256
|
return {
|
|
257
|
-
head: x(
|
|
258
|
-
turn: o(
|
|
259
|
-
strands:
|
|
260
|
-
bunL: t(
|
|
261
|
-
bunR: t(
|
|
262
|
-
brow: t(
|
|
257
|
+
head: x(g, A),
|
|
258
|
+
turn: o(g, A),
|
|
259
|
+
strands: f(g, A, E),
|
|
260
|
+
bunL: t(g, A, n.buns?.bunL),
|
|
261
|
+
bunR: t(g, A, n.buns?.bunR),
|
|
262
|
+
brow: t(g, A, n.face.brow) * (1 - v(...n.face.brow.band, A)),
|
|
263
263
|
// chin below the mouth line drops a little when the mouth opens
|
|
264
|
-
jaw: t(
|
|
264
|
+
jaw: t(g, A, n.face.jaw) * v(...n.face.jaw.band, A),
|
|
265
265
|
// per-feature depth for head turns (nose sticks out most, ears sit at the back)
|
|
266
|
-
nose: t(
|
|
267
|
-
mouth: t(
|
|
268
|
-
eyeA: t(
|
|
269
|
-
eyeB: t(
|
|
270
|
-
earR: t(
|
|
271
|
-
earL: t(
|
|
272
|
-
chest: t(
|
|
273
|
-
breath: 1 -
|
|
274
|
-
shoulder: c.shoulders.reduce((
|
|
266
|
+
nose: t(g, A, n.face.nose),
|
|
267
|
+
mouth: t(g, A, n.face.mouth),
|
|
268
|
+
eyeA: t(g, A, n.face.eyeA),
|
|
269
|
+
eyeB: t(g, A, n.face.eyeB),
|
|
270
|
+
earR: t(g, A, n.face.earR),
|
|
271
|
+
earL: t(g, A, n.face.earL),
|
|
272
|
+
chest: t(g, A, c.chest),
|
|
273
|
+
breath: 1 - v(...c.breathBand, A),
|
|
274
|
+
shoulder: c.shoulders.reduce((k, N) => k + t(g, A, N), 0)
|
|
275
275
|
};
|
|
276
276
|
}
|
|
277
|
-
function
|
|
278
|
-
const N = (
|
|
279
|
-
if (
|
|
280
|
-
const
|
|
281
|
-
return [
|
|
282
|
-
}
|
|
283
|
-
function
|
|
284
|
-
const N = Math.cos(
|
|
285
|
-
|
|
286
|
-
}
|
|
287
|
-
function
|
|
288
|
-
const N =
|
|
289
|
-
|
|
290
|
-
}
|
|
291
|
-
function
|
|
292
|
-
const
|
|
293
|
-
|
|
294
|
-
}
|
|
295
|
-
function
|
|
296
|
-
const
|
|
297
|
-
|
|
298
|
-
const
|
|
299
|
-
for (const [
|
|
300
|
-
const
|
|
301
|
-
if (!
|
|
302
|
-
const
|
|
303
|
-
|
|
304
|
-
}
|
|
305
|
-
if (
|
|
306
|
-
const
|
|
307
|
-
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
const M =
|
|
311
|
-
return
|
|
312
|
-
}
|
|
313
|
-
const O = n.hand,
|
|
314
|
-
function
|
|
277
|
+
function B(g, A, E, k) {
|
|
278
|
+
const N = (g - y.cx) / y.rx, z = (A - y.cy) / y.ry, F = 1 - N * N - z * z;
|
|
279
|
+
if (F <= 0) return [0, 0];
|
|
280
|
+
const j = v(0, 0.84, F);
|
|
281
|
+
return [E * y.shiftX * j, -k * y.shiftY * j];
|
|
282
|
+
}
|
|
283
|
+
function Y(g, A, E, k) {
|
|
284
|
+
const N = Math.cos(k), z = Math.sin(k), F = g[0] - A, j = g[1] - E;
|
|
285
|
+
g[0] = A + F * N - j * z, g[1] = E + F * z + j * N;
|
|
286
|
+
}
|
|
287
|
+
function I(g, A, E, k = A) {
|
|
288
|
+
const N = B(g[0], g[1], E.angleX / 30, E.angleY / 30);
|
|
289
|
+
g[0] += N[0] * k, g[1] += N[1] * k, !(A <= 0) && Y(g, y.pivotX, y.pivotY, -E.angleZ / 30 * y.maxRoll * A);
|
|
290
|
+
}
|
|
291
|
+
function _(g, A, E, k = 0, N = 1, z = 0) {
|
|
292
|
+
const F = E.breath;
|
|
293
|
+
g[1] -= F * (5 * N + 4 * z), g[0] += (g[0] - c.chest.cx) * 0.012 * F * k, g[0] += E.bodyAngleX / 10 * (7 + 9 * k), Y(g, c.pivotX, c.pivotY, -E.bodyAngleZ / 10 * c.maxRoll * (1 - v(...c.rollBand, A)));
|
|
294
|
+
}
|
|
295
|
+
function U(g, A, E, k, N, z) {
|
|
296
|
+
const F = z;
|
|
297
|
+
F[0] = g, F[1] = A;
|
|
298
|
+
const j = N.gain;
|
|
299
|
+
for (const [W, Q, ne] of E.strands) {
|
|
300
|
+
const ee = N.strands?.[W];
|
|
301
|
+
if (!ee) continue;
|
|
302
|
+
const he = ne * 3, oe = Math.min(2, Math.floor(he)), ke = he - oe;
|
|
303
|
+
F[0] += (ee[oe][0] + (ee[oe + 1][0] - ee[oe][0]) * ke) * Q * j, F[1] += (ee[oe][1] + (ee[oe + 1][1] - ee[oe][1]) * ke) * Q * j;
|
|
304
|
+
}
|
|
305
|
+
if (F[0] += (N.bunL[0] * E.bunL + N.bunR[0] * E.bunR) * j, F[1] += (N.bunL[1] * E.bunL + N.bunR[1] * E.bunR) * j, F[1] -= k.browY * 7 * E.brow, E.brow > 0.01) {
|
|
306
|
+
const W = k.browAngle * 0.12 * E.brow;
|
|
307
|
+
F[1] += (g - n.face.brow.cx) * Math.sin(W);
|
|
308
|
+
}
|
|
309
|
+
F[1] += k.mouthOpen * 3.5 * E.jaw;
|
|
310
|
+
const M = k.angleX / 30, R = k.angleY / 30;
|
|
311
|
+
return F[0] += M * (8 * E.nose + 5 * E.mouth) + (g - n.face.eyeA.cx) * 0.12 * M * E.eyeA - (g - n.face.eyeB.cx) * 0.12 * M * E.eyeB - M * 9 * E.earR + M * 4 * E.earL - M * 10 * (E.bunL + E.bunR), F[1] -= R * (6 * E.nose + 3 * E.mouth), F[1] += (A - n.face.eyeA.cy) * -0.06 * Math.abs(R) * E.eyeA + (A - n.face.eyeB.cy) * -0.06 * Math.abs(R) * E.eyeB, I(F, E.head, k, E.turn), _(F, A, k, E.chest, E.breath, E.shoulder), F;
|
|
312
|
+
}
|
|
313
|
+
const O = n.hand, C = O?.elbow ?? [0, 0], $ = O?.wrist ?? [0, 0], V = O?.knuckle ?? [0, 0], X = O?.contact ?? [0, 0], D = O?.forearmShare ?? 0;
|
|
314
|
+
function H(g, A) {
|
|
315
315
|
return O ? {
|
|
316
|
-
arm: 1 -
|
|
317
|
-
wrist: 1 -
|
|
318
|
-
hand: 1 -
|
|
319
|
-
finger:
|
|
320
|
-
pinBottom:
|
|
316
|
+
arm: 1 - v(...O.armBand, A),
|
|
317
|
+
wrist: 1 - v(...O.wristBand, A),
|
|
318
|
+
hand: 1 - v(...O.handBand, A),
|
|
319
|
+
finger: v(...O.fingerXBand, g) * (1 - v(...O.fingerYBand, A)),
|
|
320
|
+
pinBottom: v(...O.pinBand, A)
|
|
321
321
|
} : { arm: 0, wrist: 0, hand: 0, finger: 0, pinBottom: 0 };
|
|
322
322
|
}
|
|
323
|
-
const
|
|
324
|
-
const N =
|
|
325
|
-
return [
|
|
326
|
-
}, Z = (
|
|
327
|
-
function P(
|
|
328
|
-
const
|
|
329
|
-
|
|
330
|
-
const
|
|
331
|
-
|
|
332
|
-
const N = (Z([
|
|
333
|
-
const
|
|
334
|
-
return [
|
|
335
|
-
}, M =
|
|
336
|
-
return { tr:
|
|
337
|
-
}
|
|
338
|
-
function
|
|
339
|
-
let
|
|
340
|
-
|
|
341
|
-
const
|
|
342
|
-
|
|
343
|
-
const R = N.b *
|
|
344
|
-
return
|
|
345
|
-
}
|
|
346
|
-
const
|
|
347
|
-
function
|
|
348
|
-
const N =
|
|
349
|
-
return
|
|
350
|
-
}
|
|
351
|
-
return { IMG: e, EYES: a, MOUTH: u, CHEEKS: S, STRANDS:
|
|
323
|
+
const L = (g, A, E, k) => {
|
|
324
|
+
const N = g[0] - A[0], z = g[1] - A[1];
|
|
325
|
+
return [A[0] + N * E - z * k, A[1] + N * k + z * E];
|
|
326
|
+
}, Z = (g) => Math.atan2(g[1], g[0]);
|
|
327
|
+
function P(g) {
|
|
328
|
+
const A = [...X];
|
|
329
|
+
I(A, x(...X), g, o(...X)), _(A, X[1], g, 0, 1, 0);
|
|
330
|
+
const E = [...C];
|
|
331
|
+
_(E, C[1], g, 0, 0, 0);
|
|
332
|
+
const N = (Z([A[0] - E[0], A[1] - E[1]]) - Z([X[0] - C[0], X[1] - C[1]])) * D, z = Math.cos(N), F = Math.sin(N), j = (ne) => {
|
|
333
|
+
const ee = L(ne, C, z, F);
|
|
334
|
+
return [ee[0] + E[0] - C[0], ee[1] + E[1] - C[1]];
|
|
335
|
+
}, M = j($), R = j(X), W = Z([A[0] - M[0], A[1] - M[1]]) - Z([R[0] - M[0], R[1] - M[1]]), Q = Math.min(1.03, Math.max(0.97, Math.hypot(A[0] - M[0], A[1] - M[1]) / Math.hypot(R[0] - M[0], R[1] - M[1])));
|
|
336
|
+
return { tr: j, w: M, b: W, k: Q };
|
|
337
|
+
}
|
|
338
|
+
function G(g, A, E, k, N, z) {
|
|
339
|
+
let F = [g, A];
|
|
340
|
+
F = L(F, V, Math.cos(k.fingerTap * 0.07 * E.finger), Math.sin(k.fingerTap * 0.07 * E.finger));
|
|
341
|
+
const j = -k.handAngle / 10 * 0.045 * E.wrist, M = -k.armAngle / 10 * 0.015 * E.arm;
|
|
342
|
+
F = L(F, $, Math.cos(j), Math.sin(j)), F = L(F, C, Math.cos(M), Math.sin(M)), F = N.tr(F);
|
|
343
|
+
const R = N.b * E.hand, W = 1 + (N.k - 1) * E.hand;
|
|
344
|
+
return F = L(F, N.w, Math.cos(R) * W, Math.sin(R) * W), F[1] += (A - F[1]) * E.pinBottom, z[0] = F[0], z[1] = F[1], z;
|
|
345
|
+
}
|
|
346
|
+
const J = n.accessories ?? [];
|
|
347
|
+
function q(g, A, E, k) {
|
|
348
|
+
const N = w(g.pivot[0], g.pivot[1]);
|
|
349
|
+
return U(g.pivot[0], g.pivot[1], N, A, E, k);
|
|
350
|
+
}
|
|
351
|
+
return { IMG: e, EYES: a, MOUTH: u, CHEEKS: S, STRANDS: h, TASSELS: J, headWeight: x, turnWeight: o, baseWeights: w, deformBase: U, applyHead: I, applyBody: _, handWeights: H, handFrame: P, deformHand: G, eyePartY: p, eyePartAlpha: i, tasselAnchor: q };
|
|
352
352
|
}
|
|
353
|
-
function
|
|
354
|
-
const a = r ? Math.max(e, t) * 2 : 1, s = new Float32Array(n.length),
|
|
355
|
-
for (let
|
|
356
|
-
const
|
|
357
|
-
n[
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
353
|
+
function gn(n, e, t, r = !1) {
|
|
354
|
+
const a = r ? Math.max(e, t) * 2 : 1, s = new Float32Array(n.length), l = Math.SQRT2;
|
|
355
|
+
for (let m = 0; m < t; m++) for (let b = 0; b < e; b++) {
|
|
356
|
+
const d = m * e + b;
|
|
357
|
+
n[d] <= 3 || (s[d] = Math.min(
|
|
358
|
+
b ? s[d - 1] + 1 : a,
|
|
359
|
+
m ? s[d - e] + 1 : a,
|
|
360
|
+
b && m ? s[d - e - 1] + l : a,
|
|
361
|
+
m && b + 1 < e ? s[d - e + 1] + l : a
|
|
362
362
|
));
|
|
363
363
|
}
|
|
364
|
-
for (let
|
|
365
|
-
const
|
|
366
|
-
!n[
|
|
367
|
-
s[
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
364
|
+
for (let m = t - 1; m >= 0; m--) for (let b = e - 1; b >= 0; b--) {
|
|
365
|
+
const d = m * e + b;
|
|
366
|
+
!n[d] || n[d] <= 3 || (s[d] = Math.min(
|
|
367
|
+
s[d],
|
|
368
|
+
b + 1 < e ? s[d + 1] + 1 : a,
|
|
369
|
+
m + 1 < t ? s[d + e] + 1 : a,
|
|
370
|
+
b && m + 1 < t ? s[d + e - 1] + l : a,
|
|
371
|
+
b + 1 < e && m + 1 < t ? s[d + e + 1] + l : a
|
|
372
372
|
));
|
|
373
373
|
}
|
|
374
374
|
return s;
|
|
@@ -376,67 +376,67 @@ function dn(n, e, t, r = !1) {
|
|
|
376
376
|
function Qe(n, e, t) {
|
|
377
377
|
return Math.exp(-(((n - t.cx) / t.rx) ** 2 + ((e - t.cy) / t.ry) ** 2));
|
|
378
378
|
}
|
|
379
|
-
function
|
|
379
|
+
function yn(n, e, t) {
|
|
380
380
|
const r = ((n - t.head.cx) / t.head.rx) ** 2 + ((e - t.head.cy) / t.head.ry) ** 2;
|
|
381
381
|
let a = t.head.rx * 0.8 * Math.sqrt(Math.max(0, 1 - r)) + t.body.chest.rx * 0.23 * Qe(n, e, t.body.chest);
|
|
382
382
|
a += t.face.nose.rx * 0.2 * Qe(n, e, t.face.nose);
|
|
383
|
-
for (const [s,
|
|
383
|
+
for (const [s, l] of t.cheeks) a += t.head.rx * 0.012 * Qe(n, e, { cx: s, cy: l, rx: t.head.rx * 0.3, ry: t.head.ry * 0.16 });
|
|
384
384
|
return a;
|
|
385
385
|
}
|
|
386
386
|
function Ge(n, e, t, r) {
|
|
387
|
-
const a = new Float32Array(n.length), s = new Float32Array(n.length),
|
|
388
|
-
for (let S = 0; S <
|
|
389
|
-
const
|
|
390
|
-
let c = 0,
|
|
391
|
-
for (let x = 0; x < Math.min(r,
|
|
392
|
-
c +=
|
|
393
|
-
for (let x = 0; x <
|
|
394
|
-
|
|
395
|
-
const o = x + r + 1,
|
|
396
|
-
o <
|
|
387
|
+
const a = new Float32Array(n.length), s = new Float32Array(n.length), l = (m, b, d, p, i, u) => {
|
|
388
|
+
for (let S = 0; S < p; S++) {
|
|
389
|
+
const y = S * u;
|
|
390
|
+
let c = 0, v = 0;
|
|
391
|
+
for (let x = 0; x < Math.min(r, d - 1) + 1; x++)
|
|
392
|
+
c += m[y + x * i], v++;
|
|
393
|
+
for (let x = 0; x < d; x++) {
|
|
394
|
+
b[y + x * i] = c / v;
|
|
395
|
+
const o = x + r + 1, h = x - r;
|
|
396
|
+
o < d && (c += m[y + o * i], v++), h >= 0 && (c -= m[y + h * i], v--);
|
|
397
397
|
}
|
|
398
398
|
}
|
|
399
399
|
};
|
|
400
|
-
return
|
|
400
|
+
return l(n, a, e, t, 1, e), l(a, s, t, e, e, 1), s;
|
|
401
401
|
}
|
|
402
|
-
function
|
|
403
|
-
const a = Ge(n, t, r, 1), s = Ge(n, t, r, 6),
|
|
404
|
-
for (let
|
|
405
|
-
const
|
|
406
|
-
for (let
|
|
407
|
-
const
|
|
408
|
-
e[
|
|
409
|
-
}
|
|
410
|
-
return
|
|
402
|
+
function vn(n, e, t, r) {
|
|
403
|
+
const a = Ge(n, t, r, 1), s = Ge(n, t, r, 6), l = new Float32Array(n.length);
|
|
404
|
+
for (let d = 0; d < l.length; d++) l[d] = e[d] > 128 ? a[d] - s[d] : 0;
|
|
405
|
+
const m = new Float32Array(n.length * 2), b = (d, p) => l[Math.max(0, Math.min(r - 1, p)) * t + Math.max(0, Math.min(t - 1, d))];
|
|
406
|
+
for (let d = 0; d < r; d++) for (let p = 0; p < t; p++) {
|
|
407
|
+
const i = d * t + p;
|
|
408
|
+
e[i] <= 128 || (m[2 * i] = Math.max(-1, Math.min(1, -(b(p + 1, d) - b(p - 1, d)) * 4)), m[2 * i + 1] = Math.max(-1, Math.min(1, -(b(p, d + 1) - b(p, d - 1)) * 4)));
|
|
409
|
+
}
|
|
410
|
+
return m;
|
|
411
411
|
}
|
|
412
|
-
function
|
|
413
|
-
const
|
|
414
|
-
for (let o = 0; o < t; o++) for (let
|
|
415
|
-
const
|
|
416
|
-
|
|
417
|
-
}
|
|
418
|
-
const
|
|
419
|
-
|
|
420
|
-
const c =
|
|
421
|
-
for (let o = 0; o < t; o++) for (let
|
|
422
|
-
const
|
|
423
|
-
|
|
424
|
-
}
|
|
425
|
-
return
|
|
412
|
+
function bn(n, e, t, r, a, s = !0, l) {
|
|
413
|
+
const m = !!a && r[0] === 0 && r[1] === 0 && r[2] === a.image.width && r[3] === a.image.height, b = gn(n, e, t, m), d = new Float32Array(n.length), p = r[2] / e, i = r[3] / t, u = Math.min(p, i), S = Math.min(r[2], r[3]) * 0.08;
|
|
414
|
+
for (let o = 0; o < t; o++) for (let h = 0; h < e; h++) {
|
|
415
|
+
const T = o * e + h;
|
|
416
|
+
d[T] = (s ? Math.sqrt(b[T] * u * S) * 0.55 : 0) + (a ? yn(r[0] + (h + 0.5) * p, r[1] + (o + 0.5) * i, a) : 0);
|
|
417
|
+
}
|
|
418
|
+
const y = Math.max(1, Math.round(Math.min(e, t) * 0.02));
|
|
419
|
+
d.set(Ge(Ge(d, e, t, y), e, t, y));
|
|
420
|
+
const c = l ? vn(l, n, e, t) : null, v = new Uint8Array(e * t * 4), x = (o, h) => d[Math.max(0, Math.min(t - 1, h)) * e + Math.max(0, Math.min(e - 1, o))];
|
|
421
|
+
for (let o = 0; o < t; o++) for (let h = 0; h < e; h++) {
|
|
422
|
+
const T = -(x(h + 2, o) - x(h - 2, o)) / (4 * p), f = -(x(h, o + 2) - x(h, o - 2)) / (4 * i), w = Math.hypot(T, f, 1), B = (o * e + h) * 4, Y = o * e + h;
|
|
423
|
+
v[B] = Math.round((T / w * 0.5 + 0.5) * 255), v[B + 1] = Math.round((f / w * 0.5 + 0.5) * 255), v[B + 2] = Math.round(((c?.[2 * Y] ?? 0) * 0.5 + 0.5) * 255), v[B + 3] = Math.round(((c?.[2 * Y + 1] ?? 0) * 0.5 + 0.5) * 255);
|
|
424
|
+
}
|
|
425
|
+
return v;
|
|
426
426
|
}
|
|
427
427
|
const Ft = /* @__PURE__ */ new WeakMap();
|
|
428
|
-
function
|
|
428
|
+
function xn(n, e, t, r) {
|
|
429
429
|
const a = JSON.stringify([e, t.head, t.body.chest, t.face.nose, t.cheeks, r]), s = Ft.get(n);
|
|
430
430
|
if (s?.key === a) return { ...s, computed: !1, ms: 0 };
|
|
431
|
-
const
|
|
432
|
-
|
|
433
|
-
const
|
|
434
|
-
|
|
435
|
-
const u =
|
|
436
|
-
for (let
|
|
437
|
-
S[
|
|
438
|
-
const c = { key: a, data:
|
|
439
|
-
return Ft.set(n, c), { ...c, computed: !0, ms: performance.now() -
|
|
431
|
+
const l = performance.now(), m = Math.min(1, 512 / Math.max(n.width, n.height)), b = Math.max(1, Math.round(n.width * m)), d = Math.max(1, Math.round(n.height * m)), p = document.createElement("canvas");
|
|
432
|
+
p.width = b, p.height = d;
|
|
433
|
+
const i = p.getContext("2d", { willReadFrequently: !0 });
|
|
434
|
+
i.drawImage(n, 0, 0, b, d);
|
|
435
|
+
const u = i.getImageData(0, 0, b, d).data, S = new Uint8Array(b * d), y = new Float32Array(b * d);
|
|
436
|
+
for (let v = 0; v < S.length; v++)
|
|
437
|
+
S[v] = u[4 * v + 3], y[v] = (0.2126 * u[4 * v] + 0.7152 * u[4 * v + 1] + 0.0722 * u[4 * v + 2]) / 255;
|
|
438
|
+
const c = { key: a, data: bn(S, b, d, e, t, r, r ? y : void 0), width: b, height: d };
|
|
439
|
+
return Ft.set(n, c), { ...c, computed: !0, ms: performance.now() - l };
|
|
440
440
|
}
|
|
441
441
|
const Re = Object.freeze({
|
|
442
442
|
enabled: !1,
|
|
@@ -469,41 +469,41 @@ const Re = Object.freeze({
|
|
|
469
469
|
specular: [0, 1],
|
|
470
470
|
rim: [0, 1],
|
|
471
471
|
detail: [0, 1]
|
|
472
|
-
},
|
|
473
|
-
function
|
|
472
|
+
}, wn = /* @__PURE__ */ new Set(["color", "ambientColor"]);
|
|
473
|
+
function An(n) {
|
|
474
474
|
if (!n || typeof n != "object" || Array.isArray(n)) return null;
|
|
475
475
|
const e = n;
|
|
476
476
|
if (Object.keys(e).length !== Object.keys(Re).length || Object.keys(e).some((r) => !(r in Re)) || ![!0, !1].includes(e.enabled) || ![!0, !1].includes(e.shadow) || !["soft", "cel"].includes(e.mode)) return null;
|
|
477
477
|
const t = { ...Re, enabled: e.enabled, shadow: e.shadow, mode: e.mode };
|
|
478
478
|
for (const r of Object.keys(Bt)) {
|
|
479
|
-
const a = e[r], [s,
|
|
480
|
-
if (typeof a != "number" || !Number.isFinite(a) ||
|
|
481
|
-
t[r] = Math.max(s, Math.min(
|
|
479
|
+
const a = e[r], [s, l] = Bt[r];
|
|
480
|
+
if (typeof a != "number" || !Number.isFinite(a) || wn.has(r) && !Number.isInteger(a)) return null;
|
|
481
|
+
t[r] = Math.max(s, Math.min(l, a));
|
|
482
482
|
}
|
|
483
483
|
return t;
|
|
484
484
|
}
|
|
485
|
-
function
|
|
485
|
+
function Sr(n) {
|
|
486
486
|
return `#${n.toString(16).padStart(6, "0")}`;
|
|
487
487
|
}
|
|
488
|
-
const He = -0.1,
|
|
489
|
-
function
|
|
488
|
+
const He = -0.1, Mn = 0.9, En = 1, Sn = 1.06;
|
|
489
|
+
function Tn(n, e) {
|
|
490
490
|
return [(0.5 - n) * 0.12, (0.5 - e) * 0.12];
|
|
491
491
|
}
|
|
492
|
-
function
|
|
493
|
-
const a = n * Math.PI / 180, s = e * Math.PI / 180,
|
|
492
|
+
function On(n, e, t, r) {
|
|
493
|
+
const a = n * Math.PI / 180, s = e * Math.PI / 180, l = -t / 30 * r, m = Math.cos(a), b = Math.sin(a), d = Math.cos(s), p = Math.sin(s), i = Math.cos(l), u = Math.sin(l);
|
|
494
494
|
return [
|
|
495
|
-
|
|
496
|
-
u *
|
|
497
|
-
-
|
|
498
|
-
|
|
499
|
-
u *
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
u *
|
|
503
|
-
|
|
495
|
+
i * m,
|
|
496
|
+
u * m,
|
|
497
|
+
-b,
|
|
498
|
+
i * b * p - u * d,
|
|
499
|
+
u * b * p + i * d,
|
|
500
|
+
m * p,
|
|
501
|
+
i * b * d + u * p,
|
|
502
|
+
u * b * d - i * p,
|
|
503
|
+
m * d
|
|
504
504
|
];
|
|
505
505
|
}
|
|
506
|
-
class
|
|
506
|
+
class Rn {
|
|
507
507
|
constructor(e, t) {
|
|
508
508
|
this.gl = e, this.program = t(e, `#version 300 es
|
|
509
509
|
out vec2 vUv;
|
|
@@ -530,10 +530,10 @@ class On {
|
|
|
530
530
|
(this.width !== e || this.height !== t) && (this.clearTargets(), this.width = e, this.height = t, this.targets = [this.target(e, t), this.target(Math.ceil(e / 2), Math.ceil(t / 2))]), r.bindFramebuffer(r.FRAMEBUFFER, this.targets[0].framebuffer), r.viewport(0, 0, e, t), r.clearColor(0, 0, 0, 0), r.clear(r.COLOR_BUFFER_BIT);
|
|
531
531
|
}
|
|
532
532
|
composite(e) {
|
|
533
|
-
const t = this.gl, { prog: r, u: a } = this.program, s = this.width,
|
|
534
|
-
t.useProgram(r), t.bindVertexArray(this.vao), t.activeTexture(t.TEXTURE0), t.uniform1i(a.uTex, 0), t.disable(t.BLEND), t.bindFramebuffer(t.FRAMEBUFFER, this.targets[1].framebuffer), t.viewport(0, 0, Math.ceil(s / 2), Math.ceil(
|
|
535
|
-
const
|
|
536
|
-
t.uniform1i(a.uPass, 1), t.uniform2f(a.uShift,
|
|
533
|
+
const t = this.gl, { prog: r, u: a } = this.program, s = this.width, l = this.height;
|
|
534
|
+
t.useProgram(r), t.bindVertexArray(this.vao), t.activeTexture(t.TEXTURE0), t.uniform1i(a.uTex, 0), t.disable(t.BLEND), t.bindFramebuffer(t.FRAMEBUFFER, this.targets[1].framebuffer), t.viewport(0, 0, Math.ceil(s / 2), Math.ceil(l / 2)), t.bindTexture(t.TEXTURE_2D, this.targets[0].texture), t.uniform1i(a.uPass, 0), t.uniform2f(a.uShift, 0, 0), t.uniform2f(a.uStep, 3 / s, 0), t.drawArrays(t.TRIANGLES, 0, 3), t.bindFramebuffer(t.FRAMEBUFFER, null), t.viewport(0, 0, s, l), t.clearColor(0, 0, 0, 0), t.clear(t.COLOR_BUFFER_BIT), t.enable(t.BLEND), t.bindTexture(t.TEXTURE_2D, this.targets[1].texture);
|
|
535
|
+
const m = Tn(e.x, e.y);
|
|
536
|
+
t.uniform1i(a.uPass, 1), t.uniform2f(a.uShift, m[0], -m[1]), t.uniform2f(a.uStep, 0, 3 / l), t.drawArrays(t.TRIANGLES, 0, 3), t.bindTexture(t.TEXTURE_2D, this.targets[0].texture), t.uniform1i(a.uPass, 2), t.drawArrays(t.TRIANGLES, 0, 3), t.bindVertexArray(null);
|
|
537
537
|
}
|
|
538
538
|
clearTargets() {
|
|
539
539
|
for (const e of this.targets)
|
|
@@ -544,12 +544,12 @@ class On {
|
|
|
544
544
|
this.clearTargets(), this.gl.deleteProgram(this.program.prog), this.gl.deleteVertexArray(this.vao);
|
|
545
545
|
}
|
|
546
546
|
}
|
|
547
|
-
function
|
|
548
|
-
const { IMG: t, EYES: r, MOUTH: a, CHEEKS: s } = n,
|
|
547
|
+
function Ln(n, e) {
|
|
548
|
+
const { IMG: t, EYES: r, MOUTH: a, CHEEKS: s } = n, l = `#version 300 es
|
|
549
549
|
in vec2 aPos; in vec2 aUv;
|
|
550
550
|
uniform vec2 uScale; uniform vec2 uOffset;
|
|
551
551
|
out vec2 vUv;
|
|
552
|
-
void main() { vUv = aUv; gl_Position = vec4(aPos * uScale + uOffset, 0.0, 1.0); }`,
|
|
552
|
+
void main() { vUv = aUv; gl_Position = vec4(aPos * uScale + uOffset, 0.0, 1.0); }`, m = `#version 300 es
|
|
553
553
|
precision highp float;
|
|
554
554
|
in vec2 vUv; out vec4 outColor;
|
|
555
555
|
uniform sampler2D uTex;
|
|
@@ -657,7 +657,7 @@ function Rn(n, e) {
|
|
|
657
657
|
c = texAt(p);
|
|
658
658
|
}
|
|
659
659
|
outColor = c * uAlpha;
|
|
660
|
-
}`,
|
|
660
|
+
}`, b = l.replace("out vec2 vUv;", "in float aHeadWeight; out float vHeadWeight; out vec2 vScreen; out vec2 vUv;").replace("vUv = aUv;", "vHeadWeight = aHeadWeight; vScreen = vec2((aPos.x * uScale.x + uOffset.x + 1.0) * 0.5, (1.0 - aPos.y * uScale.y - uOffset.y) * 0.5); vUv = aUv;"), d = m.replace("uniform sampler2D uTex;", `uniform sampler2D uTex;
|
|
661
661
|
uniform sampler2D uNormal; in float vHeadWeight; in vec2 vScreen;
|
|
662
662
|
uniform mat3 uHeadRotation; uniform vec3 uLight; uniform vec3 uLightColor; uniform vec3 uAmbientColor;
|
|
663
663
|
uniform vec4 uLighting; uniform vec4 uSurface; uniform float uAspect; uniform int uCel;`).replace("outColor = c * uAlpha;", `
|
|
@@ -665,7 +665,7 @@ function Rn(n, e) {
|
|
|
665
665
|
vec4 encoded = texture(uNormal, vUv);
|
|
666
666
|
vec2 base = encoded.rg * 2.0 - 1.0;
|
|
667
667
|
vec3 n = vec3(base, sqrt(max(0.0, 1.0 - dot(base, base))));
|
|
668
|
-
n = normalize(n + vec3((encoded.ba * 2.0 - 1.0) * uSurface.w * ${
|
|
668
|
+
n = normalize(n + vec3((encoded.ba * 2.0 - 1.0) * uSurface.w * ${Mn.toFixed(3)}, 0.0));
|
|
669
669
|
n = normalize(mix(n, uHeadRotation * n, vHeadWeight));
|
|
670
670
|
vec2 toLight = (uLight.xy - vScreen) * vec2(uAspect, 1.0);
|
|
671
671
|
vec3 light = normalize(vec3(toLight, uLight.z));
|
|
@@ -682,12 +682,12 @@ function Rn(n, e) {
|
|
|
682
682
|
float attenuation = 1.0 / (1.0 + reach);
|
|
683
683
|
vec3 radiance = uLightColor * uLighting.y * attenuation;
|
|
684
684
|
// A light close to the surface may brighten a little, but must not bleach painted colours.
|
|
685
|
-
vec3 irradiance = min(uAmbientColor * uLighting.z + radiance * diffuse, vec3(${
|
|
685
|
+
vec3 irradiance = min(uAmbientColor * uLighting.z + radiance * diffuse, vec3(${Sn.toFixed(3)}));
|
|
686
686
|
// Painted shadows are deeper versions of the base colour, not grey: multiply by the colour
|
|
687
687
|
// itself as the surface turns away from the light.
|
|
688
688
|
vec3 albedo = c.rgb / max(c.a, 1e-4);
|
|
689
689
|
float dark = 1.0 - clamp(dot(irradiance, vec3(0.3333)), 0.0, 1.0);
|
|
690
|
-
vec3 shaded = c.rgb * mix(vec3(1.0), albedo, dark * ${
|
|
690
|
+
vec3 shaded = c.rgb * mix(vec3(1.0), albedo, dark * ${En.toFixed(3)}) * irradiance;
|
|
691
691
|
float specular = pow(max(dot(n, normalize(light + vec3(0.0, 0.0, 1.0))), 0.0), 60.0) * uSurface.y;
|
|
692
692
|
if (uCel == 1) specular = smoothstep(0.3, 0.35, specular) * uSurface.y;
|
|
693
693
|
vec2 side = length(n.xy) > 0.001 ? normalize(n.xy) : vec2(0.0);
|
|
@@ -695,346 +695,352 @@ function Rn(n, e) {
|
|
|
695
695
|
shaded += radiance * (specular * max(0.0, ndl) + rim) * c.a;
|
|
696
696
|
// Strength blends between the original painting and the relit result; alpha is unchanged.
|
|
697
697
|
c.rgb = clamp(mix(c.rgb, shaded, uLighting.x), vec3(0.0), vec3(c.a));
|
|
698
|
-
outColor = c * uAlpha;`),
|
|
698
|
+
outColor = c * uAlpha;`), p = `#version 300 es
|
|
699
699
|
in vec2 aPos; uniform vec2 uScale; uniform vec2 uOffset;
|
|
700
|
-
void main() { gl_Position = vec4(aPos * uScale + uOffset, 0.0, 1.0); gl_PointSize = 7.0; }`,
|
|
700
|
+
void main() { gl_Position = vec4(aPos * uScale + uOffset, 0.0, 1.0); gl_PointSize = 7.0; }`, i = `#version 300 es
|
|
701
701
|
precision mediump float; uniform vec4 uColor; out vec4 o; void main() { o = uColor; }`;
|
|
702
|
-
function u(
|
|
703
|
-
const
|
|
704
|
-
for (const [
|
|
705
|
-
const
|
|
706
|
-
if (
|
|
707
|
-
|
|
708
|
-
}
|
|
709
|
-
if (
|
|
710
|
-
const
|
|
711
|
-
for (let
|
|
712
|
-
const
|
|
713
|
-
|
|
714
|
-
}
|
|
715
|
-
return { prog:
|
|
716
|
-
}
|
|
717
|
-
function S(
|
|
718
|
-
const
|
|
719
|
-
let
|
|
720
|
-
for (;
|
|
721
|
-
const
|
|
722
|
-
|
|
723
|
-
}
|
|
724
|
-
return
|
|
725
|
-
}
|
|
726
|
-
function
|
|
727
|
-
const [
|
|
728
|
-
for (let Z = 0; Z <= O; Z++) for (let P = 0; P <=
|
|
729
|
-
const
|
|
730
|
-
|
|
731
|
-
}
|
|
732
|
-
const
|
|
733
|
-
for (let Z = 0; Z < O; Z++) for (let P = 0; P <
|
|
734
|
-
const
|
|
735
|
-
let
|
|
736
|
-
for (let
|
|
737
|
-
for (let
|
|
738
|
-
if (o[
|
|
739
|
-
|
|
702
|
+
function u(v, x, o) {
|
|
703
|
+
const h = v.createProgram();
|
|
704
|
+
for (const [w, B] of [[v.VERTEX_SHADER, x], [v.FRAGMENT_SHADER, o]]) {
|
|
705
|
+
const Y = v.createShader(w);
|
|
706
|
+
if (v.shaderSource(Y, B), v.compileShader(Y), !v.getShaderParameter(Y, v.COMPILE_STATUS)) throw new Error(v.getShaderInfoLog(Y));
|
|
707
|
+
v.attachShader(h, Y), v.deleteShader(Y);
|
|
708
|
+
}
|
|
709
|
+
if (v.bindAttribLocation(h, 0, "aPos"), v.bindAttribLocation(h, 1, "aUv"), v.bindAttribLocation(h, 2, "aHeadWeight"), v.linkProgram(h), !v.getProgramParameter(h, v.LINK_STATUS)) throw new Error(v.getProgramInfoLog(h));
|
|
710
|
+
const T = {}, f = v.getProgramParameter(h, v.ACTIVE_UNIFORMS);
|
|
711
|
+
for (let w = 0; w < f; w++) {
|
|
712
|
+
const B = v.getActiveUniform(h, w).name.replace("[0]", "");
|
|
713
|
+
T[B] = v.getUniformLocation(h, B);
|
|
714
|
+
}
|
|
715
|
+
return { prog: h, u: T };
|
|
716
|
+
}
|
|
717
|
+
function S(v, x, o, h) {
|
|
718
|
+
const T = [v];
|
|
719
|
+
let f = v;
|
|
720
|
+
for (; f < v + x - 0.5; ) {
|
|
721
|
+
const w = h && f >= h.from && f < h.to ? h.cell : o;
|
|
722
|
+
f = Math.min(v + x, f + w), T.push(f);
|
|
723
|
+
}
|
|
724
|
+
return T;
|
|
725
|
+
}
|
|
726
|
+
function y(v, x, o, h, T = null) {
|
|
727
|
+
const [f, w, B, Y] = v, I = S(f, B, x, T && { from: T.x0, to: T.x1, cell: T.cell }), _ = S(w, Y, x, T && { from: T.y0, to: T.y1, cell: T.cell }), U = I.length - 1, O = _.length - 1, C = (U + 1) * (O + 1), $ = new Float32Array(C * 2), V = new Float32Array(C * 2);
|
|
728
|
+
for (let Z = 0; Z <= O; Z++) for (let P = 0; P <= U; P++) {
|
|
729
|
+
const G = Z * (U + 1) + P;
|
|
730
|
+
$[G * 2] = I[P], $[G * 2 + 1] = _[Z], V[G * 2] = (I[P] - f) / B, V[G * 2 + 1] = (_[Z] - w) / Y;
|
|
731
|
+
}
|
|
732
|
+
const X = [], D = [], H = o.length / h, L = h === 1 ? 0 : 1;
|
|
733
|
+
for (let Z = 0; Z < O; Z++) for (let P = 0; P < U; P++) {
|
|
734
|
+
const G = Math.floor(I[P] - f) * L - 2, J = Math.ceil(I[P + 1] - f) * L + 2, q = Math.floor(_[Z] - w) * L - 2, g = Math.ceil(_[Z + 1] - w) * L + 2;
|
|
735
|
+
let A = !1;
|
|
736
|
+
for (let F = Math.max(0, q); F < Math.min(H, g) && !A; F += 1)
|
|
737
|
+
for (let j = Math.max(0, G); j < Math.min(h, J); j += 1)
|
|
738
|
+
if (o[F * h + j] > 3) {
|
|
739
|
+
A = !0;
|
|
740
740
|
break;
|
|
741
741
|
}
|
|
742
|
-
if (!
|
|
743
|
-
const
|
|
744
|
-
|
|
742
|
+
if (!A) continue;
|
|
743
|
+
const E = Z * (U + 1) + P, k = E + 1, N = E + U + 1, z = N + 1;
|
|
744
|
+
X.push(E, k, N, k, z, N), D.push(E, k, E, N, k, N), P === U - 1 && D.push(k, z), Z === O - 1 && D.push(N, z);
|
|
745
745
|
}
|
|
746
|
-
return { rect:
|
|
746
|
+
return { rect: v, cols: U, rows: O, rest: $, uv: V, pos: new Float32Array($), tris: new Uint32Array(X), lines: new Uint32Array(D) };
|
|
747
747
|
}
|
|
748
748
|
class c {
|
|
749
749
|
// padTop / padSide: margin around the image, as a share of its height / width. A negative
|
|
750
750
|
// padTop pushes the top of the image above the canvas (hides a cut-off top edge).
|
|
751
|
-
constructor(x, { padTop: o = 0, padSide:
|
|
752
|
-
this.pad = { top: o, side:
|
|
753
|
-
const
|
|
754
|
-
if (!
|
|
755
|
-
this.gl =
|
|
751
|
+
constructor(x, { padTop: o = 0, padSide: h = 0, fit: T = "contain" } = {}) {
|
|
752
|
+
this.pad = { top: o, side: h }, this.fit = T;
|
|
753
|
+
const f = x.getContext("webgl2", { premultipliedAlpha: !0, antialias: !0, alpha: !0, preserveDrawingBuffer: !0 });
|
|
754
|
+
if (!f) throw new Error("WebGL2 is not available");
|
|
755
|
+
this.gl = f, this.canvas = x, this.main = u(f, l, m), this.line = u(f, p, i), this.layers = [], this.lighting = Re, this.lightingStats = { normalMs: 0, computedLayers: 0, cachedLayers: 0 }, f.enable(f.BLEND), f.blendFunc(f.ONE, f.ONE_MINUS_SRC_ALPHA);
|
|
756
756
|
}
|
|
757
757
|
texture(x) {
|
|
758
|
-
const o = this.gl,
|
|
759
|
-
return o.bindTexture(o.TEXTURE_2D,
|
|
760
|
-
}
|
|
761
|
-
addLayer(x, o,
|
|
762
|
-
const
|
|
763
|
-
|
|
764
|
-
const
|
|
765
|
-
|
|
766
|
-
for (const
|
|
767
|
-
const
|
|
768
|
-
|
|
758
|
+
const o = this.gl, h = o.createTexture();
|
|
759
|
+
return o.bindTexture(o.TEXTURE_2D, h), o.pixelStorei(o.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !0), o.texImage2D(o.TEXTURE_2D, 0, o.RGBA, o.RGBA, o.UNSIGNED_BYTE, x), o.generateMipmap(o.TEXTURE_2D), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_MIN_FILTER, o.LINEAR_MIPMAP_LINEAR), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_MAG_FILTER, o.LINEAR), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_WRAP_S, o.CLAMP_TO_EDGE), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_WRAP_T, o.CLAMP_TO_EDGE), h;
|
|
760
|
+
}
|
|
761
|
+
addLayer(x, o, h, T = {}) {
|
|
762
|
+
const f = this.gl, w = f.createVertexArray();
|
|
763
|
+
f.bindVertexArray(w);
|
|
764
|
+
const B = f.createBuffer();
|
|
765
|
+
f.bindBuffer(f.ARRAY_BUFFER, B), f.bufferData(f.ARRAY_BUFFER, h.pos, f.DYNAMIC_DRAW);
|
|
766
|
+
for (const C of [this.main, this.line]) {
|
|
767
|
+
const $ = f.getAttribLocation(C.prog, "aPos");
|
|
768
|
+
f.enableVertexAttribArray($), f.vertexAttribPointer($, 2, f.FLOAT, !1, 0, 0);
|
|
769
769
|
}
|
|
770
|
-
const
|
|
771
|
-
|
|
772
|
-
const
|
|
773
|
-
|
|
774
|
-
const
|
|
775
|
-
|
|
776
|
-
const
|
|
777
|
-
|
|
778
|
-
const O = { name: x, image: o, mesh:
|
|
770
|
+
const Y = f.createBuffer();
|
|
771
|
+
f.bindBuffer(f.ARRAY_BUFFER, Y), f.bufferData(f.ARRAY_BUFFER, h.uv, f.STATIC_DRAW);
|
|
772
|
+
const I = f.getAttribLocation(this.main.prog, "aUv");
|
|
773
|
+
f.enableVertexAttribArray(I), f.vertexAttribPointer(I, 2, f.FLOAT, !1, 0, 0);
|
|
774
|
+
const _ = f.createBuffer();
|
|
775
|
+
f.bindBuffer(f.ELEMENT_ARRAY_BUFFER, _), f.bufferData(f.ELEMENT_ARRAY_BUFFER, h.tris, f.STATIC_DRAW), f.bindVertexArray(null);
|
|
776
|
+
const U = f.createBuffer();
|
|
777
|
+
f.bindBuffer(f.ELEMENT_ARRAY_BUFFER, U), f.bufferData(f.ELEMENT_ARRAY_BUFFER, h.lines, f.STATIC_DRAW);
|
|
778
|
+
const O = { name: x, image: o, mesh: h, tex: this.texture(o), vao: w, posBuf: B, uvBuf: Y, triBuf: _, lineBuf: U, visible: !0, face: !!T.face, eyeBall: T.eyeBall, color: T.color || [1, 1, 1, 1] };
|
|
779
779
|
return this.layers.push(O), O;
|
|
780
780
|
}
|
|
781
781
|
destroy() {
|
|
782
782
|
const x = this.gl;
|
|
783
783
|
for (const o of this.layers) {
|
|
784
784
|
x.deleteTexture(o.tex), o.normal && x.deleteTexture(o.normal), o.headBuf && x.deleteBuffer(o.headBuf), x.deleteVertexArray(o.vao);
|
|
785
|
-
for (const
|
|
785
|
+
for (const h of [o.posBuf, o.uvBuf, o.triBuf, o.lineBuf]) x.deleteBuffer(h);
|
|
786
786
|
}
|
|
787
787
|
x.deleteProgram(this.main.prog), x.deleteProgram(this.line.prog), this.lit && x.deleteProgram(this.lit.prog), this.shadow?.destroy(), this.layers.length = 0;
|
|
788
788
|
}
|
|
789
789
|
setLighting(x) {
|
|
790
|
-
if (this.lighting =
|
|
790
|
+
if (this.lighting = An({ ...Re, ...x }) ?? Re, !this.lighting.enabled) return;
|
|
791
791
|
const o = this.gl;
|
|
792
|
-
this.lit || (this.lit = u(o,
|
|
793
|
-
for (const
|
|
794
|
-
if (
|
|
795
|
-
const
|
|
796
|
-
this.lightingStats.normalMs +=
|
|
797
|
-
const
|
|
798
|
-
for (let
|
|
799
|
-
|
|
792
|
+
this.lit || (this.lit = u(o, b, d));
|
|
793
|
+
for (const h of this.layers) {
|
|
794
|
+
if (h.normal || h.overlay) continue;
|
|
795
|
+
const T = xn(h.image, h.mesh.rect, e, !/^(eye|mouth)/.test(h.name));
|
|
796
|
+
this.lightingStats.normalMs += T.ms, this.lightingStats[T.computed ? "computedLayers" : "cachedLayers"]++, h.normal = o.createTexture(), o.activeTexture(o.TEXTURE0), o.bindTexture(o.TEXTURE_2D, h.normal), o.pixelStorei(o.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !1), o.texImage2D(o.TEXTURE_2D, 0, o.RGBA, T.width, T.height, 0, o.RGBA, o.UNSIGNED_BYTE, T.data), o.generateMipmap(o.TEXTURE_2D), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_MIN_FILTER, o.LINEAR_MIPMAP_LINEAR), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_MAG_FILTER, o.LINEAR), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_WRAP_S, o.CLAMP_TO_EDGE), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_WRAP_T, o.CLAMP_TO_EDGE);
|
|
797
|
+
const f = new Float32Array(h.mesh.rest.length / 2);
|
|
798
|
+
for (let w = 0; w < f.length; w++) f[w] = n.headWeight(h.mesh.rest[w * 2], h.mesh.rest[w * 2 + 1]);
|
|
799
|
+
h.headBuf = o.createBuffer(), o.bindVertexArray(h.vao), o.bindBuffer(o.ARRAY_BUFFER, h.headBuf), o.bufferData(o.ARRAY_BUFFER, f, o.STATIC_DRAW), o.enableVertexAttribArray(2), o.vertexAttribPointer(2, 1, o.FLOAT, !1, 0, 0);
|
|
800
800
|
}
|
|
801
|
-
o.bindVertexArray(null), this.lighting.shadow && !this.shadow && (this.shadow = new
|
|
801
|
+
o.bindVertexArray(null), this.lighting.shadow && !this.shadow && (this.shadow = new Rn(o, u));
|
|
802
802
|
}
|
|
803
803
|
resize() {
|
|
804
|
-
const x = this.canvas, o = Math.min(window.devicePixelRatio || 1, 2),
|
|
805
|
-
(x.width !==
|
|
806
|
-
const
|
|
807
|
-
this.scale = [2 *
|
|
804
|
+
const x = this.canvas, o = Math.min(window.devicePixelRatio || 1, 2), h = Math.round(x.clientWidth * o), T = Math.round(x.clientHeight * o);
|
|
805
|
+
(x.width !== h || x.height !== T) && (x.width = h, x.height = T);
|
|
806
|
+
const f = (this.fit === "cover" ? Math.max : Math.min)(h / (t.w * (1 + 2 * this.pad.side)), T / (t.h * (1 + this.pad.top))), w = (h - t.w * f) / 2, B = (T - t.h * f) / (this.fit === "cover" ? 2 : 1);
|
|
807
|
+
this.scale = [2 * f / h, -2 * f / T], this.offset = [-1 + 2 * w / h, 1 - 2 * B / T], this.pxScale = f, this.pxOff = [w, B];
|
|
808
808
|
}
|
|
809
809
|
draw(x) {
|
|
810
810
|
const o = this.gl;
|
|
811
811
|
this.resize(), o.viewport(0, 0, this.canvas.width, this.canvas.height), o.clearColor(0, 0, 0, 0), o.clear(o.COLOR_BUFFER_BIT);
|
|
812
|
-
const
|
|
813
|
-
|
|
814
|
-
const
|
|
815
|
-
if (this.current =
|
|
816
|
-
const
|
|
817
|
-
o.uniform1i(
|
|
812
|
+
const h = this.lighting.enabled, T = h && this.lighting.shadow;
|
|
813
|
+
T && this.shadow.begin(this.canvas.width, this.canvas.height);
|
|
814
|
+
const f = h ? this.lit : this.main;
|
|
815
|
+
if (this.current = f, o.useProgram(f.prog), h) {
|
|
816
|
+
const w = this.lighting;
|
|
817
|
+
o.uniform1i(f.u.uNormal, 1), o.uniform3f(f.u.uLight, w.x, w.y, w.z), o.uniform3f(f.u.uLightColor, (w.color >> 16 & 255) / 255, (w.color >> 8 & 255) / 255, (w.color & 255) / 255), o.uniform3f(f.u.uAmbientColor, (w.ambientColor >> 16 & 255) / 255, (w.ambientColor >> 8 & 255) / 255, (w.ambientColor & 255) / 255), o.uniform4f(f.u.uLighting, w.strength, w.intensity, w.ambient, w.reach), o.uniform4f(f.u.uSurface, w.softness, w.specular, w.rim, w.detail), o.uniform1f(f.u.uAspect, this.canvas.width / this.canvas.height), o.uniform1i(f.u.uCel, w.mode === "cel" ? 1 : 0), o.uniformMatrix3fv(f.u.uHeadRotation, !1, On(x.angleX ?? 0, x.angleY ?? 0, x.angleZ ?? 0, e.head.maxRoll));
|
|
818
818
|
}
|
|
819
|
-
o.uniform2fv(
|
|
820
|
-
for (const
|
|
821
|
-
!
|
|
822
|
-
if (this.original && x.originalAlpha > 0 && this.drawLayer(this.original, x.originalAlpha),
|
|
823
|
-
const
|
|
824
|
-
o.useProgram(
|
|
825
|
-
for (const
|
|
826
|
-
!
|
|
819
|
+
o.uniform2fv(f.u.uScale, this.scale), o.uniform2fv(f.u.uOffset, this.offset), o.uniform1i(f.u.uTex, 0), o.uniform4fv(f.u.uEyeBox, r.flatMap((w) => [w.x0, w.x1, 0, 0])), o.uniform1fv(f.u.uEyeTop, r.flatMap((w) => w.top)), o.uniform1fv(f.u.uEyeBot, r.flatMap((w) => w.bot)), o.uniform4fv(f.u.uEyeState, x.eyes), o.uniform4f(f.u.uMouth, a.cx, a.cy, a.angle, a.halfLen), o.uniform4f(f.u.uMouthState, x.mouthOpen, x.mouthForm, a.bow, 0), o.uniform4f(f.u.uCheeks, s[0][0], s[0][1], s[1][0], s[1][1]), o.uniform1f(f.u.uCheek, x.cheek), o.activeTexture(o.TEXTURE0);
|
|
820
|
+
for (const w of this.layers)
|
|
821
|
+
!w.visible || w.overlay || this.drawLayer(w, w.alpha ?? 1);
|
|
822
|
+
if (this.original && x.originalAlpha > 0 && this.drawLayer(this.original, x.originalAlpha), T && this.shadow.composite(this.lighting), x.showMesh) {
|
|
823
|
+
const w = this.line;
|
|
824
|
+
o.useProgram(w.prog), o.uniform2fv(w.u.uScale, this.scale), o.uniform2fv(w.u.uOffset, this.offset);
|
|
825
|
+
for (const B of this.layers)
|
|
826
|
+
!B.visible || B.overlay || (o.bindVertexArray(B.vao), o.bindBuffer(o.ELEMENT_ARRAY_BUFFER, B.lineBuf), o.uniform4fv(w.u.uColor, B.color), o.drawElements(o.LINES, B.mesh.lines.length, o.UNSIGNED_INT, 0), o.bindBuffer(o.ELEMENT_ARRAY_BUFFER, B.triBuf));
|
|
827
827
|
x.joints?.length && this.drawPoints(x.joints), o.bindVertexArray(null);
|
|
828
828
|
}
|
|
829
829
|
}
|
|
830
830
|
drawLayer(x, o) {
|
|
831
|
-
const
|
|
832
|
-
|
|
831
|
+
const h = this.gl, T = this.current;
|
|
832
|
+
h.useProgram(T.prog), h.bindVertexArray(x.vao), h.bindBuffer(h.ARRAY_BUFFER, x.posBuf), h.bufferSubData(h.ARRAY_BUFFER, 0, x.mesh.pos), this.lighting.enabled && (h.activeTexture(h.TEXTURE1), h.bindTexture(h.TEXTURE_2D, x.normal), h.activeTexture(h.TEXTURE0)), h.bindTexture(h.TEXTURE_2D, x.tex), h.uniform4fv(T.u.uRect, x.mesh.rect), h.uniform1i(T.u.uFace, x.eyeBall !== void 0 ? 2 + x.eyeBall : x.face ? 1 : 0), h.uniform1f(T.u.uAlpha, o), h.drawElements(h.TRIANGLES, x.mesh.tris.length, h.UNSIGNED_INT, 0);
|
|
833
833
|
}
|
|
834
834
|
drawPoints(x) {
|
|
835
|
-
const o = this.gl,
|
|
835
|
+
const o = this.gl, h = this.line;
|
|
836
836
|
if (!this.pointBuf) {
|
|
837
837
|
this.pointBuf = o.createBuffer(), this.pointVao = o.createVertexArray(), o.bindVertexArray(this.pointVao), o.bindBuffer(o.ARRAY_BUFFER, this.pointBuf);
|
|
838
|
-
const
|
|
839
|
-
o.enableVertexAttribArray(
|
|
838
|
+
const T = o.getAttribLocation(h.prog, "aPos");
|
|
839
|
+
o.enableVertexAttribArray(T), o.vertexAttribPointer(T, 2, o.FLOAT, !1, 0, 0);
|
|
840
840
|
}
|
|
841
|
-
o.bindVertexArray(this.pointVao), o.bindBuffer(o.ARRAY_BUFFER, this.pointBuf), o.bufferData(o.ARRAY_BUFFER, new Float32Array(x.flat()), o.DYNAMIC_DRAW), o.uniform4f(
|
|
841
|
+
o.bindVertexArray(this.pointVao), o.bindBuffer(o.ARRAY_BUFFER, this.pointBuf), o.bufferData(o.ARRAY_BUFFER, new Float32Array(x.flat()), o.DYNAMIC_DRAW), o.uniform4f(h.u.uColor, 1, 0.85, 0.2, 1), o.drawArrays(o.POINTS, 0, x.length);
|
|
842
842
|
}
|
|
843
843
|
// canvas CSS px -> source image px
|
|
844
844
|
toImage(x, o) {
|
|
845
845
|
if (!this.pxOff) return null;
|
|
846
|
-
const
|
|
847
|
-
return [(x *
|
|
846
|
+
const h = this.canvas.width / this.canvas.clientWidth;
|
|
847
|
+
return [(x * h - this.pxOff[0]) / this.pxScale, (o * h - this.pxOff[1]) / this.pxScale];
|
|
848
848
|
}
|
|
849
849
|
}
|
|
850
|
-
return { Renderer: c, buildGrid:
|
|
850
|
+
return { Renderer: c, buildGrid: y };
|
|
851
851
|
}
|
|
852
|
-
function
|
|
853
|
-
const { applyHead: t, applyBody: r, TASSELS: a, tasselAnchor: s } = n,
|
|
852
|
+
function kn(n, e) {
|
|
853
|
+
const { applyHead: t, applyBody: r, TASSELS: a, tasselAnchor: s } = n, l = (e.strands ?? []).map((o) => {
|
|
854
854
|
if (o.nodes.length === 4) return o;
|
|
855
|
-
const
|
|
856
|
-
const
|
|
857
|
-
return [0, 1].map((
|
|
855
|
+
const h = Array.from({ length: 4 }, (T, f) => {
|
|
856
|
+
const w = f / 3 * (o.nodes.length - 1), B = Math.min(o.nodes.length - 2, Math.floor(w)), Y = w - B;
|
|
857
|
+
return [0, 1].map((I) => o.nodes[B][I] + (o.nodes[B + 1][I] - o.nodes[B][I]) * Y);
|
|
858
858
|
});
|
|
859
|
-
return { ...o, nodes:
|
|
860
|
-
}),
|
|
861
|
-
const
|
|
862
|
-
if (
|
|
863
|
-
const
|
|
864
|
-
return [o[0] *
|
|
865
|
-
}, c = Object.fromEntries(Object.entries(e.buns ?? {}).map(([o,
|
|
866
|
-
const
|
|
867
|
-
|
|
859
|
+
return { ...o, nodes: h };
|
|
860
|
+
}), m = [0, 300, 200, 140], b = 0.9, d = 7, p = { stiff: 1.7, damp: 1.6, couple: 0.85, reach: 0.9, bind: 4 }, i = Math.min(6, l.filter((o) => o.name.startsWith("bang")).length), u = { freq: 0.7, zeta: 0.22, hang: 0.85, inertia: 0.32, wind: 0.03, max: 0.55, smooth: 6 }, S = (o, h) => [o[0] * Math.cos(h) - o[1] * Math.sin(h), o[0] * Math.sin(h) + o[1] * Math.cos(h)], y = (o, h) => {
|
|
861
|
+
const T = Math.hypot(o[0], o[1]);
|
|
862
|
+
if (T < 1e-6) return o;
|
|
863
|
+
const f = h * Math.tanh(T / h) / T;
|
|
864
|
+
return [o[0] * f, o[1] * f];
|
|
865
|
+
}, c = Object.fromEntries(Object.entries(e.buns ?? {}).map(([o, h]) => [o, { at: [h.cx, h.cy], k: 260, c: 11, hang: 3, max: 4 }])), v = (o, h) => {
|
|
866
|
+
const T = Math.hypot(o[0], o[1]);
|
|
867
|
+
T > h && (o[0] *= h / T, o[1] *= h / T);
|
|
868
868
|
};
|
|
869
869
|
class x {
|
|
870
870
|
constructor() {
|
|
871
871
|
this.gain = 1, this.out = { gain: 1, bunL: [0, 0], bunR: [0, 0] }, this.hair = {};
|
|
872
|
-
for (const
|
|
873
|
-
this.hair[
|
|
874
|
-
this.strands =
|
|
875
|
-
const
|
|
876
|
-
return { t:
|
|
872
|
+
for (const h of Object.keys(c))
|
|
873
|
+
this.hair[h] = { p: null, v: [0, 0] }, this.out[h] = [0, 0];
|
|
874
|
+
this.strands = l.map(() => ({ p: null, v: [[0, 0], [0, 0], [0, 0], [0, 0]] })), this.out.strands = l.map(() => [[0, 0], [0, 0], [0, 0], [0, 0]]), this.chains = a.map((h) => {
|
|
875
|
+
const T = h.tip[0] - h.pivot[0], f = h.tip[1] - h.pivot[1], w = Math.hypot(T, f), B = [T / w, f / w];
|
|
876
|
+
return { t: h, dir: B, L1: w * h.split, L2: w * (1 - h.split), pts: null, prev: null, phi: [0, 0], anchor: [0, 0] };
|
|
877
877
|
}), this.time = 0;
|
|
878
878
|
}
|
|
879
|
-
hairAnchor(
|
|
880
|
-
const
|
|
881
|
-
return t(
|
|
882
|
-
}
|
|
883
|
-
step(
|
|
884
|
-
const
|
|
885
|
-
|
|
886
|
-
const O = this.strands[
|
|
887
|
-
O.p || (O.p =
|
|
888
|
-
const
|
|
889
|
-
for (let
|
|
890
|
-
const
|
|
891
|
-
for (let
|
|
892
|
-
const
|
|
893
|
-
|
|
879
|
+
hairAnchor(h, T) {
|
|
880
|
+
const f = [h[0], h[1]];
|
|
881
|
+
return t(f, 1, T), r(f, h[1], T), f;
|
|
882
|
+
}
|
|
883
|
+
step(h, T) {
|
|
884
|
+
const f = Math.max(1, Math.ceil(T / 0.004166666666666667)), w = Math.min(T, 0.05) / f, B = -h.angleZ / 30 * e.head.maxRoll - h.bodyAngleZ / 10 * e.body.maxRoll, Y = this.gain;
|
|
885
|
+
l.forEach((_, U) => {
|
|
886
|
+
const O = this.strands[U], C = this.out.strands[U], $ = _.nodes.map((X) => this.hairAnchor(X, h));
|
|
887
|
+
O.p || (O.p = $.map((X) => [...X]));
|
|
888
|
+
const V = U * 1.7;
|
|
889
|
+
for (let X = 0; X < f; X++) {
|
|
890
|
+
const D = this.time + X * w;
|
|
891
|
+
for (let H = 1; H < 4; H++) {
|
|
892
|
+
const L = Math.hypot(_.nodes[H][0] - _.nodes[0][0], _.nodes[H][1] - _.nodes[0][1]), Z = (Math.sin(D * 1.3) * 0.5 + Math.sin(D * 3.1) * 0.3 + Math.sin(D * 4.7 + V) * 0.2) * _.max * 0.1 * H / 3, P = [O.p[H - 1][0] - $[H - 1][0], O.p[H - 1][1] - $[H - 1][1]], G = $[H][0] + P[0] * b * p.couple - Math.sin(B) * L * 0.12 + Z, J = $[H][1] + P[1] * b * p.couple, q = m[H] * _.k * p.stiff / Math.max(0.35, Y), g = d * p.damp * Math.sqrt(p.stiff) / Math.max(0.5, Math.sqrt(Y)), A = O.v[H], E = O.p[H];
|
|
893
|
+
A[0] += (q * (G - E[0]) - g * A[0]) * w, A[1] += (q * (J - E[1]) - g * A[1]) * w, E[0] += A[0] * w, E[1] += A[1] * w;
|
|
894
894
|
}
|
|
895
|
-
O.p[0] = [
|
|
895
|
+
O.p[0] = [...$[0]];
|
|
896
896
|
}
|
|
897
|
-
for (let
|
|
898
|
-
const
|
|
899
|
-
|
|
897
|
+
for (let X = 0; X < 4; X++) {
|
|
898
|
+
const D = [O.p[X][0] - $[X][0], O.p[X][1] - $[X][1]];
|
|
899
|
+
C[X] = y(D, Math.max(0.5, _.max * p.reach * Math.max(1, Y) * X / 3));
|
|
900
900
|
}
|
|
901
901
|
});
|
|
902
|
-
for (const [
|
|
903
|
-
const O = this.hair[
|
|
904
|
-
O.p || (O.p = [
|
|
905
|
-
const
|
|
906
|
-
for (let Z = 0; Z <
|
|
907
|
-
O.v[0] += (
|
|
908
|
-
const
|
|
909
|
-
|
|
902
|
+
for (const [_, U] of Object.entries(c)) {
|
|
903
|
+
const O = this.hair[_], C = this.hairAnchor(U.at, h), $ = Math.sin(this.time * 1.3 + U.at[0] * 0.01) * 0.6 + Math.sin(this.time * 2.9 + U.at[1] * 0.02) * 0.4, V = C[0] - Math.sin(B) * U.hang + $ * U.max * 0.12, X = C[1];
|
|
904
|
+
O.p || (O.p = [V, X]);
|
|
905
|
+
const D = U.k / Math.max(0.35, Y), H = U.c / Math.max(0.5, Math.sqrt(Y));
|
|
906
|
+
for (let Z = 0; Z < f; Z++)
|
|
907
|
+
O.v[0] += (D * (V - O.p[0]) - H * O.v[0]) * w, O.v[1] += (D * (X - O.p[1]) - H * O.v[1]) * w, O.p[0] += O.v[0] * w, O.p[1] += O.v[1] * w;
|
|
908
|
+
const L = [O.p[0] - C[0], O.p[1] - C[1]];
|
|
909
|
+
v(L, U.max * Math.max(1, Y)), this.out[_] = L;
|
|
910
910
|
}
|
|
911
911
|
this.out.gain = 1;
|
|
912
|
-
const
|
|
913
|
-
for (let
|
|
914
|
-
const O =
|
|
915
|
-
for (let
|
|
916
|
-
const
|
|
917
|
-
for (const
|
|
912
|
+
const I = this.out.strands;
|
|
913
|
+
for (let _ = 0; _ < p.bind; _++) for (let U = 1; U < 4; U++) {
|
|
914
|
+
const O = I.slice(0, i).map((C) => [...C[U]]);
|
|
915
|
+
for (let C = 0; C < i; C++) {
|
|
916
|
+
const $ = O[Math.max(0, C - 1)], V = O[Math.min(i - 1, C + 1)];
|
|
917
|
+
for (const X of [0, 1]) I[C][U][X] = O[C][X] * 0.5 + ($[X] + V[X]) * 0.25;
|
|
918
918
|
}
|
|
919
919
|
}
|
|
920
|
-
for (const
|
|
921
|
-
const
|
|
922
|
-
|
|
923
|
-
const O =
|
|
924
|
-
O.acc = [O.acc[0] + (
|
|
925
|
-
const
|
|
926
|
-
for (let
|
|
927
|
-
const
|
|
928
|
-
O.w[0] +=
|
|
929
|
-
const
|
|
930
|
-
O.w[1] +=
|
|
920
|
+
for (const _ of this.chains) {
|
|
921
|
+
const U = s(_.t, h, this.out, [0, 0]);
|
|
922
|
+
_.st || (_.st = { th: [0, 0], w: [0, 0], pos: [...U], vel: [0, 0], acc: [0, 0] });
|
|
923
|
+
const O = _.st, C = u, $ = [(U[0] - O.pos[0]) / Math.max(T, 1e-3), (U[1] - O.pos[1]) / Math.max(T, 1e-3)], V = 1 - Math.exp(-T * C.smooth), X = [($[0] - O.vel[0]) / Math.max(T, 1e-3), ($[1] - O.vel[1]) / Math.max(T, 1e-3)];
|
|
924
|
+
O.acc = [O.acc[0] + (X[0] - O.acc[0]) * V, O.acc[1] + (X[1] - O.acc[1]) * V], O.vel = [O.vel[0] + ($[0] - O.vel[0]) * V, O.vel[1] + ($[1] - O.vel[1]) * V], O.pos = [...U];
|
|
925
|
+
const D = [-_.dir[1], _.dir[0]], H = -(O.acc[0] * D[0] + O.acc[1] * D[1]) / (_.L1 + _.L2) * C.inertia, L = (Math.sin(this.time * 0.9 + _.t.pivot[0]) * 0.6 + Math.sin(this.time * 0.37 + _.t.pivot[1]) * 0.4) * C.wind, Z = -B * C.hang + L, P = 2 * Math.PI * C.freq / Math.sqrt(Math.max(0.4, Y)), G = P * 1.35;
|
|
926
|
+
for (let A = 0; A < f; A++) {
|
|
927
|
+
const E = -P * P * (O.th[0] - Z) - 2 * C.zeta * P * O.w[0] + H;
|
|
928
|
+
O.w[0] += E * w, O.th[0] += O.w[0] * w;
|
|
929
|
+
const k = -G * G * (O.th[1] - O.th[0]) - 2 * C.zeta * G * O.w[1] + H * 0.4 + E * 0.5;
|
|
930
|
+
O.w[1] += k * w, O.th[1] += O.w[1] * w;
|
|
931
931
|
}
|
|
932
|
-
O.th[0] = Math.max(-0.55, Math.min(
|
|
933
|
-
const
|
|
934
|
-
|
|
932
|
+
O.th[0] = Math.max(-0.55, Math.min(C.max, O.th[0])), O.th[1] = Math.max(-0.55 * 1.4, Math.min(C.max * 1.4, O.th[1])), _.phi = [O.th[0], O.th[1]];
|
|
933
|
+
const J = S(_.dir, O.th[0]), q = S(_.dir, O.th[1]), g = [U[0] + J[0] * _.L1, U[1] + J[1] * _.L1];
|
|
934
|
+
_.pts = [[...U], g, [g[0] + q[0] * _.L2, g[1] + q[1] * _.L2]], _.anchor = U;
|
|
935
935
|
}
|
|
936
|
-
return this.time +=
|
|
936
|
+
return this.time += T, this.out;
|
|
937
937
|
}
|
|
938
938
|
}
|
|
939
939
|
return { Physics: x };
|
|
940
940
|
}
|
|
941
|
-
function
|
|
942
|
-
const { baseWeights: t, deformBase: r, MOUTH: a } = n, s = (
|
|
943
|
-
const
|
|
944
|
-
return
|
|
945
|
-
},
|
|
941
|
+
function _n(n, e) {
|
|
942
|
+
const { baseWeights: t, deformBase: r, MOUTH: a } = n, s = (f, w, B) => {
|
|
943
|
+
const Y = Math.min(1, Math.max(0, (B - f) / (w - f)));
|
|
944
|
+
return Y * Y * (3 - 2 * Y);
|
|
945
|
+
}, l = e.mouth.area, m = {
|
|
946
946
|
a: { sprite: "mouth_a", ref: 0.9, width: 1 },
|
|
947
947
|
aHalf: { sprite: "mouth_a_half", ref: 0.55, width: 1 },
|
|
948
948
|
i: { sprite: "mouth_i", ref: 0.55, width: 1 },
|
|
949
949
|
e: { sprite: "mouth_a_half", ref: 0.65, width: 1.06 },
|
|
950
950
|
o: { sprite: "mouth_o", ref: 0.75, width: 1 },
|
|
951
951
|
u: { sprite: "mouth_o", ref: 0.75, width: 0.78 }
|
|
952
|
-
},
|
|
953
|
-
function p(
|
|
954
|
-
const
|
|
955
|
-
return
|
|
956
|
-
}
|
|
957
|
-
const
|
|
958
|
-
function
|
|
959
|
-
return
|
|
960
|
-
}
|
|
961
|
-
function
|
|
962
|
-
if (
|
|
963
|
-
const
|
|
964
|
-
return
|
|
965
|
-
}
|
|
966
|
-
function
|
|
967
|
-
return a.cy + (
|
|
968
|
-
}
|
|
969
|
-
function
|
|
970
|
-
return
|
|
971
|
-
}
|
|
972
|
-
function
|
|
973
|
-
const
|
|
974
|
-
return 1 - s(0.55, 0.95, Math.hypot(
|
|
975
|
-
}
|
|
976
|
-
function
|
|
977
|
-
const
|
|
978
|
-
for (const [
|
|
979
|
-
const
|
|
980
|
-
for (let
|
|
981
|
-
const
|
|
982
|
-
|
|
952
|
+
}, b = 0.16, d = ["angry", "sad"];
|
|
953
|
+
function p(f, w) {
|
|
954
|
+
const Y = (U, O, C) => U >= O - (w ? 0.07 : 0) && U < C + (w ? 0.07 : 0), I = [["i", -9, -0.55], ["e", -0.55, -0.2], ["a", -0.2, 0.35], ["o", 0.35, 0.75], ["u", 0.75, 9]], _ = w && I.find((U) => U[0] === w || w === "aHalf" && U[0] === "a");
|
|
955
|
+
return _ && Y(f, _[1], _[2]) ? _[0] : I.find((U) => f >= U[1] && f < U[2])[0];
|
|
956
|
+
}
|
|
957
|
+
const i = 0.75, u = 0.3, S = 0.06, y = ["sad", "surprise"];
|
|
958
|
+
function c(f, w, B = null) {
|
|
959
|
+
return B && f >= u ? B : f >= i ? null : f < u ? w >= 0.5 ? "eyes_smile" : "eyes_closed" : "eyes_half";
|
|
960
|
+
}
|
|
961
|
+
function v(f, w, B = null) {
|
|
962
|
+
if (f < b) return null;
|
|
963
|
+
const Y = p(w, B);
|
|
964
|
+
return Y === "a" ? f >= 0.6 ? "a" : "aHalf" : Y;
|
|
965
|
+
}
|
|
966
|
+
function x(f) {
|
|
967
|
+
return a.cy + (f - a.cx) * Math.tan(a.angle);
|
|
968
|
+
}
|
|
969
|
+
function o() {
|
|
970
|
+
return l.cx;
|
|
971
|
+
}
|
|
972
|
+
function h(f, w) {
|
|
973
|
+
const B = Math.cos(-l.angle), Y = Math.sin(-l.angle), I = f - l.cx, _ = w - l.cy, U = (I * B - _ * Y) / l.rx, O = (I * Y + _ * B) / l.ry;
|
|
974
|
+
return 1 - s(0.55, 0.95, Math.hypot(U, O));
|
|
975
|
+
}
|
|
976
|
+
function T(f, w, B, Y, I) {
|
|
977
|
+
const _ = {}, U = (L) => L.startsWith("eyes_closed") || L.startsWith("eyes_smile"), O = (L) => d.some((Z) => L === `mouth_${Z}`), C = (L) => U(L) ? 1 : L.startsWith("eyes_") ? 0 : O(L) ? 2 : 3, $ = Object.entries(w.layers).sort((L, Z) => C(L[0]) - C(Z[0]));
|
|
978
|
+
for (const [L, Z] of $) {
|
|
979
|
+
const P = Y(Z, e.mesh.spriteCell, I(B[L]), B[L].width), G = [], J = [];
|
|
980
|
+
for (let g = 0; g < P.rest.length / 2; g++) {
|
|
981
|
+
const A = P.rest[g * 2], E = P.rest[g * 2 + 1];
|
|
982
|
+
G.push(t(A, E, 0)), J.push(L.startsWith("mouth") ? h(A, E) : 0);
|
|
983
983
|
}
|
|
984
|
-
const
|
|
985
|
-
|
|
986
|
-
}
|
|
987
|
-
const
|
|
988
|
-
let
|
|
989
|
-
const
|
|
990
|
-
function
|
|
991
|
-
const
|
|
992
|
-
for (let
|
|
993
|
-
let
|
|
994
|
-
const
|
|
995
|
-
if (
|
|
996
|
-
const
|
|
997
|
-
|
|
984
|
+
const q = f.addLayer(L, B[L], P, { color: [0.4, 1, 0.8, 0.6] });
|
|
985
|
+
q.visible = !1, _[L] = { mesh: P, W: G, inner: J, layer: q };
|
|
986
|
+
}
|
|
987
|
+
const V = [0, 0];
|
|
988
|
+
let X = null;
|
|
989
|
+
const D = [0, 1].map(() => ({ cur: "open", prev: "open", t: 1 }));
|
|
990
|
+
function H(L, Z, P, G, J = 1) {
|
|
991
|
+
const q = L.mesh.rest, g = L.mesh.pos;
|
|
992
|
+
for (let A = 0; A < L.W.length; A++) {
|
|
993
|
+
let E = q[A * 2], k = q[A * 2 + 1];
|
|
994
|
+
const N = L.inner[A];
|
|
995
|
+
if (N > 0) {
|
|
996
|
+
const z = x(E);
|
|
997
|
+
k = z + (k - z) * (1 + (G - 1) * N), E = o() + (E - o()) * (1 + (J - 1) * N);
|
|
998
998
|
}
|
|
999
|
-
r(
|
|
999
|
+
r(E, k, L.W[A], Z, P, V), g[A * 2] = V[0], g[A * 2 + 1] = V[1];
|
|
1000
1000
|
}
|
|
1001
1001
|
}
|
|
1002
1002
|
return {
|
|
1003
1003
|
/**
|
|
1004
1004
|
* Show / hide and deform the sprites for this frame.
|
|
1005
1005
|
* Returns which eyes are covered by a sprite, so the layered eye parts can be hidden.
|
|
1006
|
+
* `mood` (angry / sad / surprise) picks drawn expression eyes (sad, surprise) and closed
|
|
1007
|
+
* mouths (angry, sad) when the avatar has them.
|
|
1006
1008
|
*/
|
|
1007
|
-
update(
|
|
1008
|
-
for (const
|
|
1009
|
-
const
|
|
1009
|
+
update(L, Z, P = 1 / 60, G = null) {
|
|
1010
|
+
for (const N of Object.values(_)) N.layer.visible = !1;
|
|
1011
|
+
const J = [!1, !1];
|
|
1010
1012
|
[
|
|
1011
|
-
[
|
|
1012
|
-
[
|
|
1013
|
-
].forEach(([
|
|
1014
|
-
const
|
|
1015
|
-
|
|
1016
|
-
const
|
|
1017
|
-
if (
|
|
1018
|
-
const
|
|
1019
|
-
|
|
1020
|
-
},
|
|
1021
|
-
|
|
1013
|
+
[L.eyeROpen, L.eyeSmile],
|
|
1014
|
+
[L.eyeLOpen, L.eyeSmileL ?? L.eyeSmile]
|
|
1015
|
+
].forEach(([N, z], F) => {
|
|
1016
|
+
const j = D[F], M = y.includes(G) && _[`eyes_${G}_${F}`] ? `eyes_${G}` : null, R = c(N, z, M) ?? "open";
|
|
1017
|
+
R !== j.cur && (j.prev = j.cur, j.cur = R, j.t = 0), j.t = P > 0 ? Math.min(1, j.t + P / S) : 1;
|
|
1018
|
+
const W = s(0, 1, j.t), Q = (ee, he) => {
|
|
1019
|
+
if (ee === "open" || he <= 1e-3) return;
|
|
1020
|
+
const oe = _[`${ee}_${F}`];
|
|
1021
|
+
oe && (oe.layer.visible = !0, oe.layer.alpha = he, H(oe, L, Z, 1));
|
|
1022
|
+
}, ne = (ee) => ee === "open" ? -1 : U(ee) ? 1 : 0;
|
|
1023
|
+
j.t >= 1 ? Q(j.cur, 1) : ne(j.cur) > ne(j.prev) ? (Q(j.prev, 1), Q(j.cur, W)) : (Q(j.cur, 1), Q(j.prev, 1 - W)), J[F] = j.cur !== "open" && W >= 0.999;
|
|
1022
1024
|
});
|
|
1023
|
-
const
|
|
1024
|
-
|
|
1025
|
-
const
|
|
1026
|
-
if (
|
|
1027
|
-
|
|
1028
|
-
const
|
|
1029
|
-
|
|
1025
|
+
const g = v(L.mouthOpen, L.mouthForm, X);
|
|
1026
|
+
X = g;
|
|
1027
|
+
const A = g && m[g], E = A && _[A.sprite], k = d.includes(G) && _[`mouth_${G}`];
|
|
1028
|
+
if (k && (!E || L.mouthOpen < b + 0.04) && (k.layer.visible = !0, k.layer.alpha = 1, H(k, L, Z, 1)), E) {
|
|
1029
|
+
E.layer.visible = !0, E.layer.alpha = s(b, b + 0.04, L.mouthOpen);
|
|
1030
|
+
const N = Math.min(1.1, Math.max(0.5, L.mouthOpen / A.ref));
|
|
1031
|
+
H(E, L, Z, N, A.width);
|
|
1030
1032
|
}
|
|
1031
|
-
return { eyes:
|
|
1033
|
+
return { eyes: J, mouth: g };
|
|
1032
1034
|
}
|
|
1033
1035
|
};
|
|
1034
1036
|
}
|
|
1035
|
-
return { createSprites:
|
|
1037
|
+
return { createSprites: T, mouthShape: v, eyeSprite: c };
|
|
1036
1038
|
}
|
|
1037
|
-
const
|
|
1039
|
+
const Ut = { angry: "angry", angryTalk: "angry", sad: "sad", sadTalk: "sad", surprise: "surprise", surprisedTalk: "surprise" };
|
|
1040
|
+
function Fn(n, e) {
|
|
1041
|
+
return n && n !== "neutral" ? Ut[n] ?? null : (e && Ut[e]) ?? null;
|
|
1042
|
+
}
|
|
1043
|
+
const Bn = /* @__PURE__ */ new Set([
|
|
1038
1044
|
"angleX",
|
|
1039
1045
|
"angleY",
|
|
1040
1046
|
"angleZ",
|
|
@@ -1432,14 +1438,14 @@ const _n = /* @__PURE__ */ new Set([
|
|
|
1432
1438
|
}
|
|
1433
1439
|
}
|
|
1434
1440
|
};
|
|
1435
|
-
function
|
|
1441
|
+
function Un(n, e) {
|
|
1436
1442
|
if (e <= n[0][0]) return n[0][1];
|
|
1437
1443
|
const t = n.length - 1;
|
|
1438
1444
|
if (e >= n[t][0]) return n[t][1];
|
|
1439
1445
|
let r = 0;
|
|
1440
1446
|
for (; e > n[r + 1][0]; ) r++;
|
|
1441
|
-
const [a, s] = n[r], [
|
|
1442
|
-
return (2 *
|
|
1447
|
+
const [a, s] = n[r], [l, m] = n[r + 1], b = (c) => c <= 0 || c >= t ? 0 : (n[c + 1][1] - n[c - 1][1]) / (n[c + 1][0] - n[c - 1][0]), d = l - a, p = (e - a) / d, i = b(r) * d, u = b(r + 1) * d, S = p * p, y = S * p;
|
|
1448
|
+
return (2 * y - 3 * S + 1) * s + (y - 2 * S + p) * i + (-2 * y + 3 * S) * m + (y - S) * u;
|
|
1443
1449
|
}
|
|
1444
1450
|
const We = {
|
|
1445
1451
|
a: { open: 0.9, form: 0, label: "あ" },
|
|
@@ -1449,21 +1455,21 @@ const We = {
|
|
|
1449
1455
|
o: { open: 0.75, form: 0.6, label: "お" },
|
|
1450
1456
|
n: { open: 0, form: null, label: "ん" }
|
|
1451
1457
|
// closes with the previous shape
|
|
1452
|
-
},
|
|
1458
|
+
}, Yn = {
|
|
1453
1459
|
a: "あかさたなはまやらわがざだばぱぁ",
|
|
1454
1460
|
i: "いきしちにひみりぎじぢびぴぃ",
|
|
1455
1461
|
u: "うくすつぬふむゆるぐずづぶぷぅゔ",
|
|
1456
1462
|
e: "えけせてねへめれげぜでべぺぇ",
|
|
1457
1463
|
o: "おこそとのほもよろをごぞどぼぽぉ"
|
|
1458
|
-
},
|
|
1459
|
-
for (const [n, e] of Object.entries(
|
|
1460
|
-
const
|
|
1461
|
-
function
|
|
1464
|
+
}, Vt = {};
|
|
1465
|
+
for (const [n, e] of Object.entries(Yn)) for (const t of e) Vt[t] = n;
|
|
1466
|
+
const In = /* @__PURE__ */ new Set([..."まみむめもばびぶべぼぱぴぷぺぽ"]), Nn = /* @__PURE__ */ new Set([..."あいうえおぁぃぅぇぉ"]), Yt = { ゃ: "a", ゅ: "u", ょ: "o" }, Xn = /* @__PURE__ */ new Set([..."、。,.,.!?!? …"]), jn = (n) => n.replace(/[ァ-ヶ]/g, (e) => String.fromCharCode(e.charCodeAt(0) - 96));
|
|
1467
|
+
function Cn(n, e = 0.14) {
|
|
1462
1468
|
const t = [];
|
|
1463
|
-
for (const r of
|
|
1469
|
+
for (const r of jn(n)) {
|
|
1464
1470
|
const a = t[t.length - 1];
|
|
1465
|
-
if (
|
|
1466
|
-
a.vowel =
|
|
1471
|
+
if (Yt[r] && a) {
|
|
1472
|
+
a.vowel = Yt[r];
|
|
1467
1473
|
continue;
|
|
1468
1474
|
}
|
|
1469
1475
|
if (r === "ー" && a) {
|
|
@@ -1478,27 +1484,27 @@ function Xn(n, e = 0.14) {
|
|
|
1478
1484
|
t.push({ vowel: "n", dur: e, onset: null });
|
|
1479
1485
|
continue;
|
|
1480
1486
|
}
|
|
1481
|
-
if (
|
|
1487
|
+
if (Xn.has(r)) {
|
|
1482
1488
|
t.push({ vowel: "n", dur: e * 2.2, onset: null });
|
|
1483
1489
|
continue;
|
|
1484
1490
|
}
|
|
1485
|
-
const s =
|
|
1486
|
-
s && t.push({ vowel: s, dur: e, onset:
|
|
1491
|
+
const s = Vt[r];
|
|
1492
|
+
s && t.push({ vowel: s, dur: e, onset: In.has(r) ? "lips" : Nn.has(r) ? null : "consonant" });
|
|
1487
1493
|
}
|
|
1488
1494
|
return t;
|
|
1489
1495
|
}
|
|
1490
|
-
function
|
|
1496
|
+
function zn(n, e) {
|
|
1491
1497
|
let t = 0;
|
|
1492
1498
|
for (const r of n) {
|
|
1493
1499
|
if (e < t + r.dur) {
|
|
1494
|
-
const a = (e - t) / r.dur, s = We[r.vowel],
|
|
1495
|
-
return { open: s.open *
|
|
1500
|
+
const a = (e - t) / r.dur, s = We[r.vowel], l = r.onset === "lips" ? 0.05 : r.onset === "consonant" ? 0.45 : 1, m = a < 0.35 ? l + (1 - l) * (a / 0.35) : 1;
|
|
1501
|
+
return { open: s.open * m, form: s.form, vowel: r.vowel };
|
|
1496
1502
|
}
|
|
1497
1503
|
t += r.dur;
|
|
1498
1504
|
}
|
|
1499
1505
|
return null;
|
|
1500
1506
|
}
|
|
1501
|
-
const et = { ...xt, ...wt },
|
|
1507
|
+
const et = { ...xt, ...wt }, It = { amp: 1, stiff: 1.8 }, Pn = /^(angle|bodyAngle|armAngle|handAngle)/, $n = /* @__PURE__ */ new Set([
|
|
1502
1508
|
"eyeOpen",
|
|
1503
1509
|
"eyeOpenL",
|
|
1504
1510
|
"eyeSmileL",
|
|
@@ -1512,14 +1518,14 @@ const et = { ...xt, ...wt }, Yt = { amp: 1, stiff: 1.8 }, Cn = /^(angle|bodyAngl
|
|
|
1512
1518
|
const r = Math.min(1, Math.max(0, (t - n) / (e - n)));
|
|
1513
1519
|
return r * r * (3 - 2 * r);
|
|
1514
1520
|
};
|
|
1515
|
-
function
|
|
1516
|
-
const t = Math.floor(n), r = n - t, a = (
|
|
1517
|
-
const
|
|
1518
|
-
return
|
|
1521
|
+
function Nt(n, e) {
|
|
1522
|
+
const t = Math.floor(n), r = n - t, a = (l) => {
|
|
1523
|
+
const m = Math.sin((l + e * 57.3) * 127.1) * 43758.5453;
|
|
1524
|
+
return m - Math.floor(m);
|
|
1519
1525
|
}, s = r * r * (3 - 2 * r);
|
|
1520
1526
|
return (a(t) * (1 - s) + a(t + 1) * s) * 2 - 1;
|
|
1521
1527
|
}
|
|
1522
|
-
const we = (n, e) =>
|
|
1528
|
+
const we = (n, e) => Nt(n, e) * 0.7 + Nt(n * 2.3, e + 9) * 0.3, me = (n, e, t) => Math.max(e, Math.min(t, n)), qt = {
|
|
1523
1529
|
normal: { label: "Neutral", p: {} },
|
|
1524
1530
|
smile: { label: "Smile", p: { eyeOpen: 0, eyeSmile: 1, blush: 0.35, browY: 0.2 } },
|
|
1525
1531
|
shy: { label: "Blush", p: { eyeOpen: 0.78, eyeSmile: 0.5, blush: 1, browAngle: -0.5, browY: -0.1, glance: [0.7, 0.35] } },
|
|
@@ -1533,14 +1539,14 @@ const we = (n, e) => It(n, e) * 0.7 + It(n * 2.3, e + 9) * 0.3, fe = (n, e, t) =
|
|
|
1533
1539
|
angryTalk: { label: "angry", p: { eyeOpen: 0.72, browAngle: 0.85, browY: -0.55, mouthForm: 0.2 } },
|
|
1534
1540
|
surprisedTalk: { label: "surprised", p: { eyeOpen: 1.18, browY: 0.9, mouthForm: 0.9 } },
|
|
1535
1541
|
relaxedTalk: { label: "relaxed", p: { eyeOpen: 0.82, eyeSmile: 0.35, blush: 0.15, browY: 0.1 } }
|
|
1536
|
-
},
|
|
1542
|
+
}, Xt = {
|
|
1537
1543
|
happy: ["happyTalk", "nod"],
|
|
1538
1544
|
sad: ["sadTalk", "sigh"],
|
|
1539
1545
|
angry: ["angryTalk", "no"],
|
|
1540
1546
|
surprised: ["surprisedTalk", "surprise"],
|
|
1541
1547
|
relaxed: ["relaxedTalk", "sway"],
|
|
1542
1548
|
neutral: ["normal", null]
|
|
1543
|
-
},
|
|
1549
|
+
}, Dn = {
|
|
1544
1550
|
gazeX: [260, 0.9],
|
|
1545
1551
|
gazeY: [260, 0.9],
|
|
1546
1552
|
angleX: [55, 0.72],
|
|
@@ -1551,7 +1557,7 @@ const we = (n, e) => It(n, e) * 0.7 + It(n * 2.3, e + 9) * 0.3, fe = (n, e, t) =
|
|
|
1551
1557
|
armAngle: [20, 0.85],
|
|
1552
1558
|
handAngle: [30, 0.8]
|
|
1553
1559
|
};
|
|
1554
|
-
class
|
|
1560
|
+
class Hn {
|
|
1555
1561
|
/** @param {number[]} gazeCenter */
|
|
1556
1562
|
constructor(e) {
|
|
1557
1563
|
this.mode = "auto", this.P = Object.fromEntries(De.map((t) => [t.id, t.def])), this.manual = { ...this.P }, this.cur = { ...this.P }, this.vel = Object.fromEntries(De.map((t) => [t.id, 0])), this.expr = "normal", this.exprMix = {}, this.t = 0, this.blink = { t: 0, start: 1.5, double: !1 }, this.gaze = { x: 0, y: 0, next: 0 }, this.tap = { next: 4, until: -1 }, this.pointer = null, this.faceCenter = [...e], this.lipOpen = null, this.lipForm = 0, this.speaking = !1, this.voice = 0, this.mouth = 0, this.vowel = "a", this.vowelForm = 0, this.syllableArmed = !0, this.voicePeak = 0, this.voiceTrough = 0, this.kana = null, this.lipHold = null, this.emotionUntil = 0, this.talkGain = 1, this.play = null, this.autoMotion = !0, this.nextAuto = 14, this.autoIdle = !0, this.nextIdle = 3, this.lastAuto = null, this.onMotion = null;
|
|
@@ -1571,15 +1577,15 @@ class $n {
|
|
|
1571
1577
|
}
|
|
1572
1578
|
/** `playMotion: false` changes only the face (a caller that picks motions itself). */
|
|
1573
1579
|
setEmotion(e, { playMotion: t = !0 } = {}) {
|
|
1574
|
-
const r =
|
|
1580
|
+
const r = Xt[e] ?? Xt.neutral;
|
|
1575
1581
|
this.expr = r[0], this.emotionUntil = 1 / 0, r[1] && t && this.playMotion(r[1]);
|
|
1576
1582
|
}
|
|
1577
1583
|
/** Mouth shapes from kana text, without audio (preview / tuning). */
|
|
1578
1584
|
/** @param {string} text @param {{ speed?: number, loop?: boolean }} [options] */
|
|
1579
1585
|
speakKana(e, { speed: t, loop: r = !1 } = {}) {
|
|
1580
1586
|
this.lipHold = null;
|
|
1581
|
-
const a =
|
|
1582
|
-
this.kana = a.length ? { moras: a, t: 0, loop: r, duration: a.reduce((s,
|
|
1587
|
+
const a = Cn(e, t === void 0 ? 0.14 : 1 / me(Number(t) || 7, 4, 12));
|
|
1588
|
+
this.kana = a.length ? { moras: a, t: 0, loop: r, duration: a.reduce((s, l) => s + l.dur, 0) } : null;
|
|
1583
1589
|
}
|
|
1584
1590
|
holdMouth(e) {
|
|
1585
1591
|
this.kana = null, this.lipHold = Object.hasOwn(We, e) ? e : null;
|
|
@@ -1598,11 +1604,11 @@ class $n {
|
|
|
1598
1604
|
// the dip before each mora even when a loud voice never gets quiet.
|
|
1599
1605
|
speechMouth(e) {
|
|
1600
1606
|
if (this.kana || this.lipHold) {
|
|
1601
|
-
let
|
|
1602
|
-
if (this.lipHold ?
|
|
1607
|
+
let i;
|
|
1608
|
+
if (this.lipHold ? i = We[this.lipHold] : (this.kana.t += e, this.kana.loop && (this.kana.t %= this.kana.duration), i = zn(this.kana.moras, this.kana.t)), !i)
|
|
1603
1609
|
return this.kana = null, this.mouth > 0.01 ? [this.mouth *= 0.6, this.vowelForm] : null;
|
|
1604
|
-
const u =
|
|
1605
|
-
return this.mouth += (
|
|
1610
|
+
const u = i.open > this.mouth ? 1 - Math.exp(-e * 30) : 1 - Math.exp(-e * 22);
|
|
1611
|
+
return this.mouth += (i.open - this.mouth) * u, i.form !== null && (this.vowelForm = i.form), [this.mouth, this.vowelForm];
|
|
1606
1612
|
}
|
|
1607
1613
|
const t = this.speaking ? this.voice : 0, r = 1 - Math.exp(-e * 5);
|
|
1608
1614
|
this.voicePeak = t > this.voicePeak ? t : this.voicePeak + (t - this.voicePeak) * r, this.voiceTrough = t < this.voiceTrough ? t : this.voiceTrough + (t - this.voiceTrough) * r;
|
|
@@ -1610,11 +1616,11 @@ class $n {
|
|
|
1610
1616
|
if (t < a * 0.6) this.syllableArmed = !0;
|
|
1611
1617
|
else if (this.syllableArmed && t > a * 0.8 && t > 0.1) {
|
|
1612
1618
|
this.syllableArmed = !1;
|
|
1613
|
-
const
|
|
1614
|
-
this.vowel =
|
|
1619
|
+
const i = Math.random();
|
|
1620
|
+
this.vowel = i < 0.4 ? "a" : i < 0.58 ? "o" : i < 0.74 ? "e" : i < 0.88 ? "i" : "u";
|
|
1615
1621
|
}
|
|
1616
|
-
const s = this.voicePeak - this.voiceTrough,
|
|
1617
|
-
return this.mouth += (
|
|
1622
|
+
const s = this.voicePeak - this.voiceTrough, l = s < a * 0.3 ? 1 : Math.max(0, (t - this.voiceTrough) / s), m = We[this.vowel ?? "a"], b = Math.min(1, Math.pow(t, 0.7) * 1.15) * Math.pow(l, 0.3), d = this.speaking ? Math.min(0.95, b) * (0.45 + 0.55 * m.open / 0.9) : 0, p = d > this.mouth ? 1 - Math.exp(-e * 40) : 1 - Math.exp(-e * 32);
|
|
1623
|
+
return this.mouth += (d - this.mouth) * p, this.speaking && (this.vowelForm = m.form), this.speaking || this.mouth > 0.01 ? [this.mouth, this.vowelForm] : null;
|
|
1618
1624
|
}
|
|
1619
1625
|
// Breathing: inhale ~40% of the cycle, a slower exhale, a short pause at the bottom,
|
|
1620
1626
|
// and a period that drifts between ~3.2 and 4.6 s so it never looks metronomic.
|
|
@@ -1640,78 +1646,78 @@ class $n {
|
|
|
1640
1646
|
update(e) {
|
|
1641
1647
|
this.t += e;
|
|
1642
1648
|
const t = this.t, r = {};
|
|
1643
|
-
for (const
|
|
1649
|
+
for (const y of De) r[y.id] = y.def;
|
|
1644
1650
|
if (this.mode === "manual")
|
|
1645
1651
|
Object.assign(r, this.manual);
|
|
1646
1652
|
else if (this.mode === "auto") {
|
|
1647
1653
|
if (r.angleX = we(t * 0.18, 1) * 10 + this.gaze.x * 11, r.angleY = we(t * 0.15, 2) * 6 - 1 + this.gaze.y * 7, r.angleZ = we(t * 0.12, 3) * 10, r.bodyAngleX = we(t * 0.1, 4) * 5, r.bodyAngleZ = we(t * 0.09, 5) * 4, r.armAngle = we(t * 0.14, 6) * 5, r.handAngle = we(t * 0.21, 7) * 5, t > this.gaze.next) {
|
|
1648
|
-
const
|
|
1649
|
-
this.gaze.x =
|
|
1654
|
+
const y = Math.random();
|
|
1655
|
+
this.gaze.x = y < 0.45 ? 0 : (Math.random() * 2 - 1) * 0.8, this.gaze.y = y < 0.45 ? 0 : (Math.random() * 2 - 1) * 0.5, this.gaze.next = t + 0.8 + Math.random() * 2.5;
|
|
1650
1656
|
}
|
|
1651
1657
|
if (r.gazeX = this.gaze.x + r.angleX / 60, r.gazeY = this.gaze.y + r.angleY / 60, t > this.tap.next && (this.tap.until = t + 1.1, this.tap.next = t + 5 + Math.random() * 6), this.speaking) {
|
|
1652
1658
|
this.nextIdle = Math.max(this.nextIdle, t + 2.5), this.nextAuto = Math.max(this.nextAuto, t + 6);
|
|
1653
|
-
const
|
|
1654
|
-
this.talkNod = (this.talkNod ?? 0) + (this.voice * 7 *
|
|
1659
|
+
const y = this.talkGain;
|
|
1660
|
+
this.talkNod = (this.talkNod ?? 0) + (this.voice * 7 * y - (this.talkNod ?? 0)) * Math.min(1, e * 6), r.angleY -= this.talkNod, r.angleX += we(t * 0.6, 11) * 5 * y, r.angleZ += we(t * 0.5, 12) * 4 * y;
|
|
1655
1661
|
}
|
|
1656
|
-
!this.speaking && t > this.emotionUntil && (this.expr = "normal", this.emotionUntil = 1 / 0), this.speaking || (!this.play && this.autoMotion && t > this.nextAuto ? (this.playRandom(Object.keys(xt).filter((
|
|
1662
|
+
!this.speaking && t > this.emotionUntil && (this.expr = "normal", this.emotionUntil = 1 / 0), this.speaking || (!this.play && this.autoMotion && t > this.nextAuto ? (this.playRandom(Object.keys(xt).filter((y) => y !== "surprise")), this.nextAuto = t + 15 + Math.random() * 10, this.nextIdle = Math.max(this.nextIdle, t + 5)) : !this.play && this.autoIdle && t > this.nextIdle && (this.playRandom(Object.keys(wt)), this.nextIdle = t + 5 + Math.random() * 5));
|
|
1657
1663
|
} else if (this.mode === "mouse" && this.pointer) {
|
|
1658
|
-
const
|
|
1659
|
-
r.angleX =
|
|
1664
|
+
const y = (this.pointer[0] - this.faceCenter[0]) / 500, c = (this.pointer[1] - this.faceCenter[1]) / 500;
|
|
1665
|
+
r.angleX = me(y * 30, -30, 30), r.angleY = me(-c * 30, -30, 30), r.angleZ = me(-y * c * 25, -12, 12), r.bodyAngleX = me(y * 10, -10, 10) * 0.6, r.gazeX = me(y * 1.4, -1, 1), r.gazeY = me(-c * 1.4, -1, 1), r.handAngle = me(y * 4, -5, 5);
|
|
1660
1666
|
}
|
|
1661
1667
|
this.mode !== "manual" && (r.breath = this.breathValue(e), t < this.tap.until && (r.fingerTap = Math.max(0, Math.sin((this.tap.until - t) * Math.PI * 3.6)) ** 2));
|
|
1662
1668
|
let a = null, s = 0;
|
|
1663
1669
|
if (this.play) {
|
|
1664
|
-
const
|
|
1665
|
-
if (this.play.t += e, this.play.t >=
|
|
1670
|
+
const y = et[this.play.id];
|
|
1671
|
+
if (this.play.t += e, this.play.t >= y.dur)
|
|
1666
1672
|
this.play = null, this.onMotion?.(null);
|
|
1667
1673
|
else {
|
|
1668
1674
|
a = {};
|
|
1669
|
-
for (const [c,
|
|
1670
|
-
a[c] =
|
|
1671
|
-
s = Ze(0, 0.15, this.play.t) * (1 - Ze(
|
|
1672
|
-
for (const [c,
|
|
1673
|
-
|
|
1675
|
+
for (const [c, v] of Object.entries(y.tracks))
|
|
1676
|
+
a[c] = Un(v, this.play.t) * (y.idle && Pn.test(c) ? It.amp : 1);
|
|
1677
|
+
s = Ze(0, 0.15, this.play.t) * (1 - Ze(y.dur - 0.25, y.dur, this.play.t));
|
|
1678
|
+
for (const [c, v] of Object.entries(a))
|
|
1679
|
+
Bn.has(c) ? r[c] += v : c === "breath" ? r[c] += (v - r[c]) * s : $n.has(c) || (r[c] = Math.max(r[c], Math.max(0, v)));
|
|
1674
1680
|
}
|
|
1675
1681
|
}
|
|
1676
1682
|
this.mode !== "manual" && (r.angleY += r.breath * 1.6);
|
|
1677
|
-
const
|
|
1678
|
-
eyeOpen:
|
|
1679
|
-
eyeOpenL:
|
|
1680
|
-
eyeSmileL:
|
|
1681
|
-
eyeSmile:
|
|
1682
|
-
mouthOpen:
|
|
1683
|
-
mouthForm:
|
|
1684
|
-
blush:
|
|
1685
|
-
browY:
|
|
1686
|
-
browAngle:
|
|
1687
|
-
gx:
|
|
1688
|
-
gy:
|
|
1689
|
-
},
|
|
1690
|
-
for (const
|
|
1691
|
-
this.exprMix[
|
|
1692
|
-
const
|
|
1693
|
-
for (const
|
|
1694
|
-
const c =
|
|
1683
|
+
const l = qt[this.expr].p, m = ["eyeOpen", "eyeOpenL", "eyeSmileL", "eyeSmile", "mouthOpen", "mouthForm", "blush", "browY", "browAngle", "gx", "gy"], b = {
|
|
1684
|
+
eyeOpen: l.eyeOpen ?? 1,
|
|
1685
|
+
eyeOpenL: l.eyeOpenL ?? l.eyeOpen ?? 1,
|
|
1686
|
+
eyeSmileL: l.eyeSmileL ?? l.eyeSmile ?? 0,
|
|
1687
|
+
eyeSmile: l.eyeSmile ?? 0,
|
|
1688
|
+
mouthOpen: l.mouthOpen ?? 0,
|
|
1689
|
+
mouthForm: l.mouthForm ?? 0,
|
|
1690
|
+
blush: l.blush ?? 0,
|
|
1691
|
+
browY: l.browY ?? 0,
|
|
1692
|
+
browAngle: l.browAngle ?? 0,
|
|
1693
|
+
gx: l.glance?.[0] ?? 0,
|
|
1694
|
+
gy: l.glance?.[1] ?? 0
|
|
1695
|
+
}, d = 1 - Math.exp(-e * 9);
|
|
1696
|
+
for (const y of m)
|
|
1697
|
+
this.exprMix[y] === void 0 && (this.exprMix[y] = b[y]), this.exprMix[y] += (b[y] - this.exprMix[y]) * d;
|
|
1698
|
+
const p = this.exprMix, i = {};
|
|
1699
|
+
for (const y of De) {
|
|
1700
|
+
const c = y.id;
|
|
1695
1701
|
if (this.mode === "manual" && !a) {
|
|
1696
|
-
|
|
1702
|
+
i[c] = r[c], this.cur[c] = r[c], this.vel[c] = 0;
|
|
1697
1703
|
continue;
|
|
1698
1704
|
}
|
|
1699
|
-
let [
|
|
1700
|
-
a && /^angle|^body/.test(c) && (et[this.play?.id ?? ""]?.idle ? (
|
|
1701
|
-
const o = 2 * Math.sqrt(
|
|
1702
|
-
this.vel[c] += (
|
|
1705
|
+
let [v, x] = Dn[c] ?? [120, 0.95];
|
|
1706
|
+
a && /^angle|^body/.test(c) && (et[this.play?.id ?? ""]?.idle ? (v *= It.stiff, x = 0.8) : /^angle/.test(c) && (v *= 4.5, x = 0.75));
|
|
1707
|
+
const o = 2 * Math.sqrt(v) * x;
|
|
1708
|
+
this.vel[c] += (v * (r[c] - this.cur[c]) - o * this.vel[c]) * e, this.cur[c] += this.vel[c] * e, i[c] = this.cur[c];
|
|
1703
1709
|
}
|
|
1704
1710
|
let u = 1;
|
|
1705
|
-
if (this.mode !== "manual" ? (u = this.blinkValue(e),
|
|
1706
|
-
const
|
|
1707
|
-
|
|
1708
|
-
}, c = (
|
|
1709
|
-
"eyeOpen" in a && (
|
|
1710
|
-
for (const
|
|
1711
|
-
|
|
1711
|
+
if (this.mode !== "manual" ? (u = this.blinkValue(e), i.eyeROpen = p.eyeOpen * u, i.eyeLOpen = p.eyeOpenL * u, i.eyeSmile = p.eyeSmile, i.eyeSmileL = p.eyeSmileL, i.mouthOpen = p.mouthOpen, i.mouthForm = p.mouthForm, i.blush = p.blush, i.browY = p.browY + (i.angleY > 0 ? i.angleY / 60 : 0) - (1 - u) * 0.18, i.browAngle = p.browAngle, i.gazeX = me(i.gazeX + p.gx, -1, 1), i.gazeY = me(i.gazeY + p.gy, -1, 1)) : i.eyeSmileL = i.eyeSmile, a) {
|
|
1712
|
+
const y = (v, x) => {
|
|
1713
|
+
i[v] += (x - i[v]) * s;
|
|
1714
|
+
}, c = (v) => Math.min(1.3, Math.max(0, v));
|
|
1715
|
+
"eyeOpen" in a && (y("eyeROpen", c(a.eyeOpen) * u), "eyeOpenL" in a || y("eyeLOpen", c(a.eyeOpen) * u)), "eyeOpenL" in a && y("eyeLOpen", c(a.eyeOpenL) * u), "eyeSmile" in a && (y("eyeSmile", a.eyeSmile), "eyeSmileL" in a || y("eyeSmileL", a.eyeSmile)), "eyeSmileL" in a && y("eyeSmileL", a.eyeSmileL);
|
|
1716
|
+
for (const v of ["mouthOpen", "mouthForm", "blush", "browY", "browAngle"])
|
|
1717
|
+
v in a && y(v, v === "mouthOpen" || v === "blush" ? Math.max(0, a[v]) : a[v]);
|
|
1712
1718
|
}
|
|
1713
1719
|
const S = this.speechMouth(e);
|
|
1714
|
-
return S ? (this.lipOpen = S[0], this.lipForm = S[1]) : this.lipOpen !== null && !this.speaking && !this.kana && (this.lipOpen = null), this.lipOpen !== null && (
|
|
1720
|
+
return S ? (this.lipOpen = S[0], this.lipForm = S[1]) : this.lipOpen !== null && !this.speaking && !this.kana && (this.lipOpen = null), this.lipOpen !== null && (i.mouthOpen = Math.max(i.mouthOpen * 0.3, this.lipOpen), i.mouthForm = me(this.lipForm, -1, 1)), this.P = i, i;
|
|
1715
1721
|
}
|
|
1716
1722
|
}
|
|
1717
1723
|
const At = {
|
|
@@ -1723,9 +1729,9 @@ const At = {
|
|
|
1723
1729
|
angry: "angryTalk",
|
|
1724
1730
|
sad: "sadTalk",
|
|
1725
1731
|
wink: "wink"
|
|
1726
|
-
},
|
|
1727
|
-
function
|
|
1728
|
-
const e =
|
|
1732
|
+
}, Zn = { sad: { pitch: -6, gy: -0.45 } }, Fe = (n, e, t) => Math.max(e, Math.min(t, n)), Be = Object.freeze({ eyeOpen: 1, eyeOpenL: 1, eyeSmile: 0, eyeSmileL: 0, blush: 0, browY: 0, browAngle: 0, mouthOpen: 0, gx: 0, gy: 0, pitch: 0 });
|
|
1733
|
+
function Wn(n) {
|
|
1734
|
+
const e = qt[At[n]]?.p ?? {}, t = Zn[n] ?? {};
|
|
1729
1735
|
return {
|
|
1730
1736
|
eyeOpen: e.eyeOpen ?? 1,
|
|
1731
1737
|
eyeOpenL: e.eyeOpenL ?? e.eyeOpen ?? 1,
|
|
@@ -1740,11 +1746,11 @@ function Hn(n) {
|
|
|
1740
1746
|
pitch: t.pitch ?? 0
|
|
1741
1747
|
};
|
|
1742
1748
|
}
|
|
1743
|
-
function
|
|
1749
|
+
function Gn(n, e) {
|
|
1744
1750
|
const t = { ...n };
|
|
1745
1751
|
return t.eyeROpen = (n.eyeROpen ?? 1) * e.eyeOpen, t.eyeLOpen = (n.eyeLOpen ?? 1) * e.eyeOpenL, t.eyeSmile = Math.max(n.eyeSmile ?? 0, e.eyeSmile), t.eyeSmileL = Math.max(n.eyeSmileL ?? n.eyeSmile ?? 0, e.eyeSmileL), t.blush = Math.max(n.blush ?? 0, e.blush), t.browY = Fe((n.browY ?? 0) + e.browY, -1, 1), t.browAngle = Fe((n.browAngle ?? 0) + e.browAngle, -1, 1), t.mouthOpen = Math.max(n.mouthOpen ?? 0, e.mouthOpen), t.gazeX = Fe((n.gazeX ?? 0) + e.gx, -1, 1), t.gazeY = Fe((n.gazeY ?? 0) + e.gy, -1, 1), t.angleY = Fe((n.angleY ?? 0) + e.pitch, -30, 30), t;
|
|
1746
1752
|
}
|
|
1747
|
-
class
|
|
1753
|
+
class Vn {
|
|
1748
1754
|
/** @type {keyof typeof OVERLAY_EXPRESSIONS} */
|
|
1749
1755
|
name = "neutral";
|
|
1750
1756
|
mix = { ...Be };
|
|
@@ -1762,19 +1768,19 @@ class Wn {
|
|
|
1762
1768
|
apply(e, t) {
|
|
1763
1769
|
if (!this.active)
|
|
1764
1770
|
return this.mix = { ...Be }, e;
|
|
1765
|
-
const r =
|
|
1771
|
+
const r = Wn(this.name), a = 1 - Math.exp(-Math.max(0, t) * 12);
|
|
1766
1772
|
for (const s of Object.keys(Be)) this.mix[s] += (r[s] - this.mix[s]) * a;
|
|
1767
|
-
return
|
|
1773
|
+
return Gn(e, this.mix);
|
|
1768
1774
|
}
|
|
1769
1775
|
}
|
|
1770
|
-
const
|
|
1771
|
-
async function
|
|
1776
|
+
const jt = ["ball", "low", "crease", "lash"], tt = /* @__PURE__ */ new Map(), nt = /* @__PURE__ */ new Map();
|
|
1777
|
+
async function Ct(n) {
|
|
1772
1778
|
return nt.has(n) || nt.set(n, fetch(n).then((e) => {
|
|
1773
1779
|
if (!e.ok) throw new Error(`failed to load ${n}`);
|
|
1774
1780
|
return e.json();
|
|
1775
1781
|
})), nt.get(n);
|
|
1776
1782
|
}
|
|
1777
|
-
function
|
|
1783
|
+
function zt(n) {
|
|
1778
1784
|
if (tt.has(n)) return tt.get(n);
|
|
1779
1785
|
const e = new Promise((t, r) => {
|
|
1780
1786
|
const a = new Image();
|
|
@@ -1782,126 +1788,126 @@ function Ct(n) {
|
|
|
1782
1788
|
});
|
|
1783
1789
|
return tt.set(n, e), e;
|
|
1784
1790
|
}
|
|
1785
|
-
function
|
|
1791
|
+
function Jt(n, e) {
|
|
1786
1792
|
const t = document.createElement("canvas");
|
|
1787
1793
|
t.width = n.width, t.height = n.height;
|
|
1788
1794
|
const r = t.getContext("2d");
|
|
1789
1795
|
r.drawImage(n, 0, 0);
|
|
1790
1796
|
const a = r.getImageData(0, 0, t.width, t.height).data, s = new Uint8Array(t.width * t.height);
|
|
1791
|
-
for (let
|
|
1797
|
+
for (let l = 0; l < s.length; l++) s[l] = a[l * 4 + e];
|
|
1792
1798
|
return s;
|
|
1793
1799
|
}
|
|
1794
|
-
const Ue = (n) =>
|
|
1795
|
-
function
|
|
1796
|
-
const [t, r] = n.t.pivot, a = n.dir, s = n.pts,
|
|
1797
|
-
const
|
|
1798
|
-
return
|
|
1799
|
-
},
|
|
1800
|
-
for (let S = 0; S <
|
|
1801
|
-
const
|
|
1802
|
-
u[S] = x + (
|
|
1800
|
+
const Ue = (n) => Jt(n, 3);
|
|
1801
|
+
function qn(n, e) {
|
|
1802
|
+
const [t, r] = n.t.pivot, a = n.dir, s = n.pts, l = (S, y, c) => {
|
|
1803
|
+
const v = Math.min(1, Math.max(0, (c - S) / (y - S)));
|
|
1804
|
+
return v * v * (3 - 2 * v);
|
|
1805
|
+
}, m = Math.cos(n.phi[0]), b = Math.sin(n.phi[0]), d = Math.cos(n.phi[1]), p = Math.sin(n.phi[1]), i = e.rest, u = e.pos;
|
|
1806
|
+
for (let S = 0; S < i.length; S += 2) {
|
|
1807
|
+
const y = i[S] - t, c = i[S + 1] - r, v = y * a[0] + c * a[1], x = s[0][0] + y * m - c * b, o = s[0][1] + y * b + c * m, h = y - a[0] * n.L1, T = c - a[1] * n.L1, f = s[1][0] + h * d - T * p, w = s[1][1] + h * p + T * d, B = l(n.L1 * 0.55, n.L1 * 1.35, v);
|
|
1808
|
+
u[S] = x + (f - x) * B, u[S + 1] = o + (w - o) * B;
|
|
1803
1809
|
}
|
|
1804
1810
|
}
|
|
1805
|
-
async function
|
|
1811
|
+
async function Jn(n, e) {
|
|
1806
1812
|
if (!e.assets && e.assetsBase === void 0)
|
|
1807
1813
|
throw new Error("createMeshAvatar requires assets or assetsBase.");
|
|
1808
|
-
const t = e.rig, r =
|
|
1814
|
+
const t = e.rig, r = dn(t), {
|
|
1809
1815
|
IMG: a,
|
|
1810
1816
|
EYES: s,
|
|
1811
|
-
baseWeights:
|
|
1812
|
-
deformBase:
|
|
1813
|
-
eyePartY:
|
|
1814
|
-
eyePartAlpha:
|
|
1815
|
-
handWeights:
|
|
1816
|
-
handFrame:
|
|
1817
|
+
baseWeights: l,
|
|
1818
|
+
deformBase: m,
|
|
1819
|
+
eyePartY: b,
|
|
1820
|
+
eyePartAlpha: d,
|
|
1821
|
+
handWeights: p,
|
|
1822
|
+
handFrame: i,
|
|
1817
1823
|
deformHand: u,
|
|
1818
1824
|
TASSELS: S
|
|
1819
|
-
} = r, { Renderer:
|
|
1825
|
+
} = r, { Renderer: y, buildGrid: c } = Ln(r, t), { Physics: v } = kn(r, t), { createSprites: x } = _n(r, t), o = (e.assetsBase ?? "").replace(/\/?$/, "/"), h = (M, R) => {
|
|
1820
1826
|
if (e.assets) {
|
|
1821
1827
|
if (!e.assets[M]) throw new Error(`Missing project asset: ${M}`);
|
|
1822
1828
|
return e.assets[M];
|
|
1823
1829
|
}
|
|
1824
1830
|
return `${o}${M}${R === void 0 ? "" : `?b=${R}`}`;
|
|
1825
|
-
},
|
|
1826
|
-
for (let M = 0; M <
|
|
1827
|
-
const R =
|
|
1828
|
-
O.push(
|
|
1831
|
+
}, T = await Ct(h("layers.json")), f = ["base", ...t.hand ? ["hand"] : [], ...S.map((M) => M.name), ...[0, 1].flatMap((M) => jt.map((R) => `eye${M}_${R}`)), "hairmask"], w = Object.fromEntries(await Promise.all(f.map(async (M) => [M, await zt(h(`${M}.png`, T.build))]))), B = Jt(w.hairmask, 0), Y = (M, R) => B[Math.min(a.h - 1, Math.max(0, Math.round(R))) * a.w + Math.min(a.w - 1, Math.max(0, Math.round(M)))] / 255, I = new y(n, { padTop: e.padTop ?? t.view.padTop, padSide: e.padSide ?? t.view.padSide, fit: e.fit }), _ = { base: [0, 0, a.w, a.h], ...T.layers }, U = c(_.base, t.mesh.baseCell, Ue(w.base), w.base.width, t.mesh.fine), O = [];
|
|
1832
|
+
for (let M = 0; M < U.rest.length / 2; M++) {
|
|
1833
|
+
const R = U.rest[M * 2], W = U.rest[M * 2 + 1];
|
|
1834
|
+
O.push(l(R, W, Y(R, W)));
|
|
1829
1835
|
}
|
|
1830
|
-
|
|
1831
|
-
const
|
|
1836
|
+
I.addLayer("base", w.base, U, { face: !0 });
|
|
1837
|
+
const C = [];
|
|
1832
1838
|
s.forEach((M, R) => {
|
|
1833
|
-
for (const
|
|
1834
|
-
const
|
|
1835
|
-
for (let
|
|
1836
|
-
const
|
|
1837
|
-
|
|
1839
|
+
for (const W of jt) {
|
|
1840
|
+
const Q = `eye${R}_${W}`, ne = c(_[Q], W === "ball" ? t.mesh.eyeBallCell : t.mesh.eyeCell, Ue(w[Q]), w[Q].width), ee = [];
|
|
1841
|
+
for (let oe = 0; oe < ne.rest.length / 2; oe++) ee.push(l(ne.rest[oe * 2], ne.rest[oe * 2 + 1], 0));
|
|
1842
|
+
const he = I.addLayer(Q, w[Q], ne, { eyeBall: W === "ball" ? R : void 0 });
|
|
1843
|
+
C.push({ e: M, eye: R, part: W, mesh: ne, W: ee, layer: he });
|
|
1838
1844
|
}
|
|
1839
1845
|
});
|
|
1840
|
-
let
|
|
1846
|
+
let $ = null;
|
|
1841
1847
|
try {
|
|
1842
1848
|
{
|
|
1843
|
-
const M = await
|
|
1844
|
-
|
|
1849
|
+
const M = await Ct(h("sprites/sprites.json")), R = Object.fromEntries(await Promise.all(Object.keys(M.layers).map(async (W) => [W, await zt(h(`sprites/${W}.png`, M.build))])));
|
|
1850
|
+
$ = x(I, M, R, c, Ue);
|
|
1845
1851
|
}
|
|
1846
1852
|
} catch (M) {
|
|
1847
1853
|
console.warn("eye / mouth sprites not loaded:", M);
|
|
1848
1854
|
}
|
|
1849
|
-
const
|
|
1850
|
-
const R = c(
|
|
1851
|
-
return
|
|
1852
|
-
}),
|
|
1853
|
-
for (let M = 0; M <
|
|
1854
|
-
t.hand &&
|
|
1855
|
-
const
|
|
1856
|
-
|
|
1855
|
+
const V = S.map((M) => {
|
|
1856
|
+
const R = c(_[M.name], t.mesh.tasselCell, Ue(w[M.name]), w[M.name].width);
|
|
1857
|
+
return I.addLayer(M.name, w[M.name], R);
|
|
1858
|
+
}), X = t.hand ? c(_.hand, t.mesh.handCell, Ue(w.hand), w.hand.width) : { rest: [], pos: [] }, D = [];
|
|
1859
|
+
for (let M = 0; M < X.rest.length / 2; M++) D.push(p(X.rest[M * 2], X.rest[M * 2 + 1]));
|
|
1860
|
+
t.hand && I.addLayer("hand", w.hand, X);
|
|
1861
|
+
const H = new v(), L = new Hn(t.view.gazeCenter ?? [t.head.cx, t.head.cy]), Z = /* @__PURE__ */ new Set();
|
|
1862
|
+
L.onMotion = (M) => {
|
|
1857
1863
|
for (const R of Z) R(M);
|
|
1858
1864
|
};
|
|
1859
|
-
let P = {},
|
|
1860
|
-
const
|
|
1861
|
-
function
|
|
1862
|
-
const R = { ...
|
|
1863
|
-
for (const [
|
|
1864
|
-
|
|
1865
|
-
const
|
|
1866
|
-
return
|
|
1867
|
-
}
|
|
1868
|
-
function
|
|
1869
|
-
const R =
|
|
1865
|
+
let P = {}, G = 1, J = {};
|
|
1866
|
+
const q = new Vn(), g = [0, 0];
|
|
1867
|
+
function A(M) {
|
|
1868
|
+
const R = { ...L.update(M) };
|
|
1869
|
+
for (const [Q, ne] of Object.entries(P)) R[Q] = G === 1 ? ne : (R[Q] ?? 0) + (ne - (R[Q] ?? 0)) * G;
|
|
1870
|
+
L.lipOpen !== null && (R.mouthOpen = L.P.mouthOpen, (!e.preserveMouthForm || P.mouthForm === void 0) && (R.mouthForm = L.P.mouthForm));
|
|
1871
|
+
const W = q.apply(R, M);
|
|
1872
|
+
return J = W, W;
|
|
1873
|
+
}
|
|
1874
|
+
function E(M) {
|
|
1875
|
+
const R = A(M), W = H.step(R, M), Q = U.pos, ne = U.rest;
|
|
1870
1876
|
for (let K = 0; K < O.length; K++)
|
|
1871
|
-
|
|
1872
|
-
const
|
|
1873
|
-
for (const K of
|
|
1874
|
-
const Pe =
|
|
1875
|
-
K.layer.alpha =
|
|
1877
|
+
m(ne[K * 2], ne[K * 2 + 1], O[K], R, W, g), Q[K * 2] = g[0], Q[K * 2 + 1] = g[1];
|
|
1878
|
+
const ee = (K) => $ ? 1 : K;
|
|
1879
|
+
for (const K of C) {
|
|
1880
|
+
const Pe = ee(K.eye === 0 ? R.eyeROpen : R.eyeLOpen), Tt = K.eye === 0 ? R.eyeSmile : R.eyeSmileL ?? R.eyeSmile;
|
|
1881
|
+
K.layer.alpha = d(K.part, Pe, Tt);
|
|
1876
1882
|
const Ot = K.mesh.rest, Rt = K.mesh.pos;
|
|
1877
1883
|
for (let Se = 0; Se < K.W.length; Se++) {
|
|
1878
|
-
const Lt = Ot[Se * 2],
|
|
1879
|
-
|
|
1884
|
+
const Lt = Ot[Se * 2], mn = Ot[Se * 2 + 1];
|
|
1885
|
+
m(Lt, b(K.e, K.part, Lt, mn, Pe, Tt), K.W[Se], R, W, g), Rt[Se * 2] = g[0], Rt[Se * 2 + 1] = g[1];
|
|
1880
1886
|
}
|
|
1881
1887
|
}
|
|
1882
|
-
const
|
|
1883
|
-
if (
|
|
1884
|
-
const
|
|
1885
|
-
for (let K = 0; K <
|
|
1886
|
-
u(ke[K * 2], ke[K * 2 + 1],
|
|
1887
|
-
|
|
1888
|
+
const he = $?.update(R, W, M, Fn(q.name, L.mode === "manual" ? null : L.expr));
|
|
1889
|
+
if (he) for (const K of C) he.eyes[K.eye] && (K.layer.alpha = 0);
|
|
1890
|
+
const oe = X.pos, ke = X.rest, fn = i(R);
|
|
1891
|
+
for (let K = 0; K < D.length; K++)
|
|
1892
|
+
u(ke[K * 2], ke[K * 2 + 1], D[K], R, fn, g), oe[K * 2] = g[0], oe[K * 2 + 1] = g[1];
|
|
1893
|
+
H.chains.forEach((K, Pe) => qn(K, V[Pe].mesh));
|
|
1888
1894
|
const ze = 7;
|
|
1889
|
-
|
|
1895
|
+
I.draw({
|
|
1890
1896
|
angleX: R.angleX,
|
|
1891
1897
|
angleY: R.angleY,
|
|
1892
1898
|
angleZ: R.angleZ,
|
|
1893
1899
|
eyes: [
|
|
1894
|
-
|
|
1900
|
+
ee(R.eyeROpen),
|
|
1895
1901
|
R.eyeSmile,
|
|
1896
1902
|
R.gazeX * ze,
|
|
1897
1903
|
-R.gazeY * ze * 0.6,
|
|
1898
|
-
|
|
1904
|
+
ee(R.eyeLOpen),
|
|
1899
1905
|
R.eyeSmileL ?? R.eyeSmile,
|
|
1900
1906
|
R.gazeX * ze * 0.85,
|
|
1901
1907
|
-R.gazeY * ze * 0.6
|
|
1902
1908
|
],
|
|
1903
1909
|
// with sprites the drawn mouths replace the shader-painted one
|
|
1904
|
-
mouthOpen:
|
|
1910
|
+
mouthOpen: $ ? 0 : R.mouthOpen,
|
|
1905
1911
|
mouthForm: R.mouthForm,
|
|
1906
1912
|
cheek: R.blush,
|
|
1907
1913
|
showMesh: !1,
|
|
@@ -1909,77 +1915,77 @@ async function Vn(n, e) {
|
|
|
1909
1915
|
joints: []
|
|
1910
1916
|
});
|
|
1911
1917
|
}
|
|
1912
|
-
let
|
|
1913
|
-
const
|
|
1918
|
+
let k = 0, N = performance.now(), z = !1;
|
|
1919
|
+
const F = (M) => {
|
|
1914
1920
|
const R = Math.min(0.05, (M - N) / 1e3);
|
|
1915
|
-
N = M,
|
|
1921
|
+
N = M, E(R), k = requestAnimationFrame(F);
|
|
1916
1922
|
};
|
|
1917
|
-
return e.manual || (
|
|
1923
|
+
return e.manual || (k = requestAnimationFrame(F)), {
|
|
1918
1924
|
motions: [
|
|
1919
1925
|
...Object.entries(xt).map(([M, R]) => ({ id: M, label: R.label, idle: !1 })),
|
|
1920
1926
|
...Object.entries(wt).map(([M, R]) => ({ id: M, label: R.label, idle: !0 }))
|
|
1921
1927
|
],
|
|
1922
1928
|
setParameters(M, R = 1) {
|
|
1923
|
-
P = { ...M },
|
|
1929
|
+
P = { ...M }, G = Math.min(1, Math.max(0, Number(R) || 0));
|
|
1924
1930
|
},
|
|
1925
1931
|
getParameters() {
|
|
1926
|
-
return { ...
|
|
1932
|
+
return { ...J };
|
|
1927
1933
|
},
|
|
1928
1934
|
/** 0..1 loudness of the voice being played (e.g. normalised RMS). */
|
|
1929
1935
|
setVoiceLevel(M) {
|
|
1930
|
-
|
|
1936
|
+
L.setVoiceLevel(M);
|
|
1931
1937
|
},
|
|
1932
1938
|
/** true while TTS audio is playing: idle motions pause and the head nods along. */
|
|
1933
1939
|
setSpeaking(M) {
|
|
1934
|
-
|
|
1940
|
+
L.setSpeaking(M);
|
|
1935
1941
|
},
|
|
1936
1942
|
/** AITuber OnAir emotion tag: happy / sad / angry / surprised / relaxed / neutral (or null). */
|
|
1937
1943
|
setEmotion(M, R) {
|
|
1938
|
-
|
|
1944
|
+
L.setEmotion(M, R);
|
|
1939
1945
|
},
|
|
1940
1946
|
/** Live expression layered over tracking (see OVERLAY_EXPRESSIONS); 'neutral' clears it. */
|
|
1941
1947
|
setExpression(M) {
|
|
1942
|
-
|
|
1948
|
+
q.set(M);
|
|
1943
1949
|
},
|
|
1944
1950
|
getExpression() {
|
|
1945
|
-
return { name:
|
|
1951
|
+
return { name: q.name, active: q.active };
|
|
1946
1952
|
},
|
|
1947
1953
|
/** How much the head moves with the voice while speaking (1 = default, calmer below). */
|
|
1948
1954
|
setTalkGain(M) {
|
|
1949
|
-
|
|
1955
|
+
L.talkGain = Math.max(0, Number(M) || 0);
|
|
1950
1956
|
},
|
|
1951
1957
|
/** Play a motion or idle motion by id (see `motions`). */
|
|
1952
1958
|
play(M) {
|
|
1953
|
-
|
|
1959
|
+
L.hasMotion(M) && L.playMotion(M);
|
|
1954
1960
|
},
|
|
1955
1961
|
/** Move the mouth through the vowels of kana text (no audio; for previews). */
|
|
1956
1962
|
speakKana(M, R) {
|
|
1957
|
-
|
|
1963
|
+
L.speakKana(String(M ?? ""), R);
|
|
1958
1964
|
},
|
|
1959
1965
|
holdMouth(M) {
|
|
1960
|
-
|
|
1966
|
+
L.holdMouth(M);
|
|
1961
1967
|
},
|
|
1962
1968
|
stopLipSync() {
|
|
1963
|
-
|
|
1969
|
+
L.stopLipSync();
|
|
1964
1970
|
},
|
|
1965
1971
|
getLipSyncState() {
|
|
1966
|
-
return
|
|
1972
|
+
return L.getLipSyncState();
|
|
1967
1973
|
},
|
|
1968
1974
|
setAutoIdle(M) {
|
|
1969
|
-
|
|
1975
|
+
L.autoIdle = !!M;
|
|
1970
1976
|
},
|
|
1971
1977
|
setLighting(M) {
|
|
1972
|
-
|
|
1978
|
+
I.setLighting(M);
|
|
1973
1979
|
},
|
|
1974
1980
|
getLightingStats() {
|
|
1975
|
-
return { ...
|
|
1981
|
+
return { ...I.lightingStats };
|
|
1976
1982
|
},
|
|
1977
1983
|
setAutoMotion(M) {
|
|
1978
|
-
|
|
1984
|
+
L.autoMotion = !!M;
|
|
1979
1985
|
},
|
|
1980
1986
|
/** Hair / tassel sway multiplier (1 = default). */
|
|
1981
1987
|
setSwayGain(M) {
|
|
1982
|
-
|
|
1988
|
+
H.gain = M;
|
|
1983
1989
|
},
|
|
1984
1990
|
/** Called with the motion id when a motion starts and with null when it ends. */
|
|
1985
1991
|
onMotion(M) {
|
|
@@ -1987,22 +1993,22 @@ async function Vn(n, e) {
|
|
|
1987
1993
|
},
|
|
1988
1994
|
/** Advance the simulation by `sec` and draw (for tests / hidden tabs). */
|
|
1989
1995
|
advance(M, R = 60) {
|
|
1990
|
-
if (!
|
|
1991
|
-
if (M === 0)
|
|
1992
|
-
else for (let
|
|
1996
|
+
if (!z)
|
|
1997
|
+
if (M === 0) E(0);
|
|
1998
|
+
else for (let W = 0; W < Math.round(M * R); W++) E(1 / R);
|
|
1993
1999
|
},
|
|
1994
2000
|
/** Update motion and lip sync without drawing a hidden preview. */
|
|
1995
2001
|
advanceParameters(M) {
|
|
1996
|
-
|
|
2002
|
+
z || A(M);
|
|
1997
2003
|
},
|
|
1998
2004
|
destroy() {
|
|
1999
|
-
|
|
2005
|
+
z || (z = !0, cancelAnimationFrame(k), Z.clear(), I.destroy());
|
|
2000
2006
|
}
|
|
2001
2007
|
};
|
|
2002
2008
|
}
|
|
2003
|
-
const
|
|
2004
|
-
async function
|
|
2005
|
-
return
|
|
2009
|
+
const Tr = Object.keys(At);
|
|
2010
|
+
async function Kn(n, e) {
|
|
2011
|
+
return Jn(n, { ...e, rig: bt(e.rig) });
|
|
2006
2012
|
}
|
|
2007
2013
|
function Le(n) {
|
|
2008
2014
|
if (!n || typeof n != "object" || Array.isArray(n))
|
|
@@ -2020,25 +2026,25 @@ function Le(n) {
|
|
|
2020
2026
|
`));
|
|
2021
2027
|
return r;
|
|
2022
2028
|
}
|
|
2023
|
-
function
|
|
2029
|
+
function Kt(n) {
|
|
2024
2030
|
return Le({ format: "mesh-avatar", version: 1, name: n });
|
|
2025
2031
|
}
|
|
2026
2032
|
const rt = (n) => !!n && typeof n == "object" && !Array.isArray(n), Te = (n, e) => Array.isArray(n) && n.length === e && n.every((t) => typeof t == "number" && Number.isFinite(t)), at = (n, e) => Object.hasOwn(n, e);
|
|
2027
|
-
function
|
|
2033
|
+
function Qt(n) {
|
|
2028
2034
|
const e = [];
|
|
2029
2035
|
function t(u, S = !0) {
|
|
2030
2036
|
if (!at(n, u)) {
|
|
2031
2037
|
S && e.push(`${u}: missing file`);
|
|
2032
2038
|
return;
|
|
2033
2039
|
}
|
|
2034
|
-
const
|
|
2035
|
-
if (!(
|
|
2040
|
+
const y = n[u];
|
|
2041
|
+
if (!(y instanceof Uint8Array)) {
|
|
2036
2042
|
e.push(`${u}: JSON bytes are required`);
|
|
2037
2043
|
return;
|
|
2038
2044
|
}
|
|
2039
2045
|
let c;
|
|
2040
2046
|
try {
|
|
2041
|
-
c = JSON.parse(new TextDecoder("utf-8", { fatal: !0 }).decode(
|
|
2047
|
+
c = JSON.parse(new TextDecoder("utf-8", { fatal: !0 }).decode(y));
|
|
2042
2048
|
} catch {
|
|
2043
2049
|
e.push(`${u}: invalid UTF-8 JSON`);
|
|
2044
2050
|
return;
|
|
@@ -2049,82 +2055,82 @@ function Kt(n) {
|
|
|
2049
2055
|
}
|
|
2050
2056
|
return c;
|
|
2051
2057
|
}
|
|
2052
|
-
function r(u, S,
|
|
2053
|
-
return u.version === 1 ||
|
|
2058
|
+
function r(u, S, y = !0) {
|
|
2059
|
+
return u.version === 1 || y && u.version === void 0 ? !0 : (e.push(`${S}.version: unsupported version ${JSON.stringify(u.version) ?? "missing"} (expected 1)`), !1);
|
|
2054
2060
|
}
|
|
2055
2061
|
function a(u) {
|
|
2056
2062
|
if (!at(n, u)) {
|
|
2057
2063
|
e.push(`${u}: missing file`);
|
|
2058
2064
|
return;
|
|
2059
2065
|
}
|
|
2060
|
-
const S = n[u],
|
|
2061
|
-
(!Number.isSafeInteger(
|
|
2066
|
+
const S = n[u], y = S instanceof Uint8Array ? S.byteLength : S?.size;
|
|
2067
|
+
(!Number.isSafeInteger(y) || y <= 0) && e.push(`${u}: expected a non-empty file`);
|
|
2062
2068
|
}
|
|
2063
|
-
function s(u, S,
|
|
2069
|
+
function s(u, S, y, c) {
|
|
2064
2070
|
if (!rt(u)) {
|
|
2065
2071
|
e.push(`${S}.layers: expected a layer rectangle map`);
|
|
2066
2072
|
return;
|
|
2067
2073
|
}
|
|
2068
|
-
for (const [
|
|
2069
|
-
const o = `${S}.layers.${
|
|
2070
|
-
if (!/^[A-Za-z0-9_-]+$/.test(
|
|
2074
|
+
for (const [v, x] of Object.entries(u)) {
|
|
2075
|
+
const o = `${S}.layers.${v}`;
|
|
2076
|
+
if (!/^[A-Za-z0-9_-]+$/.test(v)) {
|
|
2071
2077
|
e.push(`${o}: expected a safe layer name (letters, digits, hyphens or underscores)`);
|
|
2072
2078
|
continue;
|
|
2073
2079
|
}
|
|
2074
|
-
!Te(x, 4) || !x.every(Number.isInteger) || x[0] < 0 || x[1] < 0 || x[2] <= 0 || x[3] <= 0 ? e.push(`${o}: expected [x, y, width, height] with non-negative integer origins and positive integer dimensions`) : c && (x[0] + x[2] > c[0] || x[1] + x[3] > c[1]) && e.push(`${o}: rectangle must stay inside the image`), a(`${
|
|
2080
|
+
!Te(x, 4) || !x.every(Number.isInteger) || x[0] < 0 || x[1] < 0 || x[2] <= 0 || x[3] <= 0 ? e.push(`${o}: expected [x, y, width, height] with non-negative integer origins and positive integer dimensions`) : c && (x[0] + x[2] > c[0] || x[1] + x[3] > c[1]) && e.push(`${o}: rectangle must stay inside the image`), a(`${y}/${v}.png`);
|
|
2075
2081
|
}
|
|
2076
2082
|
return u;
|
|
2077
2083
|
}
|
|
2078
|
-
function
|
|
2084
|
+
function l(u, S) {
|
|
2079
2085
|
(typeof u.build != "string" || !u.build.trim()) && e.push(`${S}.build: expected a non-empty string`);
|
|
2080
2086
|
}
|
|
2081
|
-
const
|
|
2082
|
-
if (
|
|
2087
|
+
const m = t("avatar.json", !1);
|
|
2088
|
+
if (m)
|
|
2083
2089
|
try {
|
|
2084
|
-
Le(
|
|
2090
|
+
Le(m);
|
|
2085
2091
|
} catch (u) {
|
|
2086
2092
|
e.push(u.message);
|
|
2087
2093
|
}
|
|
2088
|
-
const
|
|
2089
|
-
let
|
|
2090
|
-
if (
|
|
2091
|
-
const u =
|
|
2092
|
-
e.push(...u.map((S) => `rig.json: ${S}`)), u.length || (
|
|
2094
|
+
const b = t("rig.json");
|
|
2095
|
+
let d;
|
|
2096
|
+
if (b && r(b, "rig.json", !1)) {
|
|
2097
|
+
const u = Gt(b);
|
|
2098
|
+
e.push(...u.map((S) => `rig.json: ${S}`)), u.length || (d = b);
|
|
2093
2099
|
}
|
|
2094
2100
|
a("built/base.png"), a("built/hairmask.png");
|
|
2095
|
-
const
|
|
2096
|
-
if (
|
|
2097
|
-
|
|
2101
|
+
const p = t("built/layers.json");
|
|
2102
|
+
if (p && r(p, "built/layers.json")) {
|
|
2103
|
+
l(p, "built/layers.json");
|
|
2098
2104
|
let u;
|
|
2099
|
-
!Te(
|
|
2100
|
-
const S = s(
|
|
2101
|
-
if (
|
|
2102
|
-
const
|
|
2103
|
-
...
|
|
2104
|
-
...
|
|
2105
|
-
...(
|
|
2105
|
+
!Te(p.size, 2) || !p.size.every((y) => Number.isInteger(y) && y > 0) ? e.push("built/layers.json.size: expected [width, height] with positive integer dimensions") : (u = p.size, d && (u[0] !== d.image.width || u[1] !== d.image.height) && e.push("built/layers.json.size: must match rig.json.image"));
|
|
2106
|
+
const S = s(p.layers, "built/layers.json", "built", u);
|
|
2107
|
+
if (d && S) {
|
|
2108
|
+
const y = [
|
|
2109
|
+
...d.eyes.flatMap((c, v) => ["ball", "low", "crease", "lash"].map((x) => `eye${v}_${x}`)),
|
|
2110
|
+
...d.hand ? ["hand"] : [],
|
|
2111
|
+
...(d.accessories ?? []).map((c) => c.name)
|
|
2106
2112
|
];
|
|
2107
|
-
for (const c of
|
|
2113
|
+
for (const c of y) at(S, c) || e.push(`built/layers.json.layers.${c}: missing required layer`);
|
|
2108
2114
|
}
|
|
2109
|
-
!Array.isArray(
|
|
2110
|
-
const
|
|
2111
|
-
if (!rt(
|
|
2112
|
-
e.push(`${
|
|
2115
|
+
!Array.isArray(p.eyes) || p.eyes.length !== 2 ? e.push("built/layers.json.eyes: expected two eye curves") : p.eyes.forEach((y, c) => {
|
|
2116
|
+
const v = `built/layers.json.eyes[${c}]`;
|
|
2117
|
+
if (!rt(y)) {
|
|
2118
|
+
e.push(`${v}: expected an object`);
|
|
2113
2119
|
return;
|
|
2114
2120
|
}
|
|
2115
|
-
Te([
|
|
2121
|
+
Te([y.x0, y.x1], 2) && y.x0 < y.x1 || e.push(`${v}: expected finite x0 < x1`);
|
|
2116
2122
|
for (const o of ["top", "bot"])
|
|
2117
|
-
Te(
|
|
2118
|
-
if (Te(
|
|
2119
|
-
const
|
|
2120
|
-
(Array.isArray(
|
|
2123
|
+
Te(y[o], 24) || e.push(`${v}.${o}: expected 24 finite numbers`);
|
|
2124
|
+
if (Te(y.top, 24) && Te(y.bot, 24) && y.top.some((o, h) => o > y.bot[h]) && e.push(`${v}.top: must not exceed bottom curve`), d) for (const o of ["x0", "x1", "top", "bot"]) {
|
|
2125
|
+
const h = y[o], T = d.eyes[c][o];
|
|
2126
|
+
(Array.isArray(T) ? Te(h, T.length) && h.every((w, B) => w === T[B]) : h === T) || e.push(`${v}.${o}: must match rig.json.eyes[${c}].${o}`);
|
|
2121
2127
|
}
|
|
2122
2128
|
});
|
|
2123
2129
|
}
|
|
2124
|
-
const
|
|
2125
|
-
return
|
|
2130
|
+
const i = t("built/sprites/sprites.json", !1);
|
|
2131
|
+
return i && r(i, "built/sprites/sprites.json") && (l(i, "built/sprites/sprites.json"), s(i.layers, "built/sprites/sprites.json", "built/sprites", d ? [d.image.width, d.image.height] : void 0)), e;
|
|
2126
2132
|
}
|
|
2127
|
-
var ae = Uint8Array,
|
|
2133
|
+
var ae = Uint8Array, ue = Uint16Array, Mt = Int32Array, qe = new ae([
|
|
2128
2134
|
0,
|
|
2129
2135
|
0,
|
|
2130
2136
|
0,
|
|
@@ -2193,55 +2199,55 @@ var ae = Uint8Array, ce = Uint16Array, Mt = Int32Array, qe = new ae([
|
|
|
2193
2199
|
/* unused */
|
|
2194
2200
|
0,
|
|
2195
2201
|
0
|
|
2196
|
-
]), ct = new ae([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]),
|
|
2197
|
-
for (var t = new
|
|
2202
|
+
]), ct = new ae([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]), en = function(n, e) {
|
|
2203
|
+
for (var t = new ue(31), r = 0; r < 31; ++r)
|
|
2198
2204
|
t[r] = e += 1 << n[r - 1];
|
|
2199
2205
|
for (var a = new Mt(t[30]), r = 1; r < 30; ++r)
|
|
2200
2206
|
for (var s = t[r]; s < t[r + 1]; ++s)
|
|
2201
2207
|
a[s] = s - t[r] << 5 | r;
|
|
2202
2208
|
return { b: t, r: a };
|
|
2203
|
-
},
|
|
2204
|
-
|
|
2205
|
-
var
|
|
2206
|
-
for (var
|
|
2207
|
-
var Me = (
|
|
2208
|
-
Me = (Me & 52428) >> 2 | (Me & 13107) << 2, Me = (Me & 61680) >> 4 | (Me & 3855) << 4, ft[
|
|
2209
|
+
}, tn = en(qe, 2), nn = tn.b, ut = tn.r;
|
|
2210
|
+
nn[28] = 258, ut[258] = 28;
|
|
2211
|
+
var rn = en(Je, 0), Qn = rn.b, Pt = rn.r, ft = new ue(32768);
|
|
2212
|
+
for (var re = 0; re < 32768; ++re) {
|
|
2213
|
+
var Me = (re & 43690) >> 1 | (re & 21845) << 1;
|
|
2214
|
+
Me = (Me & 52428) >> 2 | (Me & 13107) << 2, Me = (Me & 61680) >> 4 | (Me & 3855) << 4, ft[re] = ((Me & 65280) >> 8 | (Me & 255) << 8) >> 1;
|
|
2209
2215
|
}
|
|
2210
2216
|
var be = (function(n, e, t) {
|
|
2211
|
-
for (var r = n.length, a = 0, s = new
|
|
2217
|
+
for (var r = n.length, a = 0, s = new ue(e); a < r; ++a)
|
|
2212
2218
|
n[a] && ++s[n[a] - 1];
|
|
2213
|
-
var
|
|
2219
|
+
var l = new ue(e);
|
|
2214
2220
|
for (a = 1; a < e; ++a)
|
|
2215
|
-
|
|
2216
|
-
var
|
|
2221
|
+
l[a] = l[a - 1] + s[a - 1] << 1;
|
|
2222
|
+
var m;
|
|
2217
2223
|
if (t) {
|
|
2218
|
-
|
|
2219
|
-
var
|
|
2224
|
+
m = new ue(1 << e);
|
|
2225
|
+
var b = 15 - e;
|
|
2220
2226
|
for (a = 0; a < r; ++a)
|
|
2221
2227
|
if (n[a])
|
|
2222
|
-
for (var
|
|
2223
|
-
|
|
2228
|
+
for (var d = a << 4 | n[a], p = e - n[a], i = l[n[a] - 1]++ << p, u = i | (1 << p) - 1; i <= u; ++i)
|
|
2229
|
+
m[ft[i] >> b] = d;
|
|
2224
2230
|
} else
|
|
2225
|
-
for (
|
|
2226
|
-
n[a] && (
|
|
2227
|
-
return
|
|
2231
|
+
for (m = new ue(r), a = 0; a < r; ++a)
|
|
2232
|
+
n[a] && (m[a] = ft[l[n[a] - 1]++] >> 15 - n[a]);
|
|
2233
|
+
return m;
|
|
2228
2234
|
}), Ee = new ae(288);
|
|
2229
|
-
for (var
|
|
2230
|
-
Ee[
|
|
2231
|
-
for (var
|
|
2232
|
-
Ee[
|
|
2233
|
-
for (var
|
|
2234
|
-
Ee[
|
|
2235
|
-
for (var
|
|
2236
|
-
Ee[
|
|
2235
|
+
for (var re = 0; re < 144; ++re)
|
|
2236
|
+
Ee[re] = 8;
|
|
2237
|
+
for (var re = 144; re < 256; ++re)
|
|
2238
|
+
Ee[re] = 9;
|
|
2239
|
+
for (var re = 256; re < 280; ++re)
|
|
2240
|
+
Ee[re] = 7;
|
|
2241
|
+
for (var re = 280; re < 288; ++re)
|
|
2242
|
+
Ee[re] = 8;
|
|
2237
2243
|
var je = new ae(32);
|
|
2238
|
-
for (var
|
|
2239
|
-
je[
|
|
2240
|
-
var
|
|
2244
|
+
for (var re = 0; re < 32; ++re)
|
|
2245
|
+
je[re] = 5;
|
|
2246
|
+
var er = /* @__PURE__ */ be(Ee, 9, 0), tr = /* @__PURE__ */ be(Ee, 9, 1), nr = /* @__PURE__ */ be(je, 5, 0), rr = /* @__PURE__ */ be(je, 5, 1), ot = function(n) {
|
|
2241
2247
|
for (var e = n[0], t = 1; t < n.length; ++t)
|
|
2242
2248
|
n[t] > e && (e = n[t]);
|
|
2243
2249
|
return e;
|
|
2244
|
-
},
|
|
2250
|
+
}, pe = function(n, e, t) {
|
|
2245
2251
|
var r = e / 8 | 0;
|
|
2246
2252
|
return (n[r] | n[r + 1] << 8) >> (e & 7) & t;
|
|
2247
2253
|
}, st = function(n, e) {
|
|
@@ -2251,7 +2257,7 @@ var Kn = /* @__PURE__ */ be(Ee, 9, 0), Qn = /* @__PURE__ */ be(Ee, 9, 1), er = /
|
|
|
2251
2257
|
return (n + 7) / 8 | 0;
|
|
2252
2258
|
}, Ce = function(n, e, t) {
|
|
2253
2259
|
return (e == null || e < 0) && (e = 0), (t == null || t > n.length) && (t = n.length), new ae(n.subarray(e, t));
|
|
2254
|
-
},
|
|
2260
|
+
}, ar = [
|
|
2255
2261
|
"unexpected EOF",
|
|
2256
2262
|
"invalid block type",
|
|
2257
2263
|
"invalid length/literal",
|
|
@@ -2268,110 +2274,110 @@ var Kn = /* @__PURE__ */ be(Ee, 9, 0), Qn = /* @__PURE__ */ be(Ee, 9, 1), er = /
|
|
|
2268
2274
|
"stream finishing",
|
|
2269
2275
|
"invalid zip data"
|
|
2270
2276
|
// determined by unknown compression method
|
|
2271
|
-
],
|
|
2272
|
-
var r = new Error(e ||
|
|
2273
|
-
if (r.code = n, Error.captureStackTrace && Error.captureStackTrace(r,
|
|
2277
|
+
], le = function(n, e, t) {
|
|
2278
|
+
var r = new Error(e || ar[n]);
|
|
2279
|
+
if (r.code = n, Error.captureStackTrace && Error.captureStackTrace(r, le), !t)
|
|
2274
2280
|
throw r;
|
|
2275
2281
|
return r;
|
|
2276
|
-
},
|
|
2282
|
+
}, or = function(n, e, t, r) {
|
|
2277
2283
|
var a = n.length, s = r ? r.length : 0;
|
|
2278
2284
|
if (!a || e.f && !e.l)
|
|
2279
2285
|
return t || new ae(0);
|
|
2280
|
-
var
|
|
2281
|
-
|
|
2282
|
-
var
|
|
2283
|
-
var
|
|
2284
|
-
if (
|
|
2285
|
-
var M = new ae(Math.max(
|
|
2286
|
+
var l = !t, m = l || e.i != 2, b = e.i;
|
|
2287
|
+
l && (t = new ae(a * 3));
|
|
2288
|
+
var d = function(F) {
|
|
2289
|
+
var j = t.length;
|
|
2290
|
+
if (F > j) {
|
|
2291
|
+
var M = new ae(Math.max(j * 2, F));
|
|
2286
2292
|
M.set(t), t = M;
|
|
2287
2293
|
}
|
|
2288
|
-
},
|
|
2294
|
+
}, p = e.f || 0, i = e.p || 0, u = e.b || 0, S = e.l, y = e.d, c = e.m, v = e.n, x = a * 8;
|
|
2289
2295
|
do {
|
|
2290
2296
|
if (!S) {
|
|
2291
|
-
|
|
2292
|
-
var o =
|
|
2293
|
-
if (
|
|
2297
|
+
p = pe(n, i, 1);
|
|
2298
|
+
var o = pe(n, i + 1, 3);
|
|
2299
|
+
if (i += 3, o)
|
|
2294
2300
|
if (o == 1)
|
|
2295
|
-
S =
|
|
2301
|
+
S = tr, y = rr, c = 9, v = 5;
|
|
2296
2302
|
else if (o == 2) {
|
|
2297
|
-
var
|
|
2298
|
-
|
|
2299
|
-
for (var
|
|
2300
|
-
|
|
2301
|
-
|
|
2302
|
-
for (var O = ot(
|
|
2303
|
-
var
|
|
2304
|
-
|
|
2305
|
-
var
|
|
2306
|
-
if (
|
|
2307
|
-
|
|
2303
|
+
var w = pe(n, i, 31) + 257, B = pe(n, i + 10, 15) + 4, Y = w + pe(n, i + 5, 31) + 1;
|
|
2304
|
+
i += 14;
|
|
2305
|
+
for (var I = new ae(Y), _ = new ae(19), U = 0; U < B; ++U)
|
|
2306
|
+
_[ct[U]] = pe(n, i + U * 3, 7);
|
|
2307
|
+
i += B * 3;
|
|
2308
|
+
for (var O = ot(_), C = (1 << O) - 1, $ = be(_, O, 1), U = 0; U < Y; ) {
|
|
2309
|
+
var V = $[pe(n, i, C)];
|
|
2310
|
+
i += V & 15;
|
|
2311
|
+
var h = V >> 4;
|
|
2312
|
+
if (h < 16)
|
|
2313
|
+
I[U++] = h;
|
|
2308
2314
|
else {
|
|
2309
|
-
var
|
|
2310
|
-
for (
|
|
2311
|
-
|
|
2315
|
+
var X = 0, D = 0;
|
|
2316
|
+
for (h == 16 ? (D = 3 + pe(n, i, 3), i += 2, X = I[U - 1]) : h == 17 ? (D = 3 + pe(n, i, 7), i += 3) : h == 18 && (D = 11 + pe(n, i, 127), i += 7); D--; )
|
|
2317
|
+
I[U++] = X;
|
|
2312
2318
|
}
|
|
2313
2319
|
}
|
|
2314
|
-
var
|
|
2315
|
-
c = ot(
|
|
2320
|
+
var H = I.subarray(0, w), L = I.subarray(w);
|
|
2321
|
+
c = ot(H), v = ot(L), S = be(H, c, 1), y = be(L, v, 1);
|
|
2316
2322
|
} else
|
|
2317
|
-
|
|
2323
|
+
le(1);
|
|
2318
2324
|
else {
|
|
2319
|
-
var
|
|
2320
|
-
if (
|
|
2321
|
-
|
|
2325
|
+
var h = Et(i) + 4, T = n[h - 4] | n[h - 3] << 8, f = h + T;
|
|
2326
|
+
if (f > a) {
|
|
2327
|
+
b && le(0);
|
|
2322
2328
|
break;
|
|
2323
2329
|
}
|
|
2324
|
-
|
|
2330
|
+
m && d(u + T), t.set(n.subarray(h, f), u), e.b = u += T, e.p = i = f * 8, e.f = p;
|
|
2325
2331
|
continue;
|
|
2326
2332
|
}
|
|
2327
|
-
if (
|
|
2328
|
-
|
|
2333
|
+
if (i > x) {
|
|
2334
|
+
b && le(0);
|
|
2329
2335
|
break;
|
|
2330
2336
|
}
|
|
2331
2337
|
}
|
|
2332
|
-
|
|
2333
|
-
for (var Z = (1 << c) - 1, P = (1 <<
|
|
2334
|
-
var
|
|
2335
|
-
if (
|
|
2336
|
-
|
|
2338
|
+
m && d(u + 131072);
|
|
2339
|
+
for (var Z = (1 << c) - 1, P = (1 << v) - 1, G = i; ; G = i) {
|
|
2340
|
+
var X = S[st(n, i) & Z], J = X >> 4;
|
|
2341
|
+
if (i += X & 15, i > x) {
|
|
2342
|
+
b && le(0);
|
|
2337
2343
|
break;
|
|
2338
2344
|
}
|
|
2339
|
-
if (
|
|
2340
|
-
t[u++] =
|
|
2341
|
-
else if (
|
|
2342
|
-
|
|
2345
|
+
if (X || le(2), J < 256)
|
|
2346
|
+
t[u++] = J;
|
|
2347
|
+
else if (J == 256) {
|
|
2348
|
+
G = i, S = null;
|
|
2343
2349
|
break;
|
|
2344
2350
|
} else {
|
|
2345
|
-
var
|
|
2346
|
-
if (
|
|
2347
|
-
var
|
|
2348
|
-
|
|
2351
|
+
var q = J - 254;
|
|
2352
|
+
if (J > 264) {
|
|
2353
|
+
var U = J - 257, g = qe[U];
|
|
2354
|
+
q = pe(n, i, (1 << g) - 1) + nn[U], i += g;
|
|
2349
2355
|
}
|
|
2350
|
-
var
|
|
2351
|
-
|
|
2352
|
-
var
|
|
2353
|
-
if (
|
|
2354
|
-
var
|
|
2355
|
-
|
|
2356
|
+
var A = y[st(n, i) & P], E = A >> 4;
|
|
2357
|
+
A || le(3), i += A & 15;
|
|
2358
|
+
var L = Qn[E];
|
|
2359
|
+
if (E > 3) {
|
|
2360
|
+
var g = Je[E];
|
|
2361
|
+
L += st(n, i) & (1 << g) - 1, i += g;
|
|
2356
2362
|
}
|
|
2357
|
-
if (
|
|
2358
|
-
|
|
2363
|
+
if (i > x) {
|
|
2364
|
+
b && le(0);
|
|
2359
2365
|
break;
|
|
2360
2366
|
}
|
|
2361
|
-
|
|
2362
|
-
var
|
|
2363
|
-
if (u <
|
|
2364
|
-
var N = s -
|
|
2365
|
-
for (N + u < 0 &&
|
|
2367
|
+
m && d(u + 131072);
|
|
2368
|
+
var k = u + q;
|
|
2369
|
+
if (u < L) {
|
|
2370
|
+
var N = s - L, z = Math.min(L, k);
|
|
2371
|
+
for (N + u < 0 && le(3); u < z; ++u)
|
|
2366
2372
|
t[u] = r[N + u];
|
|
2367
2373
|
}
|
|
2368
|
-
for (; u <
|
|
2369
|
-
t[u] = t[u -
|
|
2374
|
+
for (; u < k; ++u)
|
|
2375
|
+
t[u] = t[u - L];
|
|
2370
2376
|
}
|
|
2371
2377
|
}
|
|
2372
|
-
e.l = S, e.p =
|
|
2373
|
-
} while (!
|
|
2374
|
-
return u != t.length &&
|
|
2378
|
+
e.l = S, e.p = G, e.b = u, e.f = p, S && (p = 1, e.m = c, e.d = y, e.n = v);
|
|
2379
|
+
} while (!p);
|
|
2380
|
+
return u != t.length && l ? Ce(t, 0, u) : t.subarray(0, u);
|
|
2375
2381
|
}, Ae = function(n, e, t) {
|
|
2376
2382
|
t <<= e & 7;
|
|
2377
2383
|
var r = e / 8 | 0;
|
|
@@ -2385,193 +2391,193 @@ var Kn = /* @__PURE__ */ be(Ee, 9, 0), Qn = /* @__PURE__ */ be(Ee, 9, 1), er = /
|
|
|
2385
2391
|
n[r] && t.push({ s: r, f: n[r] });
|
|
2386
2392
|
var a = t.length, s = t.slice();
|
|
2387
2393
|
if (!a)
|
|
2388
|
-
return { t:
|
|
2394
|
+
return { t: on, l: 0 };
|
|
2389
2395
|
if (a == 1) {
|
|
2390
|
-
var
|
|
2391
|
-
return
|
|
2396
|
+
var l = new ae(t[0].s + 1);
|
|
2397
|
+
return l[t[0].s] = 1, { t: l, l: 1 };
|
|
2392
2398
|
}
|
|
2393
|
-
t.sort(function(
|
|
2394
|
-
return
|
|
2399
|
+
t.sort(function(f, w) {
|
|
2400
|
+
return f.f - w.f;
|
|
2395
2401
|
}), t.push({ s: -1, f: 25001 });
|
|
2396
|
-
var
|
|
2397
|
-
for (t[0] = { s: -1, f:
|
|
2398
|
-
|
|
2402
|
+
var m = t[0], b = t[1], d = 0, p = 1, i = 2;
|
|
2403
|
+
for (t[0] = { s: -1, f: m.f + b.f, l: m, r: b }; p != a - 1; )
|
|
2404
|
+
m = t[t[d].f < t[i].f ? d++ : i++], b = t[d != p && t[d].f < t[i].f ? d++ : i++], t[p++] = { s: -1, f: m.f + b.f, l: m, r: b };
|
|
2399
2405
|
for (var u = s[0].s, r = 1; r < a; ++r)
|
|
2400
2406
|
s[r].s > u && (u = s[r].s);
|
|
2401
|
-
var S = new
|
|
2402
|
-
if (
|
|
2403
|
-
var r = 0, c = 0,
|
|
2404
|
-
for (s.sort(function(
|
|
2405
|
-
return S[
|
|
2407
|
+
var S = new ue(u + 1), y = mt(t[p - 1], S, 0);
|
|
2408
|
+
if (y > e) {
|
|
2409
|
+
var r = 0, c = 0, v = y - e, x = 1 << v;
|
|
2410
|
+
for (s.sort(function(w, B) {
|
|
2411
|
+
return S[B.s] - S[w.s] || w.f - B.f;
|
|
2406
2412
|
}); r < a; ++r) {
|
|
2407
2413
|
var o = s[r].s;
|
|
2408
2414
|
if (S[o] > e)
|
|
2409
|
-
c += x - (1 <<
|
|
2415
|
+
c += x - (1 << y - S[o]), S[o] = e;
|
|
2410
2416
|
else
|
|
2411
2417
|
break;
|
|
2412
2418
|
}
|
|
2413
|
-
for (c >>=
|
|
2414
|
-
var
|
|
2415
|
-
S[
|
|
2419
|
+
for (c >>= v; c > 0; ) {
|
|
2420
|
+
var h = s[r].s;
|
|
2421
|
+
S[h] < e ? c -= 1 << e - S[h]++ - 1 : ++r;
|
|
2416
2422
|
}
|
|
2417
2423
|
for (; r >= 0 && c; --r) {
|
|
2418
|
-
var
|
|
2419
|
-
S[
|
|
2424
|
+
var T = s[r].s;
|
|
2425
|
+
S[T] == e && (--S[T], ++c);
|
|
2420
2426
|
}
|
|
2421
|
-
|
|
2427
|
+
y = e;
|
|
2422
2428
|
}
|
|
2423
|
-
return { t: new ae(S), l:
|
|
2429
|
+
return { t: new ae(S), l: y };
|
|
2424
2430
|
}, mt = function(n, e, t) {
|
|
2425
2431
|
return n.s == -1 ? Math.max(mt(n.l, e, t + 1), mt(n.r, e, t + 1)) : e[n.s] = t;
|
|
2426
|
-
},
|
|
2432
|
+
}, $t = function(n) {
|
|
2427
2433
|
for (var e = n.length; e && !n[--e]; )
|
|
2428
2434
|
;
|
|
2429
|
-
for (var t = new
|
|
2430
|
-
t[r++] =
|
|
2431
|
-
},
|
|
2432
|
-
if (n[
|
|
2435
|
+
for (var t = new ue(++e), r = 0, a = n[0], s = 1, l = function(b) {
|
|
2436
|
+
t[r++] = b;
|
|
2437
|
+
}, m = 1; m <= e; ++m)
|
|
2438
|
+
if (n[m] == a && m != e)
|
|
2433
2439
|
++s;
|
|
2434
2440
|
else {
|
|
2435
2441
|
if (!a && s > 2) {
|
|
2436
2442
|
for (; s > 138; s -= 138)
|
|
2437
|
-
|
|
2438
|
-
s > 2 && (
|
|
2443
|
+
l(32754);
|
|
2444
|
+
s > 2 && (l(s > 10 ? s - 11 << 5 | 28690 : s - 3 << 5 | 12305), s = 0);
|
|
2439
2445
|
} else if (s > 3) {
|
|
2440
|
-
for (
|
|
2441
|
-
|
|
2442
|
-
s > 2 && (
|
|
2446
|
+
for (l(a), --s; s > 6; s -= 6)
|
|
2447
|
+
l(8304);
|
|
2448
|
+
s > 2 && (l(s - 3 << 5 | 8208), s = 0);
|
|
2443
2449
|
}
|
|
2444
2450
|
for (; s--; )
|
|
2445
|
-
|
|
2446
|
-
s = 1, a = n[
|
|
2451
|
+
l(a);
|
|
2452
|
+
s = 1, a = n[m];
|
|
2447
2453
|
}
|
|
2448
2454
|
return { c: t.subarray(0, r), n: e };
|
|
2449
2455
|
}, Ie = function(n, e) {
|
|
2450
2456
|
for (var t = 0, r = 0; r < e.length; ++r)
|
|
2451
2457
|
t += n[r] * e[r];
|
|
2452
2458
|
return t;
|
|
2453
|
-
},
|
|
2459
|
+
}, an = function(n, e, t) {
|
|
2454
2460
|
var r = t.length, a = Et(e + 2);
|
|
2455
2461
|
n[a] = r & 255, n[a + 1] = r >> 8, n[a + 2] = n[a] ^ 255, n[a + 3] = n[a + 1] ^ 255;
|
|
2456
2462
|
for (var s = 0; s < r; ++s)
|
|
2457
2463
|
n[a + s + 4] = t[s];
|
|
2458
2464
|
return (a + 4 + r) * 8;
|
|
2459
|
-
},
|
|
2460
|
-
Ae(e,
|
|
2461
|
-
for (var
|
|
2462
|
-
++
|
|
2463
|
-
for (var
|
|
2464
|
-
++
|
|
2465
|
-
for (var
|
|
2465
|
+
}, Dt = function(n, e, t, r, a, s, l, m, b, d, p) {
|
|
2466
|
+
Ae(e, p++, t), ++a[256];
|
|
2467
|
+
for (var i = it(a, 15), u = i.t, S = i.l, y = it(s, 15), c = y.t, v = y.l, x = $t(u), o = x.c, h = x.n, T = $t(c), f = T.c, w = T.n, B = new ue(19), Y = 0; Y < o.length; ++Y)
|
|
2468
|
+
++B[o[Y] & 31];
|
|
2469
|
+
for (var Y = 0; Y < f.length; ++Y)
|
|
2470
|
+
++B[f[Y] & 31];
|
|
2471
|
+
for (var I = it(B, 7), _ = I.t, U = I.l, O = 19; O > 4 && !_[ct[O - 1]]; --O)
|
|
2466
2472
|
;
|
|
2467
|
-
var
|
|
2468
|
-
if (
|
|
2469
|
-
return
|
|
2470
|
-
var
|
|
2471
|
-
if (Ae(e,
|
|
2472
|
-
|
|
2473
|
-
var Z = be(
|
|
2474
|
-
Ae(e,
|
|
2475
|
-
for (var
|
|
2476
|
-
Ae(e,
|
|
2477
|
-
|
|
2478
|
-
for (var P = [o,
|
|
2479
|
-
for (var
|
|
2480
|
-
var
|
|
2481
|
-
Ae(e,
|
|
2473
|
+
var C = d + 5 << 3, $ = Ie(a, Ee) + Ie(s, je) + l, V = Ie(a, u) + Ie(s, c) + l + 14 + 3 * O + Ie(B, _) + 2 * B[16] + 3 * B[17] + 7 * B[18];
|
|
2474
|
+
if (b >= 0 && C <= $ && C <= V)
|
|
2475
|
+
return an(e, p, n.subarray(b, b + d));
|
|
2476
|
+
var X, D, H, L;
|
|
2477
|
+
if (Ae(e, p, 1 + (V < $)), p += 2, V < $) {
|
|
2478
|
+
X = be(u, S, 0), D = u, H = be(c, v, 0), L = c;
|
|
2479
|
+
var Z = be(_, U, 0);
|
|
2480
|
+
Ae(e, p, h - 257), Ae(e, p + 5, w - 1), Ae(e, p + 10, O - 4), p += 14;
|
|
2481
|
+
for (var Y = 0; Y < O; ++Y)
|
|
2482
|
+
Ae(e, p + 3 * Y, _[ct[Y]]);
|
|
2483
|
+
p += 3 * O;
|
|
2484
|
+
for (var P = [o, f], G = 0; G < 2; ++G)
|
|
2485
|
+
for (var J = P[G], Y = 0; Y < J.length; ++Y) {
|
|
2486
|
+
var q = J[Y] & 31;
|
|
2487
|
+
Ae(e, p, Z[q]), p += _[q], q > 15 && (Ae(e, p, J[Y] >> 5 & 127), p += J[Y] >> 12);
|
|
2482
2488
|
}
|
|
2483
2489
|
} else
|
|
2484
|
-
|
|
2485
|
-
for (var
|
|
2486
|
-
var
|
|
2487
|
-
if (
|
|
2488
|
-
var
|
|
2489
|
-
Ye(e,
|
|
2490
|
-
var
|
|
2491
|
-
Ye(e,
|
|
2490
|
+
X = er, D = Ee, H = nr, L = je;
|
|
2491
|
+
for (var Y = 0; Y < m; ++Y) {
|
|
2492
|
+
var g = r[Y];
|
|
2493
|
+
if (g > 255) {
|
|
2494
|
+
var q = g >> 18 & 31;
|
|
2495
|
+
Ye(e, p, X[q + 257]), p += D[q + 257], q > 7 && (Ae(e, p, g >> 23 & 31), p += qe[q]);
|
|
2496
|
+
var A = g & 31;
|
|
2497
|
+
Ye(e, p, H[A]), p += L[A], A > 3 && (Ye(e, p, g >> 5 & 8191), p += Je[A]);
|
|
2492
2498
|
} else
|
|
2493
|
-
Ye(e,
|
|
2499
|
+
Ye(e, p, X[g]), p += D[g];
|
|
2494
2500
|
}
|
|
2495
|
-
return Ye(e,
|
|
2496
|
-
},
|
|
2497
|
-
var
|
|
2501
|
+
return Ye(e, p, X[256]), p + D[256];
|
|
2502
|
+
}, sr = /* @__PURE__ */ new Mt([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]), on = /* @__PURE__ */ new ae(0), ir = function(n, e, t, r, a, s) {
|
|
2503
|
+
var l = s.z || n.length, m = new ae(r + l + 5 * (1 + Math.ceil(l / 7e3)) + a), b = m.subarray(r, m.length - a), d = s.l, p = (s.r || 0) & 7;
|
|
2498
2504
|
if (e) {
|
|
2499
|
-
|
|
2500
|
-
for (var
|
|
2501
|
-
return (n[R] ^ n[R + 1] << x ^ n[R + 2] << o) &
|
|
2502
|
-
},
|
|
2503
|
-
var
|
|
2504
|
-
if (c[
|
|
2505
|
-
var
|
|
2506
|
-
if ((
|
|
2507
|
-
|
|
2508
|
-
for (var
|
|
2509
|
-
|
|
2510
|
-
for (var
|
|
2511
|
-
|
|
2505
|
+
p && (b[0] = s.r >> 3);
|
|
2506
|
+
for (var i = sr[e - 1], u = i >> 13, S = i & 8191, y = (1 << t) - 1, c = s.p || new ue(32768), v = s.h || new ue(y + 1), x = Math.ceil(t / 3), o = 2 * x, h = function(R) {
|
|
2507
|
+
return (n[R] ^ n[R + 1] << x ^ n[R + 2] << o) & y;
|
|
2508
|
+
}, T = new Mt(25e3), f = new ue(288), w = new ue(32), B = 0, Y = 0, I = s.i || 0, _ = 0, U = s.w || 0, O = 0; I + 2 < l; ++I) {
|
|
2509
|
+
var C = h(I), $ = I & 32767, V = v[C];
|
|
2510
|
+
if (c[$] = V, v[C] = $, U <= I) {
|
|
2511
|
+
var X = l - I;
|
|
2512
|
+
if ((B > 7e3 || _ > 24576) && (X > 423 || !d)) {
|
|
2513
|
+
p = Dt(n, b, 0, T, f, w, Y, _, O, I - O, p), _ = B = Y = 0, O = I;
|
|
2514
|
+
for (var D = 0; D < 286; ++D)
|
|
2515
|
+
f[D] = 0;
|
|
2516
|
+
for (var D = 0; D < 30; ++D)
|
|
2517
|
+
w[D] = 0;
|
|
2512
2518
|
}
|
|
2513
|
-
var
|
|
2514
|
-
if (
|
|
2515
|
-
for (var
|
|
2516
|
-
if (n[
|
|
2517
|
-
for (var
|
|
2519
|
+
var H = 2, L = 0, Z = S, P = $ - V & 32767;
|
|
2520
|
+
if (X > 2 && C == h(I - P))
|
|
2521
|
+
for (var G = Math.min(u, X) - 1, J = Math.min(32767, I), q = Math.min(258, X); P <= J && --Z && $ != V; ) {
|
|
2522
|
+
if (n[I + H] == n[I + H - P]) {
|
|
2523
|
+
for (var g = 0; g < q && n[I + g] == n[I + g - P]; ++g)
|
|
2518
2524
|
;
|
|
2519
|
-
if (
|
|
2520
|
-
if (
|
|
2525
|
+
if (g > H) {
|
|
2526
|
+
if (H = g, L = P, g > G)
|
|
2521
2527
|
break;
|
|
2522
|
-
for (var
|
|
2523
|
-
var
|
|
2524
|
-
|
|
2528
|
+
for (var A = Math.min(P, g - 2), E = 0, D = 0; D < A; ++D) {
|
|
2529
|
+
var k = I - P + D & 32767, N = c[k], z = k - N & 32767;
|
|
2530
|
+
z > E && (E = z, V = k);
|
|
2525
2531
|
}
|
|
2526
2532
|
}
|
|
2527
2533
|
}
|
|
2528
|
-
|
|
2534
|
+
$ = V, V = c[$], P += $ - V & 32767;
|
|
2529
2535
|
}
|
|
2530
|
-
if (
|
|
2531
|
-
|
|
2532
|
-
var
|
|
2533
|
-
|
|
2536
|
+
if (L) {
|
|
2537
|
+
T[_++] = 268435456 | ut[H] << 18 | Pt[L];
|
|
2538
|
+
var F = ut[H] & 31, j = Pt[L] & 31;
|
|
2539
|
+
Y += qe[F] + Je[j], ++f[257 + F], ++w[j], U = I + H, ++B;
|
|
2534
2540
|
} else
|
|
2535
|
-
|
|
2541
|
+
T[_++] = n[I], ++f[n[I]];
|
|
2536
2542
|
}
|
|
2537
2543
|
}
|
|
2538
|
-
for (
|
|
2539
|
-
|
|
2540
|
-
|
|
2544
|
+
for (I = Math.max(I, U); I < l; ++I)
|
|
2545
|
+
T[_++] = n[I], ++f[n[I]];
|
|
2546
|
+
p = Dt(n, b, d, T, f, w, Y, _, O, I - O, p), d || (s.r = p & 7 | b[p / 8 | 0] << 3, p -= 7, s.h = v, s.p = c, s.i = I, s.w = U);
|
|
2541
2547
|
} else {
|
|
2542
|
-
for (var
|
|
2543
|
-
var M =
|
|
2544
|
-
M >=
|
|
2548
|
+
for (var I = s.w || 0; I < l + d; I += 65535) {
|
|
2549
|
+
var M = I + 65535;
|
|
2550
|
+
M >= l && (b[p / 8 | 0] = d, M = l), p = an(b, p + 1, n.subarray(I, M));
|
|
2545
2551
|
}
|
|
2546
|
-
s.i =
|
|
2552
|
+
s.i = l;
|
|
2547
2553
|
}
|
|
2548
|
-
return Ce(
|
|
2549
|
-
},
|
|
2554
|
+
return Ce(m, 0, r + Et(p) + a);
|
|
2555
|
+
}, lr = /* @__PURE__ */ (function() {
|
|
2550
2556
|
for (var n = new Int32Array(256), e = 0; e < 256; ++e) {
|
|
2551
2557
|
for (var t = e, r = 9; --r; )
|
|
2552
2558
|
t = (t & 1 && -306674912) ^ t >>> 1;
|
|
2553
2559
|
n[e] = t;
|
|
2554
2560
|
}
|
|
2555
2561
|
return n;
|
|
2556
|
-
})(),
|
|
2562
|
+
})(), hr = function() {
|
|
2557
2563
|
var n = -1;
|
|
2558
2564
|
return {
|
|
2559
2565
|
p: function(e) {
|
|
2560
2566
|
for (var t = n, r = 0; r < e.length; ++r)
|
|
2561
|
-
t =
|
|
2567
|
+
t = lr[t & 255 ^ e[r]] ^ t >>> 8;
|
|
2562
2568
|
n = t;
|
|
2563
2569
|
},
|
|
2564
2570
|
d: function() {
|
|
2565
2571
|
return ~n;
|
|
2566
2572
|
}
|
|
2567
2573
|
};
|
|
2568
|
-
},
|
|
2574
|
+
}, cr = function(n, e, t, r, a) {
|
|
2569
2575
|
if (!a && (a = { l: 1 }, e.dictionary)) {
|
|
2570
|
-
var s = e.dictionary.subarray(-32768),
|
|
2571
|
-
|
|
2576
|
+
var s = e.dictionary.subarray(-32768), l = new ae(s.length + n.length);
|
|
2577
|
+
l.set(s), l.set(n, s.length), n = l, a.w = s.length;
|
|
2572
2578
|
}
|
|
2573
|
-
return
|
|
2574
|
-
},
|
|
2579
|
+
return ir(n, e.level == null ? 6 : e.level, e.mem == null ? a.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(n.length))) * 1.5) : 20 : 12 + e.mem, t, r, a);
|
|
2580
|
+
}, sn = function(n, e) {
|
|
2575
2581
|
var t = {};
|
|
2576
2582
|
for (var r in n)
|
|
2577
2583
|
t[r] = n[r];
|
|
@@ -2580,31 +2586,31 @@ var Kn = /* @__PURE__ */ be(Ee, 9, 0), Qn = /* @__PURE__ */ be(Ee, 9, 1), er = /
|
|
|
2580
2586
|
return t;
|
|
2581
2587
|
}, ve = function(n, e) {
|
|
2582
2588
|
return n[e] | n[e + 1] << 8;
|
|
2583
|
-
},
|
|
2589
|
+
}, fe = function(n, e) {
|
|
2584
2590
|
return (n[e] | n[e + 1] << 8 | n[e + 2] << 16 | n[e + 3] << 24) >>> 0;
|
|
2585
2591
|
}, lt = function(n, e) {
|
|
2586
|
-
return
|
|
2587
|
-
},
|
|
2592
|
+
return fe(n, e) + fe(n, e + 4) * 4294967296;
|
|
2593
|
+
}, ie = function(n, e, t) {
|
|
2588
2594
|
for (; t; ++e)
|
|
2589
2595
|
n[e] = t, t >>>= 8;
|
|
2590
2596
|
};
|
|
2591
|
-
function
|
|
2592
|
-
return
|
|
2597
|
+
function ur(n, e) {
|
|
2598
|
+
return cr(n, e || {}, 0, 0);
|
|
2593
2599
|
}
|
|
2594
|
-
function
|
|
2595
|
-
return
|
|
2600
|
+
function fr(n, e) {
|
|
2601
|
+
return or(n, { i: 2 }, e && e.out, e && e.dictionary);
|
|
2596
2602
|
}
|
|
2597
|
-
var
|
|
2603
|
+
var ln = function(n, e, t, r) {
|
|
2598
2604
|
for (var a in n) {
|
|
2599
|
-
var s = n[a],
|
|
2600
|
-
Array.isArray(s) && (
|
|
2605
|
+
var s = n[a], l = e + a, m = r;
|
|
2606
|
+
Array.isArray(s) && (m = sn(r, s[1]), s = s[0]), ArrayBuffer.isView(s) ? t[l] = [s, m] : (t[l += "/"] = [new ae(0), m], ln(s, l, t, r));
|
|
2601
2607
|
}
|
|
2602
|
-
},
|
|
2608
|
+
}, Ht = typeof TextEncoder < "u" && /* @__PURE__ */ new TextEncoder(), pt = typeof TextDecoder < "u" && /* @__PURE__ */ new TextDecoder(), mr = 0;
|
|
2603
2609
|
try {
|
|
2604
|
-
pt.decode(
|
|
2610
|
+
pt.decode(on, { stream: !0 }), mr = 1;
|
|
2605
2611
|
} catch {
|
|
2606
2612
|
}
|
|
2607
|
-
var
|
|
2613
|
+
var pr = function(n) {
|
|
2608
2614
|
for (var e = "", t = 0; ; ) {
|
|
2609
2615
|
var r = n[t++], a = (r > 127) + (r > 223) + (r > 239);
|
|
2610
2616
|
if (t + a > n.length)
|
|
@@ -2612,23 +2618,23 @@ var fr = function(n) {
|
|
|
2612
2618
|
a ? a == 3 ? (r = ((r & 15) << 18 | (n[t++] & 63) << 12 | (n[t++] & 63) << 6 | n[t++] & 63) - 65536, e += String.fromCharCode(55296 | r >> 10, 56320 | r & 1023)) : a & 1 ? e += String.fromCharCode((r & 31) << 6 | n[t++] & 63) : e += String.fromCharCode((r & 15) << 12 | (n[t++] & 63) << 6 | n[t++] & 63) : e += String.fromCharCode(r);
|
|
2613
2619
|
}
|
|
2614
2620
|
};
|
|
2615
|
-
function
|
|
2621
|
+
function Zt(n, e) {
|
|
2616
2622
|
var t;
|
|
2617
|
-
if (
|
|
2618
|
-
return
|
|
2619
|
-
for (var r = n.length, a = new ae(n.length + (n.length >> 1)), s = 0,
|
|
2620
|
-
a[s++] =
|
|
2623
|
+
if (Ht)
|
|
2624
|
+
return Ht.encode(n);
|
|
2625
|
+
for (var r = n.length, a = new ae(n.length + (n.length >> 1)), s = 0, l = function(d) {
|
|
2626
|
+
a[s++] = d;
|
|
2621
2627
|
}, t = 0; t < r; ++t) {
|
|
2622
2628
|
if (s + 5 > a.length) {
|
|
2623
|
-
var
|
|
2624
|
-
|
|
2629
|
+
var m = new ae(s + 8 + (r - t << 1));
|
|
2630
|
+
m.set(a), a = m;
|
|
2625
2631
|
}
|
|
2626
|
-
var
|
|
2627
|
-
|
|
2632
|
+
var b = n.charCodeAt(t);
|
|
2633
|
+
b < 128 || e ? l(b) : b < 2048 ? (l(192 | b >> 6), l(128 | b & 63)) : b > 55295 && b < 57344 ? (b = 65536 + (b & 1047552) | n.charCodeAt(++t) & 1023, l(240 | b >> 18), l(128 | b >> 12 & 63), l(128 | b >> 6 & 63), l(128 | b & 63)) : (l(224 | b >> 12), l(128 | b >> 6 & 63), l(128 | b & 63));
|
|
2628
2634
|
}
|
|
2629
2635
|
return Ce(a, 0, s);
|
|
2630
2636
|
}
|
|
2631
|
-
function
|
|
2637
|
+
function dr(n, e) {
|
|
2632
2638
|
if (e) {
|
|
2633
2639
|
for (var t = "", r = 0; r < n.length; r += 16384)
|
|
2634
2640
|
t += String.fromCharCode.apply(null, n.subarray(r, r + 16384));
|
|
@@ -2636,97 +2642,97 @@ function mr(n, e) {
|
|
|
2636
2642
|
} else {
|
|
2637
2643
|
if (pt)
|
|
2638
2644
|
return pt.decode(n);
|
|
2639
|
-
var a =
|
|
2640
|
-
return t.length &&
|
|
2645
|
+
var a = pr(n), s = a.s, t = a.r;
|
|
2646
|
+
return t.length && le(8), s;
|
|
2641
2647
|
}
|
|
2642
2648
|
}
|
|
2643
|
-
var
|
|
2649
|
+
var gr = function(n, e) {
|
|
2644
2650
|
return e + 30 + ve(n, e + 26) + ve(n, e + 28);
|
|
2645
|
-
},
|
|
2646
|
-
var r = ve(n, e + 28), a = ve(n, e + 30), s =
|
|
2647
|
-
return [ve(n, e + 10),
|
|
2648
|
-
},
|
|
2649
|
-
var
|
|
2650
|
-
if (r &&
|
|
2651
|
-
for (; e + 4 <
|
|
2651
|
+
}, yr = function(n, e, t) {
|
|
2652
|
+
var r = ve(n, e + 28), a = ve(n, e + 30), s = dr(n.subarray(e + 46, e + 46 + r), !(ve(n, e + 8) & 2048)), l = e + 46 + r, m = vr(n, l, a, t, fe(n, e + 20), fe(n, e + 24), fe(n, e + 42)), b = m[0], d = m[1], p = m[2];
|
|
2653
|
+
return [ve(n, e + 10), b, d, s, l + a + ve(n, e + 32), p];
|
|
2654
|
+
}, vr = function(n, e, t, r, a, s, l) {
|
|
2655
|
+
var m = a == 4294967295, b = s == 4294967295, d = l == 4294967295, p = e + t, i = m + b + d;
|
|
2656
|
+
if (r && i) {
|
|
2657
|
+
for (; e + 4 < p; e += 4 + ve(n, e + 2))
|
|
2652
2658
|
if (ve(n, e) == 1)
|
|
2653
2659
|
return [
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2660
|
+
m ? lt(n, e + 4 + 8 * b) : a,
|
|
2661
|
+
b ? lt(n, e + 4) : s,
|
|
2662
|
+
d ? lt(n, e + 4 + 8 * (b + m)) : l,
|
|
2657
2663
|
1
|
|
2658
2664
|
];
|
|
2659
|
-
r < 2 &&
|
|
2665
|
+
r < 2 && le(13);
|
|
2660
2666
|
}
|
|
2661
|
-
return [a, s,
|
|
2667
|
+
return [a, s, l, 0];
|
|
2662
2668
|
}, dt = function(n) {
|
|
2663
2669
|
var e = 0;
|
|
2664
2670
|
if (n)
|
|
2665
2671
|
for (var t in n) {
|
|
2666
2672
|
var r = n[t].length;
|
|
2667
|
-
r > 65535 &&
|
|
2673
|
+
r > 65535 && le(9), e += r + 4;
|
|
2668
2674
|
}
|
|
2669
2675
|
return e;
|
|
2670
|
-
},
|
|
2671
|
-
var
|
|
2672
|
-
|
|
2676
|
+
}, Wt = function(n, e, t, r, a, s, l, m) {
|
|
2677
|
+
var b = r.length, d = t.extra, p = m && m.length, i = dt(d);
|
|
2678
|
+
ie(n, e, l != null ? 33639248 : 67324752), e += 4, l != null && (n[e++] = 20, n[e++] = t.os), n[e] = 20, e += 2, n[e++] = t.flag << 1 | (s < 0 && 8), n[e++] = a && 8, n[e++] = t.compression & 255, n[e++] = t.compression >> 8;
|
|
2673
2679
|
var u = new Date(t.mtime == null ? Date.now() : t.mtime), S = u.getFullYear() - 1980;
|
|
2674
|
-
if ((S < 0 || S > 119) &&
|
|
2675
|
-
for (var
|
|
2676
|
-
var c =
|
|
2677
|
-
|
|
2678
|
-
}
|
|
2679
|
-
return
|
|
2680
|
-
},
|
|
2681
|
-
|
|
2680
|
+
if ((S < 0 || S > 119) && le(10), ie(n, e, S << 25 | u.getMonth() + 1 << 21 | u.getDate() << 16 | u.getHours() << 11 | u.getMinutes() << 5 | u.getSeconds() >> 1), e += 4, s != -1 && (ie(n, e, t.crc), ie(n, e + 4, s < 0 ? -s - 2 : s), ie(n, e + 8, t.size)), ie(n, e + 12, b), ie(n, e + 14, i), e += 16, l != null && (ie(n, e, p), ie(n, e + 6, t.attrs), ie(n, e + 10, l), e += 14), n.set(r, e), e += b, i)
|
|
2681
|
+
for (var y in d) {
|
|
2682
|
+
var c = d[y], v = c.length;
|
|
2683
|
+
ie(n, e, +y), ie(n, e + 2, v), n.set(c, e + 4), e += 4 + v;
|
|
2684
|
+
}
|
|
2685
|
+
return p && (n.set(m, e), e += p), e;
|
|
2686
|
+
}, br = function(n, e, t, r, a) {
|
|
2687
|
+
ie(n, e, 101010256), ie(n, e + 8, t), ie(n, e + 10, t), ie(n, e + 12, r), ie(n, e + 16, a);
|
|
2682
2688
|
};
|
|
2683
|
-
function
|
|
2689
|
+
function xr(n, e) {
|
|
2684
2690
|
e || (e = {});
|
|
2685
2691
|
var t = {}, r = [];
|
|
2686
|
-
|
|
2692
|
+
ln(n, "", t, e);
|
|
2687
2693
|
var a = 0, s = 0;
|
|
2688
|
-
for (var
|
|
2689
|
-
var
|
|
2690
|
-
u > 65535 &&
|
|
2691
|
-
var x =
|
|
2692
|
-
|
|
2693
|
-
size:
|
|
2694
|
-
crc:
|
|
2694
|
+
for (var l in t) {
|
|
2695
|
+
var m = t[l], b = m[0], d = m[1], p = d.level == 0 ? 0 : 8, i = Zt(l), u = i.length, S = d.comment, y = S && Zt(S), c = y && y.length, v = dt(d.extra);
|
|
2696
|
+
u > 65535 && le(11);
|
|
2697
|
+
var x = p ? ur(b, d) : b, o = x.length, h = hr();
|
|
2698
|
+
h.p(b), r.push(sn(d, {
|
|
2699
|
+
size: b.length,
|
|
2700
|
+
crc: h.d(),
|
|
2695
2701
|
c: x,
|
|
2696
|
-
f:
|
|
2697
|
-
m:
|
|
2698
|
-
u: u !=
|
|
2702
|
+
f: i,
|
|
2703
|
+
m: y,
|
|
2704
|
+
u: u != l.length || y && S.length != c,
|
|
2699
2705
|
o: a,
|
|
2700
|
-
compression:
|
|
2701
|
-
})), a += 30 + u +
|
|
2706
|
+
compression: p
|
|
2707
|
+
})), a += 30 + u + v + o, s += 76 + 2 * (u + v) + (c || 0) + o;
|
|
2702
2708
|
}
|
|
2703
|
-
for (var
|
|
2704
|
-
var
|
|
2705
|
-
|
|
2706
|
-
var
|
|
2707
|
-
|
|
2709
|
+
for (var T = new ae(s + 22), f = a, w = s - a, B = 0; B < r.length; ++B) {
|
|
2710
|
+
var i = r[B];
|
|
2711
|
+
Wt(T, i.o, i, i.f, i.u, i.c.length);
|
|
2712
|
+
var Y = 30 + i.f.length + dt(i.extra);
|
|
2713
|
+
T.set(i.c, i.o + Y), Wt(T, a, i, i.f, i.u, i.c.length, i.o, i.m), a += 16 + Y + (i.m ? i.m.length : 0);
|
|
2708
2714
|
}
|
|
2709
|
-
return
|
|
2715
|
+
return br(T, a, r.length, w, f), T;
|
|
2710
2716
|
}
|
|
2711
|
-
function
|
|
2712
|
-
for (var t = {}, r = n.length - 22;
|
|
2713
|
-
(!r || n.length - r > 65558) &&
|
|
2717
|
+
function wr(n, e) {
|
|
2718
|
+
for (var t = {}, r = n.length - 22; fe(n, r) != 101010256; --r)
|
|
2719
|
+
(!r || n.length - r > 65558) && le(13);
|
|
2714
2720
|
var a = ve(n, r + 8);
|
|
2715
2721
|
if (!a)
|
|
2716
2722
|
return {};
|
|
2717
|
-
var s =
|
|
2718
|
-
if (
|
|
2719
|
-
var
|
|
2720
|
-
|
|
2721
|
-
}
|
|
2722
|
-
for (var
|
|
2723
|
-
var
|
|
2724
|
-
s = c, (!
|
|
2725
|
-
name:
|
|
2723
|
+
var s = fe(n, r + 16), l = fe(n, r - 20) == 117853008;
|
|
2724
|
+
if (l) {
|
|
2725
|
+
var m = fe(n, r - 12);
|
|
2726
|
+
l = fe(n, m) == 101075792, l && (a = fe(n, m + 32), s = fe(n, m + 48));
|
|
2727
|
+
}
|
|
2728
|
+
for (var b = e && e.filter, d = 0; d < a; ++d) {
|
|
2729
|
+
var p = yr(n, s, l), i = p[0], u = p[1], S = p[2], y = p[3], c = p[4], v = p[5], x = gr(n, v);
|
|
2730
|
+
s = c, (!b || b({
|
|
2731
|
+
name: y,
|
|
2726
2732
|
size: u,
|
|
2727
2733
|
originalSize: S,
|
|
2728
|
-
compression:
|
|
2729
|
-
})) && (
|
|
2734
|
+
compression: i
|
|
2735
|
+
})) && (i ? i == 8 ? t[y] = fr(n.subarray(x, x + u), { out: new ae(S) }) : le(14, "unknown compression type " + i) : t[y] = Ce(n, x, x + u));
|
|
2730
2736
|
}
|
|
2731
2737
|
return t;
|
|
2732
2738
|
}
|
|
@@ -2743,87 +2749,87 @@ function vt(n) {
|
|
|
2743
2749
|
for (; s >= Math.max(0, n.length - 65557) && !(a(s) === 101010256 && s + 22 + r(s + 20) === n.length); s--)
|
|
2744
2750
|
;
|
|
2745
2751
|
(s < 0 || s < n.length - 65557) && t(), (r(s + 4) || r(s + 6) || r(s + 8) !== r(s + 10)) && t();
|
|
2746
|
-
const
|
|
2747
|
-
|
|
2748
|
-
const
|
|
2749
|
-
let
|
|
2750
|
-
for (let u = 0; u <
|
|
2751
|
-
(
|
|
2752
|
-
const S = r(
|
|
2753
|
-
|
|
2752
|
+
const l = r(s + 10), m = a(s + 16), b = m + a(s + 12);
|
|
2753
|
+
b !== s && t();
|
|
2754
|
+
const d = [], p = /* @__PURE__ */ new Set();
|
|
2755
|
+
let i = m;
|
|
2756
|
+
for (let u = 0; u < l; u++) {
|
|
2757
|
+
(i + 46 > b || a(i) !== 33639248) && t();
|
|
2758
|
+
const S = r(i + 28), y = i + 46 + S + r(i + 30) + r(i + 32);
|
|
2759
|
+
y > b && t();
|
|
2754
2760
|
let c;
|
|
2755
2761
|
try {
|
|
2756
|
-
c = yt.decode(n.subarray(
|
|
2762
|
+
c = yt.decode(n.subarray(i + 46, i + 46 + S));
|
|
2757
2763
|
} catch {
|
|
2758
2764
|
throw new Error("ZIP entry (invalid UTF-8 name): invalid filename");
|
|
2759
2765
|
}
|
|
2760
2766
|
if (St(c), u >= Ve) throw new Error(`ZIP entry ${JSON.stringify(c)}: more than ${Ve} entries`);
|
|
2761
|
-
if (
|
|
2762
|
-
|
|
2763
|
-
const
|
|
2764
|
-
if (
|
|
2765
|
-
if (r(
|
|
2766
|
-
if (r(
|
|
2767
|
-
(x !==
|
|
2768
|
-
const
|
|
2769
|
-
(
|
|
2770
|
-
let
|
|
2767
|
+
if (p.has(c)) throw new Error(`ZIP entry ${JSON.stringify(c)}: duplicate entry`);
|
|
2768
|
+
p.add(c);
|
|
2769
|
+
const v = a(i + 24), x = a(i + 20), o = a(i + 42);
|
|
2770
|
+
if (v > gt || x > gt) throw new Error(`ZIP entry ${JSON.stringify(c)}: exceeds 64 MB`);
|
|
2771
|
+
if (r(i + 10) !== 0) throw new Error(`ZIP entry ${JSON.stringify(c)}: expected stored compression (method 0)`);
|
|
2772
|
+
if (r(i + 8) & 1) throw new Error(`ZIP entry ${JSON.stringify(c)}: encrypted entries are not supported`);
|
|
2773
|
+
(x !== v || o + 30 > m || a(o) !== 67324752) && t(c);
|
|
2774
|
+
const h = o + 30 + r(o + 26) + r(o + 28);
|
|
2775
|
+
(h + v > m || r(o + 8) !== 0 || r(o + 6) !== r(i + 8)) && t(c);
|
|
2776
|
+
let T;
|
|
2771
2777
|
try {
|
|
2772
|
-
|
|
2778
|
+
T = yt.decode(n.subarray(o + 30, o + 30 + r(o + 26)));
|
|
2773
2779
|
} catch {
|
|
2774
2780
|
t(c);
|
|
2775
2781
|
}
|
|
2776
|
-
|
|
2782
|
+
T !== c && t(c), d.push({ name: c, offset: o, start: h, size: v, central: i }), i = y;
|
|
2777
2783
|
}
|
|
2778
|
-
return
|
|
2784
|
+
return i !== b && t(), { files: d };
|
|
2779
2785
|
}
|
|
2780
|
-
function
|
|
2781
|
-
const e = n instanceof Uint8Array ? n : new Uint8Array(n), t = vt(e), r =
|
|
2786
|
+
function Ar(n) {
|
|
2787
|
+
const e = n instanceof Uint8Array ? n : new Uint8Array(n), t = vt(e), r = wr(e, { filter: (s) => s.name !== "__proto__" }), a = /* @__PURE__ */ Object.create(null);
|
|
2782
2788
|
for (const s of t.files) {
|
|
2783
|
-
const
|
|
2784
|
-
if (!(
|
|
2785
|
-
a[s.name] =
|
|
2789
|
+
const l = s.name === "__proto__" ? e.slice(s.start, s.start + s.size) : r[s.name];
|
|
2790
|
+
if (!(l instanceof Uint8Array) || l.length !== s.size) throw new Error(`ZIP entry ${JSON.stringify(s.name)}: invalid size`);
|
|
2791
|
+
a[s.name] = l;
|
|
2786
2792
|
}
|
|
2787
2793
|
return a;
|
|
2788
2794
|
}
|
|
2789
|
-
function
|
|
2790
|
-
const t = Object.hasOwn(n, "avatar.json") ? n["avatar.json"] : void 0, r = t ? Le(JSON.parse(yt.decode(t))) :
|
|
2795
|
+
function Or(n, e = {}) {
|
|
2796
|
+
const t = Object.hasOwn(n, "avatar.json") ? n["avatar.json"] : void 0, r = t ? Le(JSON.parse(yt.decode(t))) : Kt("Avatar"), a = t && !e.manifest ? t : new TextEncoder().encode(JSON.stringify(Le({ ...r, ...e.manifest }), null, 2) + `
|
|
2791
2797
|
`), s = /* @__PURE__ */ Object.create(null);
|
|
2792
2798
|
s["avatar.json"] = a;
|
|
2793
2799
|
for (const [u, S] of Object.entries(n)) u !== "avatar.json" && (s[u] = S);
|
|
2794
|
-
for (const [u, [S,
|
|
2800
|
+
for (const [u, [S, y]] of Object.entries(s).entries()) {
|
|
2795
2801
|
if (St(S), u >= Ve) throw new Error(`ZIP entry ${JSON.stringify(S)}: more than ${Ve} entries`);
|
|
2796
|
-
if (
|
|
2802
|
+
if (y.byteLength > gt) throw new Error(`ZIP entry ${JSON.stringify(S)}: exceeds 64 MB`);
|
|
2797
2803
|
}
|
|
2798
|
-
const
|
|
2799
|
-
if (
|
|
2804
|
+
const l = Qt(s);
|
|
2805
|
+
if (l.length) throw new Error(l.join(`
|
|
2800
2806
|
`));
|
|
2801
|
-
let
|
|
2802
|
-
for (let u = 0; Object.hasOwn(s,
|
|
2803
|
-
const
|
|
2807
|
+
let m = "proto0000";
|
|
2808
|
+
for (let u = 0; Object.hasOwn(s, m); u++) m = `proto${String(u + 1).padStart(4, "0")}`;
|
|
2809
|
+
const b = Object.fromEntries(Object.entries(s).map(([u, S]) => [u === "__proto__" ? m : u, S])), d = xr(b, { level: 0 });
|
|
2804
2810
|
if (Object.hasOwn(s, "__proto__")) {
|
|
2805
|
-
const u = vt(
|
|
2806
|
-
|
|
2807
|
-
}
|
|
2808
|
-
const
|
|
2809
|
-
if (
|
|
2810
|
-
const u =
|
|
2811
|
-
S.set(
|
|
2812
|
-
const
|
|
2813
|
-
for (const c of
|
|
2811
|
+
const u = vt(d).files.find((y) => y.name === m), S = new TextEncoder().encode("__proto__");
|
|
2812
|
+
d.set(S, u.offset + 30), d.set(S, u.central + 46);
|
|
2813
|
+
}
|
|
2814
|
+
const p = vt(d), i = p.files.find((u) => u.name === "avatar.json");
|
|
2815
|
+
if (i.offset !== 0) {
|
|
2816
|
+
const u = i.start + i.size - i.offset, S = new Uint8Array(d.length);
|
|
2817
|
+
S.set(d.subarray(i.offset, i.offset + u)), S.set(d.subarray(0, i.offset), u), S.set(d.subarray(i.offset + u), i.offset + u);
|
|
2818
|
+
const y = new DataView(S.buffer);
|
|
2819
|
+
for (const c of p.files) y.setUint32(c.central + 42, c === i ? 0 : c.offset < i.offset ? c.offset + u : c.offset, !0);
|
|
2814
2820
|
return S;
|
|
2815
2821
|
}
|
|
2816
|
-
return
|
|
2822
|
+
return d;
|
|
2817
2823
|
}
|
|
2818
|
-
const
|
|
2824
|
+
const Mr = (n) => JSON.parse(new TextDecoder("utf-8", { fatal: !0 }).decode(n));
|
|
2819
2825
|
function Xe(n, e) {
|
|
2820
2826
|
try {
|
|
2821
|
-
return
|
|
2827
|
+
return Mr(n);
|
|
2822
2828
|
} catch {
|
|
2823
2829
|
throw new Error(`${e}: invalid UTF-8 JSON`);
|
|
2824
2830
|
}
|
|
2825
2831
|
}
|
|
2826
|
-
function
|
|
2832
|
+
function hn(n, e) {
|
|
2827
2833
|
return [
|
|
2828
2834
|
"layers.json",
|
|
2829
2835
|
"base.png",
|
|
@@ -2832,36 +2838,36 @@ function ln(n, e) {
|
|
|
2832
2838
|
...e ? ["sprites/sprites.json", ...Object.keys(e.layers ?? {}).map((t) => `sprites/${t}.png`)] : []
|
|
2833
2839
|
];
|
|
2834
2840
|
}
|
|
2835
|
-
function
|
|
2836
|
-
const e =
|
|
2841
|
+
function cn(n) {
|
|
2842
|
+
const e = Qt(n);
|
|
2837
2843
|
if (e.length) throw new Error(e.join(`
|
|
2838
2844
|
`));
|
|
2839
2845
|
}
|
|
2840
|
-
function
|
|
2846
|
+
function un(n) {
|
|
2841
2847
|
return !!n && typeof n == "object" && "manifest" in n && "rig" in n && "assets" in n && "release" in n;
|
|
2842
2848
|
}
|
|
2843
2849
|
function ht(n) {
|
|
2844
|
-
const e =
|
|
2850
|
+
const e = Ar(n);
|
|
2845
2851
|
if (!Object.hasOwn(e, "avatar.json")) throw new Error("avatar.json: missing file in .mavatar archive");
|
|
2846
|
-
|
|
2847
|
-
const t = Le(Xe(e["avatar.json"], "avatar.json")), r = bt(Xe(e["rig.json"], "rig.json")), a =
|
|
2852
|
+
cn(e);
|
|
2853
|
+
const t = Le(Xe(e["avatar.json"], "avatar.json")), r = bt(Xe(e["rig.json"], "rig.json")), a = hn(
|
|
2848
2854
|
Xe(e["built/layers.json"], "built/layers.json"),
|
|
2849
2855
|
e["built/sprites/sprites.json"] ? Xe(e["built/sprites/sprites.json"], "built/sprites/sprites.json") : void 0
|
|
2850
|
-
), s = {},
|
|
2851
|
-
|
|
2856
|
+
), s = {}, l = [], m = () => {
|
|
2857
|
+
l.splice(0).forEach((b) => URL.revokeObjectURL(b));
|
|
2852
2858
|
};
|
|
2853
2859
|
try {
|
|
2854
|
-
for (const
|
|
2855
|
-
const
|
|
2856
|
-
|
|
2860
|
+
for (const b of new Set(a)) {
|
|
2861
|
+
const d = URL.createObjectURL(new Blob([new Uint8Array(e[`built/${b}`])], { type: b.endsWith(".json") ? "application/json" : "image/png" }));
|
|
2862
|
+
l.push(d), s[b] = d;
|
|
2857
2863
|
}
|
|
2858
|
-
} catch (
|
|
2859
|
-
throw
|
|
2864
|
+
} catch (b) {
|
|
2865
|
+
throw m(), b;
|
|
2860
2866
|
}
|
|
2861
|
-
return { manifest: t, rig: r, assets: s, release:
|
|
2867
|
+
return { manifest: t, rig: r, assets: s, release: m };
|
|
2862
2868
|
}
|
|
2863
|
-
async function
|
|
2864
|
-
if (
|
|
2869
|
+
async function Er(n, e = {}) {
|
|
2870
|
+
if (un(n)) return n;
|
|
2865
2871
|
if (n instanceof Blob) return ht(await n.arrayBuffer());
|
|
2866
2872
|
if (n instanceof ArrayBuffer || n instanceof Uint8Array) return ht(n);
|
|
2867
2873
|
const t = new URL(n, typeof location > "u" ? void 0 : location.href);
|
|
@@ -2872,47 +2878,47 @@ async function Ar(n, e = {}) {
|
|
|
2872
2878
|
}
|
|
2873
2879
|
t.pathname.endsWith("/") || (t.pathname += "/");
|
|
2874
2880
|
const r = (c) => {
|
|
2875
|
-
const
|
|
2876
|
-
return
|
|
2881
|
+
const v = new URL(t);
|
|
2882
|
+
return v.pathname += c.split("/").map(encodeURIComponent).join("/"), e.version !== void 0 && v.searchParams.set("v", String(e.version)), v.href;
|
|
2877
2883
|
}, a = {};
|
|
2878
|
-
async function s(c,
|
|
2884
|
+
async function s(c, v = !1) {
|
|
2879
2885
|
const x = await fetch(r(c));
|
|
2880
|
-
if (
|
|
2886
|
+
if (v && (x.status === 404 || x.ok && x.headers.get("content-type")?.includes("text/html"))) return;
|
|
2881
2887
|
if (!x.ok) throw new Error(`${c}: could not load (${x.status})`);
|
|
2882
2888
|
const o = new Uint8Array(await x.arrayBuffer());
|
|
2883
2889
|
return a[c] = o, Xe(o, c);
|
|
2884
2890
|
}
|
|
2885
|
-
const
|
|
2886
|
-
St(
|
|
2887
|
-
const [
|
|
2888
|
-
s(
|
|
2891
|
+
const l = e.rigFile ?? "rig.json";
|
|
2892
|
+
St(l);
|
|
2893
|
+
const [m, b, d, p] = await Promise.all([
|
|
2894
|
+
s(l),
|
|
2889
2895
|
s("built/layers.json"),
|
|
2890
2896
|
s("avatar.json", !0),
|
|
2891
2897
|
s("built/sprites/sprites.json", !0)
|
|
2892
2898
|
]);
|
|
2893
|
-
Array.isArray(
|
|
2899
|
+
Array.isArray(m?.eyes) && Array.isArray(b?.eyes) && (m.eyes = m.eyes.map((c, v) => {
|
|
2894
2900
|
if (!c || typeof c != "object") return c;
|
|
2895
2901
|
const x = { ...c };
|
|
2896
|
-
for (const o of ["x0", "x1", "top", "bot"]) x[o] === void 0 && (x[o] =
|
|
2902
|
+
for (const o of ["x0", "x1", "top", "bot"]) x[o] === void 0 && (x[o] = b.eyes[v]?.[o]);
|
|
2897
2903
|
return x;
|
|
2898
|
-
})), a["rig.json"] = new TextEncoder().encode(JSON.stringify(
|
|
2899
|
-
const
|
|
2900
|
-
for (const c of
|
|
2901
|
-
|
|
2902
|
-
const u = bt(
|
|
2903
|
-
return { manifest:
|
|
2904
|
+
})), a["rig.json"] = new TextEncoder().encode(JSON.stringify(m));
|
|
2905
|
+
const i = hn(b, p);
|
|
2906
|
+
for (const c of i) c.endsWith(".png") && (a[`built/${c}`] = { size: 1 });
|
|
2907
|
+
cn(a);
|
|
2908
|
+
const u = bt(m), S = Object.fromEntries(i.map((c) => [c, r(`built/${c}`)])), y = decodeURIComponent(t.pathname.split("/").filter(Boolean).at(-1) ?? "Avatar");
|
|
2909
|
+
return { manifest: d === void 0 ? Kt(y) : Le(d), rig: u, assets: S, release() {
|
|
2904
2910
|
} };
|
|
2905
2911
|
}
|
|
2906
|
-
async function
|
|
2907
|
-
const r = !
|
|
2912
|
+
async function Rr(n, e, t = {}) {
|
|
2913
|
+
const r = !un(e), a = await Er(e);
|
|
2908
2914
|
try {
|
|
2909
|
-
const s = await
|
|
2910
|
-
let
|
|
2915
|
+
const s = await Kn(n, { ...t, rig: a.rig, assets: a.assets }), l = s.destroy.bind(s);
|
|
2916
|
+
let m = !1;
|
|
2911
2917
|
return Object.assign(s, { package: a, destroy() {
|
|
2912
|
-
if (!
|
|
2913
|
-
|
|
2918
|
+
if (!m) {
|
|
2919
|
+
m = !0;
|
|
2914
2920
|
try {
|
|
2915
|
-
|
|
2921
|
+
l();
|
|
2916
2922
|
} finally {
|
|
2917
2923
|
r && a.release();
|
|
2918
2924
|
}
|
|
@@ -2924,17 +2930,17 @@ async function Tr(n, e, t = {}) {
|
|
|
2924
2930
|
}
|
|
2925
2931
|
export {
|
|
2926
2932
|
Re as DEFAULT_LIGHTING,
|
|
2927
|
-
|
|
2933
|
+
Tr as LIVE_EXPRESSIONS,
|
|
2928
2934
|
De as PARAMS,
|
|
2929
|
-
|
|
2930
|
-
|
|
2931
|
-
|
|
2932
|
-
|
|
2933
|
-
|
|
2934
|
-
|
|
2935
|
+
Sr as colorHex,
|
|
2936
|
+
Kn as createMeshAvatar,
|
|
2937
|
+
Rr as loadMeshAvatar,
|
|
2938
|
+
Er as openAvatar,
|
|
2939
|
+
Or as packAvatar,
|
|
2940
|
+
An as parseLighting,
|
|
2935
2941
|
Le as parseManifest,
|
|
2936
2942
|
bt as parseRig,
|
|
2937
|
-
|
|
2938
|
-
|
|
2939
|
-
|
|
2943
|
+
Ar as unpackAvatar,
|
|
2944
|
+
Qt as validateAvatarFiles,
|
|
2945
|
+
Gt as validateRig
|
|
2940
2946
|
};
|