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