ugly-app 0.1.973 → 0.1.974
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/dist/character/client/CharacterCanvas.d.ts +8 -1
- package/dist/character/client/CharacterCanvas.d.ts.map +1 -1
- package/dist/character/client/CharacterCanvas.js +81 -12
- package/dist/character/client/CharacterCanvas.js.map +1 -1
- package/dist/character/client/lib/assemblyGate.d.ts +21 -0
- package/dist/character/client/lib/assemblyGate.d.ts.map +1 -0
- package/dist/character/client/lib/assemblyGate.js +53 -0
- package/dist/character/client/lib/assemblyGate.js.map +1 -0
- package/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/package.json +1 -1
- package/src/character/client/CharacterCanvas.tsx +97 -11
- package/src/character/client/lib/assemblyGate.ts +72 -0
- package/src/cli/version.ts +1 -1
|
@@ -34,7 +34,14 @@ export interface CharacterCanvasProps {
|
|
|
34
34
|
*/
|
|
35
35
|
faceWeights?: Float32Array | null | undefined;
|
|
36
36
|
className?: string | undefined;
|
|
37
|
-
/**
|
|
37
|
+
/**
|
|
38
|
+
* Fires once, when the character is ASSEMBLED — body, face parts, hair and garments have all
|
|
39
|
+
* settled and a frame carrying them has been drawn. This is also when the loading cover lifts.
|
|
40
|
+
*
|
|
41
|
+
* ⚠️ IT USED TO MEAN "THE FIRST FRAME DREW", which was mid-assembly: the body exists long
|
|
42
|
+
* before the clothes do. `captureThumbnail` tells callers to wait for this event, so under the
|
|
43
|
+
* old meaning a fast save could store a bald, naked character as its permanent thumbnail.
|
|
44
|
+
*/
|
|
38
45
|
onReady?: (() => void) | undefined;
|
|
39
46
|
/** Fires per kit tier — `false` for the coarse prefix, `true` for the full container. */
|
|
40
47
|
onTier?: ((full: boolean) => void) | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CharacterCanvas.d.ts","sourceRoot":"","sources":["../../../src/character/client/CharacterCanvas.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"CharacterCanvas.d.ts","sourceRoot":"","sources":["../../../src/character/client/CharacterCanvas.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAQ9D,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,sGAAsG;AACtG,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE7D,MAAM,WAAW,oBAAoB;IACnC,kEAAkE;IAClE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,kFAAkF;IAClF,IAAI,EAAE,aAAa,CAAC;IACpB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,4EAA4E;IAC5E,KAAK,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACjC,6DAA6D;IAC7D,MAAM,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC3C;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,sEAAsE;IACtE,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB;;;;OAIG;IACH,WAAW,CAAC,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9C,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACnC,yFAAyF;IACzF,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC/C;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACtD,sEAAsE;IACtE,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACnD;AAED,MAAM,WAAW,yBAAyB;IACxC,oEAAoE;IACpE,MAAM,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC3C,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC;;;;;;OAMG;IACH,gBAAgB,CAAC,IAAI,CAAC,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,qFAAqF;IACrF,OAAO,CAAC,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3C,oEAAoE;IACpE,MAAM,IAAI,iBAAiB,GAAG,IAAI,CAAC;CACpC;AAuFD,eAAO,MAAM,eAAe,wHAiiB1B,CAAC"}
|
|
@@ -19,12 +19,28 @@ import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useSta
|
|
|
19
19
|
import { viewProjection } from 'ugly-game/mat4';
|
|
20
20
|
import { pickTranscodeTarget, requiredFeatureFor } from 'ugly-game/assets/ktx2';
|
|
21
21
|
import { CharacterScene } from './lib/characterScene.js';
|
|
22
|
+
import { createAssemblyGate } from './lib/assemblyGate.js';
|
|
22
23
|
import { loadCharKit } from './lib/charKit.js';
|
|
23
24
|
import { loadCharParts } from './lib/charParts.js';
|
|
24
25
|
import { loadHairMeshes } from './lib/charHair.js';
|
|
25
26
|
import { loadGarments } from './lib/charGarment.js';
|
|
26
27
|
import { makeGarmentCache } from './lib/skinTextures.js';
|
|
27
28
|
import { loadFbxClip } from './lib/fbxClips.js';
|
|
29
|
+
/**
|
|
30
|
+
* The loading cover's own two rules.
|
|
31
|
+
*
|
|
32
|
+
* ⚠️ AN INJECTED `<style>` RATHER THAN INLINE STYLES, because a keyframe cannot be expressed as
|
|
33
|
+
* a style attribute — the same reason `CharacterCreator` injects its own sheet. Kept to two
|
|
34
|
+
* rules and prefixed `ucv-` so it cannot collide with a host's CSS.
|
|
35
|
+
*/
|
|
36
|
+
const COVER_CSS = `
|
|
37
|
+
@keyframes ucv-pulse{0%,100%{opacity:.35; transform:scale(.85);}50%{opacity:1; transform:scale(1);}}
|
|
38
|
+
.ucv-loading-dot{
|
|
39
|
+
width:9px; height:9px; border-radius:50%; background:currentColor; display:block;
|
|
40
|
+
animation:ucv-pulse 1.25s ease-in-out infinite;
|
|
41
|
+
}
|
|
42
|
+
@media (prefers-reduced-motion:reduce){.ucv-loading-dot{animation:none; opacity:.7;}}
|
|
43
|
+
`;
|
|
28
44
|
/** Vertical field of view, radians — the char lab's 0.7, which its framings were tuned against. */
|
|
29
45
|
const FOV = 0.7;
|
|
30
46
|
// Studio lighting: a warm key from over the camera's shoulder and a cool ambient, on a dark
|
|
@@ -78,6 +94,8 @@ export const CharacterCanvas = forwardRef(function CharacterCanvas({ source, spe
|
|
|
78
94
|
const canvasRef = useRef(null);
|
|
79
95
|
const gpuRef = useRef(null);
|
|
80
96
|
const [err, setErr] = useState(null);
|
|
97
|
+
/** False until the character is whole — drives the cover. See `createAssemblyGate`. */
|
|
98
|
+
const [assembled, setAssembled] = useState(false);
|
|
81
99
|
// Latest-value refs, so the init effect and the frame loop never go stale and never re-run
|
|
82
100
|
// for a callback the parent rebuilt.
|
|
83
101
|
const specRef = useRef(spec);
|
|
@@ -177,6 +195,23 @@ export const CharacterCanvas = forwardRef(function CharacterCanvas({ source, spe
|
|
|
177
195
|
useEffect(() => {
|
|
178
196
|
let raf = 0;
|
|
179
197
|
const live = { dead: false };
|
|
198
|
+
// A new `source` rebuilds the whole GPU stack, so the cover comes back down with it.
|
|
199
|
+
setAssembled(false);
|
|
200
|
+
const gate = createAssemblyGate(() => {
|
|
201
|
+
if (live.dead)
|
|
202
|
+
return;
|
|
203
|
+
setAssembled(true);
|
|
204
|
+
onReadyRef.current?.();
|
|
205
|
+
});
|
|
206
|
+
/**
|
|
207
|
+
* ⚠️ THE CAP EXISTS SO A HUNG FETCH CANNOT LEAVE A PERMANENTLY BLANK STAGE. Thirty seconds
|
|
208
|
+
* because the kit legitimately streams ~6 MB on a cold cache; ugly-bot's `AvatarPreview`
|
|
209
|
+
* uses 12 s against much smaller assets for the same reason.
|
|
210
|
+
*/
|
|
211
|
+
const capTimer = setTimeout(() => {
|
|
212
|
+
if (!live.dead)
|
|
213
|
+
gate.abandon();
|
|
214
|
+
}, 30_000);
|
|
180
215
|
void (async () => {
|
|
181
216
|
// Read through an explicitly-optional shape: @webgpu/types declares `navigator.gpu` always
|
|
182
217
|
// present, so a plain access makes this guard look like dead code to the compiler — while
|
|
@@ -247,6 +282,11 @@ export const CharacterCanvas = forwardRef(function CharacterCanvas({ source, spe
|
|
|
247
282
|
// RECORDED, not swallowed: an asset that does not load leaves the character short a feature
|
|
248
283
|
// and says why in the console, which is how a broken cook does not become a permanent
|
|
249
284
|
// missing feature.
|
|
285
|
+
//
|
|
286
|
+
// ⚠️ EVERY ONE OF THESE SETTLES THE GATE, ON BOTH PATHS. A loader that resolves to null
|
|
287
|
+
// (a kit cooked without hair or without garments — both legitimate) or rejects (a 404 on
|
|
288
|
+
// one texture) is still DONE, and if it did not say so the cover would never lift and the
|
|
289
|
+
// character would never appear at all. See `assemblyGate.ts`.
|
|
250
290
|
void loadCharKit(source, device, (kit) => {
|
|
251
291
|
if (live.dead)
|
|
252
292
|
return;
|
|
@@ -254,6 +294,10 @@ export const CharacterCanvas = forwardRef(function CharacterCanvas({ source, spe
|
|
|
254
294
|
scene.setKit(kit);
|
|
255
295
|
// The spec may have arrived before the first tier did (it usually does).
|
|
256
296
|
scene.setSpec(specRef.current);
|
|
297
|
+
// ⚠️ THE COARSE TIER COUNTS. This callback fires twice — coarse prefix, then full
|
|
298
|
+
// container — and waiting for the second would hold the cover far longer on a cold
|
|
299
|
+
// cache to buy body DETAIL, which sharpens in place rather than popping in.
|
|
300
|
+
gate.settle('kit');
|
|
257
301
|
onTierRef.current?.(kit.full);
|
|
258
302
|
onFactsRef.current?.(kit.facts);
|
|
259
303
|
}
|
|
@@ -262,28 +306,33 @@ export const CharacterCanvas = forwardRef(function CharacterCanvas({ source, spe
|
|
|
262
306
|
}
|
|
263
307
|
}).catch((e) => {
|
|
264
308
|
reportError(`character kit failed to load: ${e instanceof Error ? e.message : String(e)}`);
|
|
309
|
+
// No kit means no character, ever. Reveal so the error overlay is the thing on screen
|
|
310
|
+
// rather than a loading label that will never resolve.
|
|
311
|
+
gate.abandon();
|
|
265
312
|
});
|
|
266
313
|
void loadCharParts(device, source, source.manifest)
|
|
267
314
|
.then((parts) => {
|
|
268
315
|
if (!live.dead)
|
|
269
316
|
scene.setParts(parts);
|
|
270
317
|
})
|
|
271
|
-
.catch((e) => console.error('[character] face parts did not load', e))
|
|
318
|
+
.catch((e) => console.error('[character] face parts did not load', e))
|
|
319
|
+
.finally(() => gate.settle('parts'));
|
|
272
320
|
void loadHairMeshes(device, source)
|
|
273
321
|
.then((hair) => {
|
|
274
322
|
if (hair && !live.dead)
|
|
275
323
|
scene.setHair(hair);
|
|
276
324
|
})
|
|
277
|
-
.catch((e) => console.error('[character] hair did not load', e))
|
|
325
|
+
.catch((e) => console.error('[character] hair did not load', e))
|
|
326
|
+
.finally(() => gate.settle('hair'));
|
|
278
327
|
void loadGarments(source)
|
|
279
328
|
.then((kit) => {
|
|
280
329
|
if (kit && !live.dead)
|
|
281
330
|
scene.setGarments(kit, makeGarmentCache(device, source.baseUrl));
|
|
282
331
|
})
|
|
283
|
-
.catch((e) => console.error('[character] garments did not load', e))
|
|
332
|
+
.catch((e) => console.error('[character] garments did not load', e))
|
|
333
|
+
.finally(() => gate.settle('garments'));
|
|
284
334
|
// ── THE FRAME LOOP ──────────────────────────────────────────────────────────────────
|
|
285
335
|
let last = performance.now();
|
|
286
|
-
let announced = false;
|
|
287
336
|
const draw = (nowMs) => {
|
|
288
337
|
if (live.dead)
|
|
289
338
|
return;
|
|
@@ -327,12 +376,11 @@ export const CharacterCanvas = forwardRef(function CharacterCanvas({ source, spe
|
|
|
327
376
|
const enc = device.createCommandEncoder();
|
|
328
377
|
const drew = scene.frame(enc, ctx.getCurrentTexture().createView(), st.depth.createView(), camVP, sunDir(cam.eye, cam.tgt), SUN_COL, AMB, [cam.eye[0], cam.eye[1], cam.eye[2]], FOG, FOG_DENSITY, CLEAR);
|
|
329
378
|
device.queue.submit([enc.finish()]);
|
|
330
|
-
// ⚠️ AFTER a frame actually drew, not after the kit decoded —
|
|
331
|
-
// character on
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
}
|
|
379
|
+
// ⚠️ AFTER a frame actually drew, not after the kit decoded — a decoded-but-never-drawn
|
|
380
|
+
// kit is not a character on screen. This is one of the gate's two conditions; the other
|
|
381
|
+
// is that all four loaders have settled, so a drawn body alone no longer reveals.
|
|
382
|
+
if (drew)
|
|
383
|
+
gate.frameDrew();
|
|
336
384
|
};
|
|
337
385
|
raf = requestAnimationFrame(draw);
|
|
338
386
|
})().catch((e) => {
|
|
@@ -340,6 +388,7 @@ export const CharacterCanvas = forwardRef(function CharacterCanvas({ source, spe
|
|
|
340
388
|
});
|
|
341
389
|
return () => {
|
|
342
390
|
live.dead = true;
|
|
391
|
+
clearTimeout(capTimer);
|
|
343
392
|
cancelAnimationFrame(raf);
|
|
344
393
|
const st = gpuRef.current;
|
|
345
394
|
gpuRef.current = null;
|
|
@@ -412,10 +461,16 @@ export const CharacterCanvas = forwardRef(function CharacterCanvas({ source, spe
|
|
|
412
461
|
setGaze: (g) => gpuRef.current?.scene.setGaze(g),
|
|
413
462
|
canvas: () => canvasRef.current,
|
|
414
463
|
}), []);
|
|
415
|
-
return (_jsxs("div", { className: className, "data-id": "character-canvas", style: { position: 'relative', width: '100%', height: '100%' }, children: [_jsx("canvas", { ref: canvasRef, "aria-label": "Character preview", style: {
|
|
464
|
+
return (_jsxs("div", { className: className, "data-id": "character-canvas", style: { position: 'relative', width: '100%', height: '100%' }, children: [_jsx("style", { children: COVER_CSS }), _jsx("canvas", { ref: canvasRef, "aria-label": "Character preview", style: {
|
|
416
465
|
display: 'block',
|
|
417
466
|
width: '100%',
|
|
418
467
|
height: '100%',
|
|
468
|
+
// ⚠️ THE CANVAS ITSELF FADES — there is no cover element painted over it. An opaque
|
|
469
|
+
// panel would have to name a background colour, and no single colour is right: the
|
|
470
|
+
// creator's stage is a radial gradient while the canvas clears to a flat near-black.
|
|
471
|
+
// Fading the canvas lets the HOST's own backdrop be the cover, in every host.
|
|
472
|
+
opacity: assembled ? 1 : 0,
|
|
473
|
+
transition: 'opacity 300ms ease-out',
|
|
419
474
|
// Drag-to-orbit owns every pointer gesture on the canvas — without `none` a
|
|
420
475
|
// touch drag scrolls the page instead of turning the character.
|
|
421
476
|
touchAction: 'none',
|
|
@@ -442,7 +497,21 @@ export const CharacterCanvas = forwardRef(function CharacterCanvas({ source, spe
|
|
|
442
497
|
return;
|
|
443
498
|
orbitDragRef.current = null;
|
|
444
499
|
e.currentTarget.style.cursor = 'grab';
|
|
445
|
-
} }), err && (
|
|
500
|
+
} }), !assembled && !err && (_jsxs("div", { role: "status", "data-id": "character-loading", className: "ucv-loading", style: {
|
|
501
|
+
position: 'absolute',
|
|
502
|
+
inset: 0,
|
|
503
|
+
display: 'flex',
|
|
504
|
+
flexDirection: 'column',
|
|
505
|
+
alignItems: 'center',
|
|
506
|
+
justifyContent: 'center',
|
|
507
|
+
gap: 10,
|
|
508
|
+
// Never eat a pointer gesture: the canvas underneath owns drag-to-orbit, and the
|
|
509
|
+
// cover is decoration.
|
|
510
|
+
pointerEvents: 'none',
|
|
511
|
+
font: '13px/1.5 system-ui, sans-serif',
|
|
512
|
+
letterSpacing: '0.02em',
|
|
513
|
+
color: 'rgba(255,255,255,0.62)',
|
|
514
|
+
}, children: [_jsx("span", { className: "ucv-loading-dot", "aria-hidden": "true" }), "Building your character\u2026"] })), err && (_jsx("div", { role: "alert", style: {
|
|
446
515
|
position: 'absolute',
|
|
447
516
|
inset: 0,
|
|
448
517
|
display: 'flex',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CharacterCanvas.js","sourceRoot":"","sources":["../../../src/character/client/CharacterCanvas.tsx"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,4EAA4E;AAC5E,EAAE;AACF,6FAA6F;AAC7F,8FAA8F;AAC9F,6FAA6F;AAC7F,8EAA8E;AAC9E,EAAE;AACF,0FAA0F;AAC1F,+FAA+F;AAC/F,4EAA4E;AAC5E,EAAE;AACF,yFAAyF;AACzF,gGAAgG;AAChG,0FAA0F;AAC1F,gFAAgF;AAChF,OAAO,EACL,UAAU,EACV,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGhF,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAqB,MAAM,mBAAmB,CAAC;AAwEnE,mGAAmG;AACnG,MAAM,GAAG,GAAG,GAAG,CAAC;AAEhB,4FAA4F;AAC5F,gFAAgF;AAChF,MAAM,OAAO,GAA6B,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC5D,MAAM,GAAG,GAA6B,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACzD,MAAM,KAAK,GAA6B,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC3D,MAAM,GAAG,GAA6B,KAAK,CAAC;AAC5C,MAAM,WAAW,GAAG,CAAC,CAAC;AAYtB,sGAAsG;AACtG,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,MAAc,EAAU,EAAE,CACzD,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAErD;;;;;;GAMG;AACH,SAAS,UAAU,CACjB,MAA6B,EAC7B,KAA4B,EAC5B,MAAc;IAEd,MAAM,CAAC,GAAG,KAAK,EAAE,UAAU,IAAI,GAAG,CAAC;IACnC,MAAM,IAAI,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC;IACxC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,GAAG,GAAS,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,OAAO;YACL,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YAC7D,GAAG;SACJ,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,GAAG,GAAS,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,OAAO;YACL,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YAC9D,GAAG;SACJ,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAS,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACvC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;AACrD,CAAC;AAED,sFAAsF;AACtF,SAAS,MAAM,CAAC,GAAS,EAAE,GAAS;IAClC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAGvC,SAAS,eAAe,CACxB,EACE,MAAM,EACN,IAAI,EACJ,IAAI,GAAG,IAAI,EACX,KAAK,EACL,MAAM,GAAG,MAAM,EACf,MAAM,GAAG,IAAI,EACb,GAAG,GAAG,CAAC,EACP,WAAW,GAAG,IAAI,EAClB,SAAS,EACT,OAAO,EACP,MAAM,EACN,OAAO,EACP,OAAO,GACR,EACD,GAAG;IAEH,MAAM,SAAS,GAAG,MAAM,CAA2B,IAAI,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,MAAM,CAAkB,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAEpD,2FAA2F;IAC3F,qCAAqC;IACrC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IACvB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IACvB,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;IACzB,MAAM,SAAS,GAAG,MAAM,CAAwB,MAAM,CAAC,CAAC;IACxD,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC;IACrB,2FAA2F;IAC3F,yFAAyF;IACzF,4BAA4B;IAC5B,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,YAAY,GAAG,MAAM,CAA0C,IAAI,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAC7B,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3C,cAAc,CAAC,OAAO,GAAG,WAAW,CAAC;IAErC,4FAA4F;IAC5F,uEAAuE;IACvE,MAAM,cAAc,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IACnD,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,cAAc,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAEnD,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,OAAe,EAAE,EAAE;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC;QAChB,UAAU,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,mFAAmF;IACnF,MAAM,MAAM,GAAG,MAAM,CAA2B;QAC9C,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QACpB,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;KAClB,CAAC,CAAC;IAEH;;;;OAIG;IACH,MAAM,cAAc,GAAG,CACrB,KAAqB,EACrB,IAAuB,EACjB,EAAE;QACR,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;QAC7B,IAAI,IAAI,KAAK,cAAc,CAAC,OAAO;YAAE,OAAO;QAC5C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACpB,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,sFAAsF;YACtF,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBAC9B,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;gBAChC,OAAO,CAAC,KAAK,CACX,qBAAqB,IAAI,wDAAwD;oBAC/E,yEAAyE,CAC5E,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC;QAC5B,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,kCAAkC;QACrD,IAAI,cAAc,CAAC,OAAO,KAAK,IAAI;YAAE,OAAO;QAC5C,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;QAC9B,KAAK,WAAW,CACd,KAAK,EACL,IAAI,EACJ,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,OAAO,CACb;aACE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YACd,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO;YACtB,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;YAC9B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtB,kFAAkF;YAClF,uFAAuF;YACvF,4BAA4B;YAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;gBAC7C,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;YAC7B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACpB,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;QAChC,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;YACpB,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;YAC9B,8EAA8E;YAC9E,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,qBAAqB,IAAI,gBAAgB,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,8FAA8F;IAC9F,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAC7B,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,2FAA2F;YAC3F,0FAA0F;YAC1F,oEAAoE;YACpE,MAAM,GAAG,GAAI,SAAsC,CAAC,GAAG,CAAC;YACxD,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,WAAW,CACT,gFAAgF;oBAC9E,4DAA4D,CAC/D,CAAC;gBACF,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;YACjC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO;YACjC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC;YAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,WAAW,CACT,2DAA2D,CAC5D,CAAC;gBACF,OAAO;YACT,CAAC;YACD,0FAA0F;YAC1F,wFAAwF;YACxF,mEAAmE;YACnE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC;gBACzC,gBAAgB,EAAE,kBAAkB,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;aACnE,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YACD,0FAA0F;YAC1F,kFAAkF;YAClF,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,CAAC,CAAQ,EAAE,EAAE;gBACtD,MAAM,GAAG,GACN,CAAiD,CAAC,KAAK,EAAE,OAAO;oBACjE,SAAS,CAAC;gBACZ,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC;YACH,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC1B,IAAI,CAAC,IAAI,CAAC,IAAI;oBACZ,WAAW,CAAC,uBAAuB,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,CAAC,GAAG;gBAAE,OAAO;YACjB,MAAM,MAAM,GAAG,GAAG,CAAC,wBAAwB,EAAE,CAAC;YAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC;YACtD,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;YAC7D,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;YAC/D,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;YAEvD,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACjD,MAAM,EAAE,GAAa;gBACnB,MAAM;gBACN,GAAG;gBACH,KAAK;gBACL,GAAG;gBACH,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC;oBAC1B,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;oBACnC,MAAM,EAAE,aAAa;oBACrB,KAAK,EAAE,eAAe,CAAC,iBAAiB;iBACzC,CAAC;aACH,CAAC;YACF,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;YACpB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,cAAc,CAAC,OAAO;gBAAE,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAEzE,uFAAuF;YACvF,EAAE;YACF,0FAA0F;YAC1F,4FAA4F;YAC5F,4FAA4F;YAC5F,sFAAsF;YACtF,mBAAmB;YACnB,KAAK,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE;gBACvC,IAAI,IAAI,CAAC,IAAI;oBAAE,OAAO;gBACtB,IAAI,CAAC;oBACH,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAClB,yEAAyE;oBACzE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC/B,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC9B,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAClC,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,WAAW,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;gBACtB,WAAW,CACT,iCAAiC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC9E,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,KAAK,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC;iBAChD,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;gBACd,IAAI,CAAC,IAAI,CAAC,IAAI;oBAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACxC,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE,CACpB,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,CAAC,CAAC,CACxD,CAAC;YACJ,KAAK,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC;iBAChC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;gBACb,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI;oBAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9C,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE,CACpB,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAClD,CAAC;YACJ,KAAK,YAAY,CAAC,MAAM,CAAC;iBACtB,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;gBACZ,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI;oBACnB,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YACrE,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE,CACpB,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,CAAC,CAAC,CACtD,CAAC;YAEJ,uFAAuF;YACvF,IAAI,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAC7B,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,MAAM,IAAI,GAAG,CAAC,KAAa,EAAQ,EAAE;gBACnC,IAAI,IAAI,CAAC,IAAI;oBAAE,OAAO;gBACtB,GAAG,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC;gBAC5B,IAAI,CAAC,CAAC;oBAAE,OAAO;gBACf,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;gBACtD,IAAI,GAAG,KAAK,CAAC;gBAEb,sEAAsE;gBACtE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;gBACtD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;gBACvD,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACpC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;oBACZ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;oBACb,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;oBACnB,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;wBAC9B,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;wBACZ,MAAM,EAAE,aAAa;wBACrB,KAAK,EAAE,eAAe,CAAC,iBAAiB;qBACzC,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;gBAErB,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC5B,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;gBACnD,uFAAuF;gBACvF,wCAAwC;gBACxC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAEnC,uFAAuF;gBACvF,sEAAsE;gBACtE,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;gBAC1D,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;gBACvC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;gBAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3B,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC;oBAC5D,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC;gBAC9D,CAAC;gBAED,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC5B,KAAK,CAAC,SAAS,EAAE,CAAC;gBAClB,MAAM,KAAK,GAAG,IAAI,YAAY,CAC5B,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CACxD,CAAC;gBACF,MAAM,GAAG,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;gBAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CACtB,GAAG,EACH,GAAG,CAAC,iBAAiB,EAAE,CAAC,UAAU,EAAE,EACpC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EACrB,KAAK,EACL,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,EACxB,OAAO,EACP,GAAG,EACH,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EACpC,GAAG,EACH,WAAW,EACX,KAAK,CACN,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACpC,uFAAuF;gBACvF,0EAA0E;gBAC1E,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACvB,SAAS,GAAG,IAAI,CAAC;oBACjB,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;gBACzB,CAAC;YACH,CAAC,CAAC;YACF,GAAG,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;YACxB,WAAW,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;YAC1B,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,IAAI,EAAE,EAAE,CAAC;gBACP,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnB,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACtB,CAAC;QACH,CAAC,CAAC;QACF,qFAAqF;QACrF,uDAAuD;IACzD,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAE1B,8FAA8F;IAC9F,EAAE;IACF,0FAA0F;IAC1F,sFAAsF;IACtF,6BAA6B;IAC7B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,CAAC;YACH,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,WAAW,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IAExB,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,6FAA6F;IAC7F,mBAAmB,CACjB,GAAG,EACH,GAA0B,EAAE,CAAC,CAAC;QAC5B,gBAAgB,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE;YACpC,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;YAC1B,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC;YAC5B,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK;gBAC9B,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;YACJ,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;YAC3B,MAAM,QAAQ,GAAS,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAS,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;YACtD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC;YAChD,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS;gBAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEtD,mFAAmF;YACnF,yCAAyC;YACzC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC;YAClC,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAClD,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC5B,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACrB,oFAAoF;YACpF,sFAAsF;YACtF,kEAAkE;YAClE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;YAC7C,EAAE,CAAC,KAAK,CAAC,KAAK,CACZ,GAAG,EACH,EAAE,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,UAAU,EAAE,EACvC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EACrB,IAAI,YAAY,CACd,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CACxD,EACD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,EACxB,OAAO,EACP,GAAG,EACH,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EACpC,GAAG,EACH,WAAW,EACX,KAAK,CACN,CAAC;YACF,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACvC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACtC,gEAAgE;YAChE,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,EAAE,CACtD,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,CACtC,CAAC;YACF,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC;YACnB,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC;YACnB,IAAI,CAAC,IAAI;gBACP,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO;KAChC,CAAC,EACF,EAAE,CACH,CAAC;IAEF,OAAO,CACL,eACE,SAAS,EAAE,SAAS,aACZ,kBAAkB,EAC1B,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAE9D,iBACE,GAAG,EAAE,SAAS,gBACH,mBAAmB,EAC9B,KAAK,EAAE;oBACL,OAAO,EAAE,OAAO;oBAChB,KAAK,EAAE,MAAM;oBACb,MAAM,EAAE,MAAM;oBACd,4EAA4E;oBAC5E,gEAAgE;oBAChE,WAAW,EAAE,MAAM;oBACnB,oFAAoF;oBACpF,4CAA4C;oBAC5C,MAAM,EAAE,MAAM;iBACf,EACD,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE;oBACnB,gFAAgF;oBAChF,YAAY,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;oBAChE,CAAC,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;oBAC/C,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC;gBAC5C,CAAC,EACD,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE;oBACnB,IAAI,YAAY,CAAC,OAAO,EAAE,SAAS,KAAK,CAAC,CAAC,SAAS;wBAAE,OAAO;oBAC5D,WAAW,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;oBAClE,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;gBACrC,CAAC,EACD,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE;oBACjB,IAAI,YAAY,CAAC,OAAO,EAAE,SAAS,KAAK,CAAC,CAAC,SAAS;wBAAE,OAAO;oBAC5D,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;oBAC5B,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;gBACxC,CAAC,EACD,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE;oBACrB,IAAI,YAAY,CAAC,OAAO,EAAE,SAAS,KAAK,CAAC,CAAC,SAAS;wBAAE,OAAO;oBAC5D,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;oBAC5B,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;gBACxC,CAAC,GACD,EACD,GAAG,IAAI,CACN,cACE,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE;oBACL,QAAQ,EAAE,UAAU;oBACpB,KAAK,EAAE,CAAC;oBACR,OAAO,EAAE,MAAM;oBACf,UAAU,EAAE,QAAQ;oBACpB,cAAc,EAAE,QAAQ;oBACxB,OAAO,EAAE,EAAE;oBACX,KAAK,EAAE,SAAS;oBAChB,UAAU,EAAE,uBAAuB;oBACnC,IAAI,EAAE,gCAAgC;oBACtC,SAAS,EAAE,QAAQ;iBACpB,YAEA,GAAG,GACA,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"CharacterCanvas.js","sourceRoot":"","sources":["../../../src/character/client/CharacterCanvas.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** The four independent loads a character is assembled from. */
|
|
2
|
+
export type AssemblyPart = 'kit' | 'parts' | 'hair' | 'garments';
|
|
3
|
+
export interface AssemblyGate {
|
|
4
|
+
/**
|
|
5
|
+
* Mark one loader done.
|
|
6
|
+
*
|
|
7
|
+
* ⚠️ "DONE" INCLUDES FAILURE AND A LEGITIMATE `null`. `loadHairMeshes` and `loadGarments`
|
|
8
|
+
* both resolve to null for a kit cooked without those assets, and either can reject; if any
|
|
9
|
+
* of those counted as still-pending the cover would never lift. Idempotent.
|
|
10
|
+
*/
|
|
11
|
+
settle(part: AssemblyPart): void;
|
|
12
|
+
/** A frame reached the screen. Idempotent. */
|
|
13
|
+
frameDrew(): void;
|
|
14
|
+
/** Reveal now regardless — the kit failed outright, or the caller's cap expired. */
|
|
15
|
+
abandon(): void;
|
|
16
|
+
/** Whether the character should be shown. */
|
|
17
|
+
readonly revealed: boolean;
|
|
18
|
+
}
|
|
19
|
+
/** `onReveal` fires at most once, however much arrives afterwards. */
|
|
20
|
+
export declare function createAssemblyGate(onReveal: () => void): AssemblyGate;
|
|
21
|
+
//# sourceMappingURL=assemblyGate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assemblyGate.d.ts","sourceRoot":"","sources":["../../../../src/character/client/lib/assemblyGate.ts"],"names":[],"mappings":"AAiBA,gEAAgE;AAChE,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;AAIjE,MAAM,WAAW,YAAY;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IACjC,8CAA8C;IAC9C,SAAS,IAAI,IAAI,CAAC;IAClB,oFAAoF;IACpF,OAAO,IAAI,IAAI,CAAC;IAChB,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,YAAY,CA+BrE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
2
|
+
// WHEN IS THE CHARACTER FINISHED? — the bookkeeping behind the loading cover.
|
|
3
|
+
//
|
|
4
|
+
// `CharacterCanvas` fires four asset loads in parallel and the frame loop draws whatever has
|
|
5
|
+
// landed, so without a gate the user watches a bald naked body gain eyes, then hair, then
|
|
6
|
+
// clothes. The canvas stays hidden until all four have settled and something has actually
|
|
7
|
+
// reached the screen.
|
|
8
|
+
//
|
|
9
|
+
// ⚠️ A SET, NOT A COUNTER. Counting settles instead of tracking WHICH settled means hair that
|
|
10
|
+
// resolves and then rejects satisfies the count twice, and the cover lifts on a character with
|
|
11
|
+
// no clothes on. The test suite pins this.
|
|
12
|
+
//
|
|
13
|
+
// ⚠️ NO CLOCK IN HERE. The 30-second "reveal regardless" cap belongs to the caller, which owns
|
|
14
|
+
// the timer and calls `abandon()`. That keeps this module pure — testable with no fake timers
|
|
15
|
+
// and no way for a stray timeout to outlive the component that made it.
|
|
16
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
17
|
+
const PARTS = ['kit', 'parts', 'hair', 'garments'];
|
|
18
|
+
/** `onReveal` fires at most once, however much arrives afterwards. */
|
|
19
|
+
export function createAssemblyGate(onReveal) {
|
|
20
|
+
const settled = new Set();
|
|
21
|
+
let drew = false;
|
|
22
|
+
let revealed = false;
|
|
23
|
+
const check = () => {
|
|
24
|
+
if (revealed)
|
|
25
|
+
return;
|
|
26
|
+
if (!drew)
|
|
27
|
+
return;
|
|
28
|
+
if (!PARTS.every((p) => settled.has(p)))
|
|
29
|
+
return;
|
|
30
|
+
revealed = true;
|
|
31
|
+
onReveal();
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
settle(part) {
|
|
35
|
+
settled.add(part);
|
|
36
|
+
check();
|
|
37
|
+
},
|
|
38
|
+
frameDrew() {
|
|
39
|
+
drew = true;
|
|
40
|
+
check();
|
|
41
|
+
},
|
|
42
|
+
abandon() {
|
|
43
|
+
if (revealed)
|
|
44
|
+
return;
|
|
45
|
+
revealed = true;
|
|
46
|
+
onReveal();
|
|
47
|
+
},
|
|
48
|
+
get revealed() {
|
|
49
|
+
return revealed;
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=assemblyGate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assemblyGate.js","sourceRoot":"","sources":["../../../../src/character/client/lib/assemblyGate.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,8EAA8E;AAC9E,EAAE;AACF,6FAA6F;AAC7F,0FAA0F;AAC1F,0FAA0F;AAC1F,sBAAsB;AACtB,EAAE;AACF,8FAA8F;AAC9F,+FAA+F;AAC/F,2CAA2C;AAC3C,EAAE;AACF,+FAA+F;AAC/F,8FAA8F;AAC9F,wEAAwE;AACxE,gFAAgF;AAKhF,MAAM,KAAK,GAA4B,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AAmB5E,sEAAsE;AACtE,MAAM,UAAU,kBAAkB,CAAC,QAAoB;IACrD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgB,CAAC;IACxC,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,IAAI,QAAQ;YAAE,OAAO;QACrB,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO;QAChD,QAAQ,GAAG,IAAI,CAAC;QAChB,QAAQ,EAAE,CAAC;IACb,CAAC,CAAC;IAEF,OAAO;QACL,MAAM,CAAC,IAAI;YACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,KAAK,EAAE,CAAC;QACV,CAAC;QACD,SAAS;YACP,IAAI,GAAG,IAAI,CAAC;YACZ,KAAK,EAAE,CAAC;QACV,CAAC;QACD,OAAO;YACL,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,QAAQ,EAAE,CAAC;QACb,CAAC;QACD,IAAI,QAAQ;YACV,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/cli/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.974";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cli/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ugly-app",
|
|
3
3
|
"packageManager": "pnpm@10.34.5",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.974",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"comment:files": "Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.",
|
|
7
7
|
"files": [
|
|
@@ -27,6 +27,7 @@ import { pickTranscodeTarget, requiredFeatureFor } from 'ugly-game/assets/ktx2';
|
|
|
27
27
|
import type { CharacterSpec } from '../shared/spec.js';
|
|
28
28
|
import type { CharKitFacts } from '../shared/lib/charSpec.js';
|
|
29
29
|
import { CharacterScene } from './lib/characterScene.js';
|
|
30
|
+
import { createAssemblyGate } from './lib/assemblyGate.js';
|
|
30
31
|
import { loadCharKit } from './lib/charKit.js';
|
|
31
32
|
import { loadCharParts } from './lib/charParts.js';
|
|
32
33
|
import { loadHairMeshes } from './lib/charHair.js';
|
|
@@ -68,7 +69,14 @@ export interface CharacterCanvasProps {
|
|
|
68
69
|
*/
|
|
69
70
|
faceWeights?: Float32Array | null | undefined;
|
|
70
71
|
className?: string | undefined;
|
|
71
|
-
/**
|
|
72
|
+
/**
|
|
73
|
+
* Fires once, when the character is ASSEMBLED — body, face parts, hair and garments have all
|
|
74
|
+
* settled and a frame carrying them has been drawn. This is also when the loading cover lifts.
|
|
75
|
+
*
|
|
76
|
+
* ⚠️ IT USED TO MEAN "THE FIRST FRAME DREW", which was mid-assembly: the body exists long
|
|
77
|
+
* before the clothes do. `captureThumbnail` tells callers to wait for this event, so under the
|
|
78
|
+
* old meaning a fast save could store a bald, naked character as its permanent thumbnail.
|
|
79
|
+
*/
|
|
72
80
|
onReady?: (() => void) | undefined;
|
|
73
81
|
/** Fires per kit tier — `false` for the coarse prefix, `true` for the full container. */
|
|
74
82
|
onTier?: ((full: boolean) => void) | undefined;
|
|
@@ -104,6 +112,22 @@ export interface CharacterCanvasHandle {
|
|
|
104
112
|
canvas(): HTMLCanvasElement | null;
|
|
105
113
|
}
|
|
106
114
|
|
|
115
|
+
/**
|
|
116
|
+
* The loading cover's own two rules.
|
|
117
|
+
*
|
|
118
|
+
* ⚠️ AN INJECTED `<style>` RATHER THAN INLINE STYLES, because a keyframe cannot be expressed as
|
|
119
|
+
* a style attribute — the same reason `CharacterCreator` injects its own sheet. Kept to two
|
|
120
|
+
* rules and prefixed `ucv-` so it cannot collide with a host's CSS.
|
|
121
|
+
*/
|
|
122
|
+
const COVER_CSS = `
|
|
123
|
+
@keyframes ucv-pulse{0%,100%{opacity:.35; transform:scale(.85);}50%{opacity:1; transform:scale(1);}}
|
|
124
|
+
.ucv-loading-dot{
|
|
125
|
+
width:9px; height:9px; border-radius:50%; background:currentColor; display:block;
|
|
126
|
+
animation:ucv-pulse 1.25s ease-in-out infinite;
|
|
127
|
+
}
|
|
128
|
+
@media (prefers-reduced-motion:reduce){.ucv-loading-dot{animation:none; opacity:.7;}}
|
|
129
|
+
`;
|
|
130
|
+
|
|
107
131
|
/** Vertical field of view, radians — the char lab's 0.7, which its framings were tuned against. */
|
|
108
132
|
const FOV = 0.7;
|
|
109
133
|
|
|
@@ -197,6 +221,8 @@ export const CharacterCanvas = forwardRef<
|
|
|
197
221
|
const canvasRef = useRef<HTMLCanvasElement | null>(null);
|
|
198
222
|
const gpuRef = useRef<GpuState | null>(null);
|
|
199
223
|
const [err, setErr] = useState<string | null>(null);
|
|
224
|
+
/** False until the character is whole — drives the cover. See `createAssemblyGate`. */
|
|
225
|
+
const [assembled, setAssembled] = useState(false);
|
|
200
226
|
|
|
201
227
|
// Latest-value refs, so the init effect and the frame loop never go stale and never re-run
|
|
202
228
|
// for a callback the parent rebuilt.
|
|
@@ -310,6 +336,21 @@ export const CharacterCanvas = forwardRef<
|
|
|
310
336
|
useEffect(() => {
|
|
311
337
|
let raf = 0;
|
|
312
338
|
const live = { dead: false };
|
|
339
|
+
// A new `source` rebuilds the whole GPU stack, so the cover comes back down with it.
|
|
340
|
+
setAssembled(false);
|
|
341
|
+
const gate = createAssemblyGate(() => {
|
|
342
|
+
if (live.dead) return;
|
|
343
|
+
setAssembled(true);
|
|
344
|
+
onReadyRef.current?.();
|
|
345
|
+
});
|
|
346
|
+
/**
|
|
347
|
+
* ⚠️ THE CAP EXISTS SO A HUNG FETCH CANNOT LEAVE A PERMANENTLY BLANK STAGE. Thirty seconds
|
|
348
|
+
* because the kit legitimately streams ~6 MB on a cold cache; ugly-bot's `AvatarPreview`
|
|
349
|
+
* uses 12 s against much smaller assets for the same reason.
|
|
350
|
+
*/
|
|
351
|
+
const capTimer = setTimeout(() => {
|
|
352
|
+
if (!live.dead) gate.abandon();
|
|
353
|
+
}, 30_000);
|
|
313
354
|
void (async () => {
|
|
314
355
|
// Read through an explicitly-optional shape: @webgpu/types declares `navigator.gpu` always
|
|
315
356
|
// present, so a plain access makes this guard look like dead code to the compiler — while
|
|
@@ -385,12 +426,21 @@ export const CharacterCanvas = forwardRef<
|
|
|
385
426
|
// RECORDED, not swallowed: an asset that does not load leaves the character short a feature
|
|
386
427
|
// and says why in the console, which is how a broken cook does not become a permanent
|
|
387
428
|
// missing feature.
|
|
429
|
+
//
|
|
430
|
+
// ⚠️ EVERY ONE OF THESE SETTLES THE GATE, ON BOTH PATHS. A loader that resolves to null
|
|
431
|
+
// (a kit cooked without hair or without garments — both legitimate) or rejects (a 404 on
|
|
432
|
+
// one texture) is still DONE, and if it did not say so the cover would never lift and the
|
|
433
|
+
// character would never appear at all. See `assemblyGate.ts`.
|
|
388
434
|
void loadCharKit(source, device, (kit) => {
|
|
389
435
|
if (live.dead) return;
|
|
390
436
|
try {
|
|
391
437
|
scene.setKit(kit);
|
|
392
438
|
// The spec may have arrived before the first tier did (it usually does).
|
|
393
439
|
scene.setSpec(specRef.current);
|
|
440
|
+
// ⚠️ THE COARSE TIER COUNTS. This callback fires twice — coarse prefix, then full
|
|
441
|
+
// container — and waiting for the second would hold the cover far longer on a cold
|
|
442
|
+
// cache to buy body DETAIL, which sharpens in place rather than popping in.
|
|
443
|
+
gate.settle('kit');
|
|
394
444
|
onTierRef.current?.(kit.full);
|
|
395
445
|
onFactsRef.current?.(kit.facts);
|
|
396
446
|
} catch (e) {
|
|
@@ -400,6 +450,9 @@ export const CharacterCanvas = forwardRef<
|
|
|
400
450
|
reportError(
|
|
401
451
|
`character kit failed to load: ${e instanceof Error ? e.message : String(e)}`,
|
|
402
452
|
);
|
|
453
|
+
// No kit means no character, ever. Reveal so the error overlay is the thing on screen
|
|
454
|
+
// rather than a loading label that will never resolve.
|
|
455
|
+
gate.abandon();
|
|
403
456
|
});
|
|
404
457
|
void loadCharParts(device, source, source.manifest)
|
|
405
458
|
.then((parts) => {
|
|
@@ -407,14 +460,16 @@ export const CharacterCanvas = forwardRef<
|
|
|
407
460
|
})
|
|
408
461
|
.catch((e: unknown) =>
|
|
409
462
|
console.error('[character] face parts did not load', e),
|
|
410
|
-
)
|
|
463
|
+
)
|
|
464
|
+
.finally(() => gate.settle('parts'));
|
|
411
465
|
void loadHairMeshes(device, source)
|
|
412
466
|
.then((hair) => {
|
|
413
467
|
if (hair && !live.dead) scene.setHair(hair);
|
|
414
468
|
})
|
|
415
469
|
.catch((e: unknown) =>
|
|
416
470
|
console.error('[character] hair did not load', e),
|
|
417
|
-
)
|
|
471
|
+
)
|
|
472
|
+
.finally(() => gate.settle('hair'));
|
|
418
473
|
void loadGarments(source)
|
|
419
474
|
.then((kit) => {
|
|
420
475
|
if (kit && !live.dead)
|
|
@@ -422,11 +477,11 @@ export const CharacterCanvas = forwardRef<
|
|
|
422
477
|
})
|
|
423
478
|
.catch((e: unknown) =>
|
|
424
479
|
console.error('[character] garments did not load', e),
|
|
425
|
-
)
|
|
480
|
+
)
|
|
481
|
+
.finally(() => gate.settle('garments'));
|
|
426
482
|
|
|
427
483
|
// ── THE FRAME LOOP ──────────────────────────────────────────────────────────────────
|
|
428
484
|
let last = performance.now();
|
|
429
|
-
let announced = false;
|
|
430
485
|
const draw = (nowMs: number): void => {
|
|
431
486
|
if (live.dead) return;
|
|
432
487
|
raf = requestAnimationFrame(draw);
|
|
@@ -486,12 +541,10 @@ export const CharacterCanvas = forwardRef<
|
|
|
486
541
|
CLEAR,
|
|
487
542
|
);
|
|
488
543
|
device.queue.submit([enc.finish()]);
|
|
489
|
-
// ⚠️ AFTER a frame actually drew, not after the kit decoded —
|
|
490
|
-
// character on
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
onReadyRef.current?.();
|
|
494
|
-
}
|
|
544
|
+
// ⚠️ AFTER a frame actually drew, not after the kit decoded — a decoded-but-never-drawn
|
|
545
|
+
// kit is not a character on screen. This is one of the gate's two conditions; the other
|
|
546
|
+
// is that all four loaders have settled, so a drawn body alone no longer reveals.
|
|
547
|
+
if (drew) gate.frameDrew();
|
|
495
548
|
};
|
|
496
549
|
raf = requestAnimationFrame(draw);
|
|
497
550
|
})().catch((e: unknown) => {
|
|
@@ -499,6 +552,7 @@ export const CharacterCanvas = forwardRef<
|
|
|
499
552
|
});
|
|
500
553
|
return () => {
|
|
501
554
|
live.dead = true;
|
|
555
|
+
clearTimeout(capTimer);
|
|
502
556
|
cancelAnimationFrame(raf);
|
|
503
557
|
const st = gpuRef.current;
|
|
504
558
|
gpuRef.current = null;
|
|
@@ -601,6 +655,7 @@ export const CharacterCanvas = forwardRef<
|
|
|
601
655
|
data-id="character-canvas"
|
|
602
656
|
style={{ position: 'relative', width: '100%', height: '100%' }}
|
|
603
657
|
>
|
|
658
|
+
<style>{COVER_CSS}</style>
|
|
604
659
|
<canvas
|
|
605
660
|
ref={canvasRef}
|
|
606
661
|
aria-label="Character preview"
|
|
@@ -608,6 +663,12 @@ export const CharacterCanvas = forwardRef<
|
|
|
608
663
|
display: 'block',
|
|
609
664
|
width: '100%',
|
|
610
665
|
height: '100%',
|
|
666
|
+
// ⚠️ THE CANVAS ITSELF FADES — there is no cover element painted over it. An opaque
|
|
667
|
+
// panel would have to name a background colour, and no single colour is right: the
|
|
668
|
+
// creator's stage is a radial gradient while the canvas clears to a flat near-black.
|
|
669
|
+
// Fading the canvas lets the HOST's own backdrop be the cover, in every host.
|
|
670
|
+
opacity: assembled ? 1 : 0,
|
|
671
|
+
transition: 'opacity 300ms ease-out',
|
|
611
672
|
// Drag-to-orbit owns every pointer gesture on the canvas — without `none` a
|
|
612
673
|
// touch drag scrolls the page instead of turning the character.
|
|
613
674
|
touchAction: 'none',
|
|
@@ -637,6 +698,31 @@ export const CharacterCanvas = forwardRef<
|
|
|
637
698
|
e.currentTarget.style.cursor = 'grab';
|
|
638
699
|
}}
|
|
639
700
|
/>
|
|
701
|
+
{!assembled && !err && (
|
|
702
|
+
<div
|
|
703
|
+
role="status"
|
|
704
|
+
data-id="character-loading"
|
|
705
|
+
className="ucv-loading"
|
|
706
|
+
style={{
|
|
707
|
+
position: 'absolute',
|
|
708
|
+
inset: 0,
|
|
709
|
+
display: 'flex',
|
|
710
|
+
flexDirection: 'column',
|
|
711
|
+
alignItems: 'center',
|
|
712
|
+
justifyContent: 'center',
|
|
713
|
+
gap: 10,
|
|
714
|
+
// Never eat a pointer gesture: the canvas underneath owns drag-to-orbit, and the
|
|
715
|
+
// cover is decoration.
|
|
716
|
+
pointerEvents: 'none',
|
|
717
|
+
font: '13px/1.5 system-ui, sans-serif',
|
|
718
|
+
letterSpacing: '0.02em',
|
|
719
|
+
color: 'rgba(255,255,255,0.62)',
|
|
720
|
+
}}
|
|
721
|
+
>
|
|
722
|
+
<span className="ucv-loading-dot" aria-hidden="true" />
|
|
723
|
+
Building your character…
|
|
724
|
+
</div>
|
|
725
|
+
)}
|
|
640
726
|
{err && (
|
|
641
727
|
<div
|
|
642
728
|
role="alert"
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
2
|
+
// WHEN IS THE CHARACTER FINISHED? — the bookkeeping behind the loading cover.
|
|
3
|
+
//
|
|
4
|
+
// `CharacterCanvas` fires four asset loads in parallel and the frame loop draws whatever has
|
|
5
|
+
// landed, so without a gate the user watches a bald naked body gain eyes, then hair, then
|
|
6
|
+
// clothes. The canvas stays hidden until all four have settled and something has actually
|
|
7
|
+
// reached the screen.
|
|
8
|
+
//
|
|
9
|
+
// ⚠️ A SET, NOT A COUNTER. Counting settles instead of tracking WHICH settled means hair that
|
|
10
|
+
// resolves and then rejects satisfies the count twice, and the cover lifts on a character with
|
|
11
|
+
// no clothes on. The test suite pins this.
|
|
12
|
+
//
|
|
13
|
+
// ⚠️ NO CLOCK IN HERE. The 30-second "reveal regardless" cap belongs to the caller, which owns
|
|
14
|
+
// the timer and calls `abandon()`. That keeps this module pure — testable with no fake timers
|
|
15
|
+
// and no way for a stray timeout to outlive the component that made it.
|
|
16
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
17
|
+
|
|
18
|
+
/** The four independent loads a character is assembled from. */
|
|
19
|
+
export type AssemblyPart = 'kit' | 'parts' | 'hair' | 'garments';
|
|
20
|
+
|
|
21
|
+
const PARTS: readonly AssemblyPart[] = ['kit', 'parts', 'hair', 'garments'];
|
|
22
|
+
|
|
23
|
+
export interface AssemblyGate {
|
|
24
|
+
/**
|
|
25
|
+
* Mark one loader done.
|
|
26
|
+
*
|
|
27
|
+
* ⚠️ "DONE" INCLUDES FAILURE AND A LEGITIMATE `null`. `loadHairMeshes` and `loadGarments`
|
|
28
|
+
* both resolve to null for a kit cooked without those assets, and either can reject; if any
|
|
29
|
+
* of those counted as still-pending the cover would never lift. Idempotent.
|
|
30
|
+
*/
|
|
31
|
+
settle(part: AssemblyPart): void;
|
|
32
|
+
/** A frame reached the screen. Idempotent. */
|
|
33
|
+
frameDrew(): void;
|
|
34
|
+
/** Reveal now regardless — the kit failed outright, or the caller's cap expired. */
|
|
35
|
+
abandon(): void;
|
|
36
|
+
/** Whether the character should be shown. */
|
|
37
|
+
readonly revealed: boolean;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** `onReveal` fires at most once, however much arrives afterwards. */
|
|
41
|
+
export function createAssemblyGate(onReveal: () => void): AssemblyGate {
|
|
42
|
+
const settled = new Set<AssemblyPart>();
|
|
43
|
+
let drew = false;
|
|
44
|
+
let revealed = false;
|
|
45
|
+
|
|
46
|
+
const check = (): void => {
|
|
47
|
+
if (revealed) return;
|
|
48
|
+
if (!drew) return;
|
|
49
|
+
if (!PARTS.every((p) => settled.has(p))) return;
|
|
50
|
+
revealed = true;
|
|
51
|
+
onReveal();
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
settle(part) {
|
|
56
|
+
settled.add(part);
|
|
57
|
+
check();
|
|
58
|
+
},
|
|
59
|
+
frameDrew() {
|
|
60
|
+
drew = true;
|
|
61
|
+
check();
|
|
62
|
+
},
|
|
63
|
+
abandon() {
|
|
64
|
+
if (revealed) return;
|
|
65
|
+
revealed = true;
|
|
66
|
+
onReveal();
|
|
67
|
+
},
|
|
68
|
+
get revealed() {
|
|
69
|
+
return revealed;
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
package/src/cli/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by prebuild — do not edit manually
|
|
2
|
-
export const CLI_VERSION = "0.1.
|
|
2
|
+
export const CLI_VERSION = "0.1.974";
|