ugly-app 0.1.973 → 0.1.975

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.
@@ -34,7 +34,14 @@ export interface CharacterCanvasProps {
34
34
  */
35
35
  faceWeights?: Float32Array | null | undefined;
36
36
  className?: string | undefined;
37
- /** Fires once, when the first frame with the character actually on it has been drawn. */
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;AAO9D,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,yFAAyF;IACzF,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;AAuED,eAAO,MAAM,eAAe,wHAqe1B,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,wHAsiB1B,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,16 @@ 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 FULL TIER ONLY, AND THE COARSE ONE IS NOT CLOSE ENOUGH. This callback fires
298
+ // twice — coarse (LOD2+LOD3) then the full container — and revealing on the coarse one
299
+ // shows a character with a HOLE where its clothes go. `setKit` degenerates the body
300
+ // triangles under anything worn the moment the spec dresses it (`dressedRungs`), but
301
+ // `rebuildGarment` refuses to conform a garment without `kit.scalp`, which the coarse
302
+ // tier does not carry. So the torso is already gone while the shirt cannot yet exist:
303
+ // a floating head, forearms and shins. Measured, not reasoned — it is what the first
304
+ // build of this cover actually put on screen.
305
+ if (kit.full)
306
+ gate.settle('kit');
257
307
  onTierRef.current?.(kit.full);
258
308
  onFactsRef.current?.(kit.facts);
259
309
  }
@@ -262,28 +312,33 @@ export const CharacterCanvas = forwardRef(function CharacterCanvas({ source, spe
262
312
  }
263
313
  }).catch((e) => {
264
314
  reportError(`character kit failed to load: ${e instanceof Error ? e.message : String(e)}`);
315
+ // No kit means no character, ever. Reveal so the error overlay is the thing on screen
316
+ // rather than a loading label that will never resolve.
317
+ gate.abandon();
265
318
  });
266
319
  void loadCharParts(device, source, source.manifest)
267
320
  .then((parts) => {
268
321
  if (!live.dead)
269
322
  scene.setParts(parts);
270
323
  })
271
- .catch((e) => console.error('[character] face parts did not load', e));
324
+ .catch((e) => console.error('[character] face parts did not load', e))
325
+ .finally(() => gate.settle('parts'));
272
326
  void loadHairMeshes(device, source)
273
327
  .then((hair) => {
274
328
  if (hair && !live.dead)
275
329
  scene.setHair(hair);
276
330
  })
277
- .catch((e) => console.error('[character] hair did not load', e));
331
+ .catch((e) => console.error('[character] hair did not load', e))
332
+ .finally(() => gate.settle('hair'));
278
333
  void loadGarments(source)
279
334
  .then((kit) => {
280
335
  if (kit && !live.dead)
281
336
  scene.setGarments(kit, makeGarmentCache(device, source.baseUrl));
282
337
  })
283
- .catch((e) => console.error('[character] garments did not load', e));
338
+ .catch((e) => console.error('[character] garments did not load', e))
339
+ .finally(() => gate.settle('garments'));
284
340
  // ── THE FRAME LOOP ──────────────────────────────────────────────────────────────────
285
341
  let last = performance.now();
286
- let announced = false;
287
342
  const draw = (nowMs) => {
288
343
  if (live.dead)
289
344
  return;
@@ -327,12 +382,11 @@ export const CharacterCanvas = forwardRef(function CharacterCanvas({ source, spe
327
382
  const enc = device.createCommandEncoder();
328
383
  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
384
  device.queue.submit([enc.finish()]);
330
- // ⚠️ AFTER a frame actually drew, not after the kit decoded — "ready" means there is a
331
- // character on the canvas, and a decoded-but-never-drawn kit is not that.
332
- if (drew && !announced) {
333
- announced = true;
334
- onReadyRef.current?.();
335
- }
385
+ // ⚠️ AFTER a frame actually drew, not after the kit decoded — a decoded-but-never-drawn
386
+ // kit is not a character on screen. This is one of the gate's two conditions; the other
387
+ // is that all four loaders have settled, so a drawn body alone no longer reveals.
388
+ if (drew)
389
+ gate.frameDrew();
336
390
  };
337
391
  raf = requestAnimationFrame(draw);
338
392
  })().catch((e) => {
@@ -340,6 +394,7 @@ export const CharacterCanvas = forwardRef(function CharacterCanvas({ source, spe
340
394
  });
341
395
  return () => {
342
396
  live.dead = true;
397
+ clearTimeout(capTimer);
343
398
  cancelAnimationFrame(raf);
344
399
  const st = gpuRef.current;
345
400
  gpuRef.current = null;
@@ -412,10 +467,16 @@ export const CharacterCanvas = forwardRef(function CharacterCanvas({ source, spe
412
467
  setGaze: (g) => gpuRef.current?.scene.setGaze(g),
413
468
  canvas: () => canvasRef.current,
414
469
  }), []);
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: {
470
+ 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
471
  display: 'block',
417
472
  width: '100%',
418
473
  height: '100%',
474
+ // ⚠️ THE CANVAS ITSELF FADES — there is no cover element painted over it. An opaque
475
+ // panel would have to name a background colour, and no single colour is right: the
476
+ // creator's stage is a radial gradient while the canvas clears to a flat near-black.
477
+ // Fading the canvas lets the HOST's own backdrop be the cover, in every host.
478
+ opacity: assembled ? 1 : 0,
479
+ transition: 'opacity 300ms ease-out',
419
480
  // Drag-to-orbit owns every pointer gesture on the canvas — without `none` a
420
481
  // touch drag scrolls the page instead of turning the character.
421
482
  touchAction: 'none',
@@ -442,7 +503,21 @@ export const CharacterCanvas = forwardRef(function CharacterCanvas({ source, spe
442
503
  return;
443
504
  orbitDragRef.current = null;
444
505
  e.currentTarget.style.cursor = 'grab';
445
- } }), err && (_jsx("div", { role: "alert", style: {
506
+ } }), !assembled && !err && (_jsxs("div", { role: "status", "data-id": "character-loading", className: "ucv-loading", style: {
507
+ position: 'absolute',
508
+ inset: 0,
509
+ display: 'flex',
510
+ flexDirection: 'column',
511
+ alignItems: 'center',
512
+ justifyContent: 'center',
513
+ gap: 10,
514
+ // Never eat a pointer gesture: the canvas underneath owns drag-to-orbit, and the
515
+ // cover is decoration.
516
+ pointerEvents: 'none',
517
+ font: '13px/1.5 system-ui, sans-serif',
518
+ letterSpacing: '0.02em',
519
+ color: 'rgba(255,255,255,0.62)',
520
+ }, children: [_jsx("span", { className: "ucv-loading-dot", "aria-hidden": "true" }), "Building your character\u2026"] })), err && (_jsx("div", { role: "alert", style: {
446
521
  position: 'absolute',
447
522
  inset: 0,
448
523
  display: 'flex',
@@ -1 +1 @@
1
- {"version":3,"file":"CharacterCanvas.js","sourceRoot":"","sources":["../../../src/character/client/CharacterCanvas.tsx"],"names":[],"mappings":"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"}
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"}
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.1.973";
1
+ export declare const CLI_VERSION = "0.1.975";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.973";
2
+ export const CLI_VERSION = "0.1.975";
3
3
  //# sourceMappingURL=version.js.map
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.973",
4
+ "version": "0.1.975",
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
- /** Fires once, when the first frame with the character actually on it has been drawn. */
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,26 @@ 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 FULL TIER ONLY, AND THE COARSE ONE IS NOT CLOSE ENOUGH. This callback fires
441
+ // twice — coarse (LOD2+LOD3) then the full container — and revealing on the coarse one
442
+ // shows a character with a HOLE where its clothes go. `setKit` degenerates the body
443
+ // triangles under anything worn the moment the spec dresses it (`dressedRungs`), but
444
+ // `rebuildGarment` refuses to conform a garment without `kit.scalp`, which the coarse
445
+ // tier does not carry. So the torso is already gone while the shirt cannot yet exist:
446
+ // a floating head, forearms and shins. Measured, not reasoned — it is what the first
447
+ // build of this cover actually put on screen.
448
+ if (kit.full) gate.settle('kit');
394
449
  onTierRef.current?.(kit.full);
395
450
  onFactsRef.current?.(kit.facts);
396
451
  } catch (e) {
@@ -400,6 +455,9 @@ export const CharacterCanvas = forwardRef<
400
455
  reportError(
401
456
  `character kit failed to load: ${e instanceof Error ? e.message : String(e)}`,
402
457
  );
458
+ // No kit means no character, ever. Reveal so the error overlay is the thing on screen
459
+ // rather than a loading label that will never resolve.
460
+ gate.abandon();
403
461
  });
404
462
  void loadCharParts(device, source, source.manifest)
405
463
  .then((parts) => {
@@ -407,14 +465,16 @@ export const CharacterCanvas = forwardRef<
407
465
  })
408
466
  .catch((e: unknown) =>
409
467
  console.error('[character] face parts did not load', e),
410
- );
468
+ )
469
+ .finally(() => gate.settle('parts'));
411
470
  void loadHairMeshes(device, source)
412
471
  .then((hair) => {
413
472
  if (hair && !live.dead) scene.setHair(hair);
414
473
  })
415
474
  .catch((e: unknown) =>
416
475
  console.error('[character] hair did not load', e),
417
- );
476
+ )
477
+ .finally(() => gate.settle('hair'));
418
478
  void loadGarments(source)
419
479
  .then((kit) => {
420
480
  if (kit && !live.dead)
@@ -422,11 +482,11 @@ export const CharacterCanvas = forwardRef<
422
482
  })
423
483
  .catch((e: unknown) =>
424
484
  console.error('[character] garments did not load', e),
425
- );
485
+ )
486
+ .finally(() => gate.settle('garments'));
426
487
 
427
488
  // ── THE FRAME LOOP ──────────────────────────────────────────────────────────────────
428
489
  let last = performance.now();
429
- let announced = false;
430
490
  const draw = (nowMs: number): void => {
431
491
  if (live.dead) return;
432
492
  raf = requestAnimationFrame(draw);
@@ -486,12 +546,10 @@ export const CharacterCanvas = forwardRef<
486
546
  CLEAR,
487
547
  );
488
548
  device.queue.submit([enc.finish()]);
489
- // ⚠️ AFTER a frame actually drew, not after the kit decoded — "ready" means there is a
490
- // character on the canvas, and a decoded-but-never-drawn kit is not that.
491
- if (drew && !announced) {
492
- announced = true;
493
- onReadyRef.current?.();
494
- }
549
+ // ⚠️ AFTER a frame actually drew, not after the kit decoded — a decoded-but-never-drawn
550
+ // kit is not a character on screen. This is one of the gate's two conditions; the other
551
+ // is that all four loaders have settled, so a drawn body alone no longer reveals.
552
+ if (drew) gate.frameDrew();
495
553
  };
496
554
  raf = requestAnimationFrame(draw);
497
555
  })().catch((e: unknown) => {
@@ -499,6 +557,7 @@ export const CharacterCanvas = forwardRef<
499
557
  });
500
558
  return () => {
501
559
  live.dead = true;
560
+ clearTimeout(capTimer);
502
561
  cancelAnimationFrame(raf);
503
562
  const st = gpuRef.current;
504
563
  gpuRef.current = null;
@@ -601,6 +660,7 @@ export const CharacterCanvas = forwardRef<
601
660
  data-id="character-canvas"
602
661
  style={{ position: 'relative', width: '100%', height: '100%' }}
603
662
  >
663
+ <style>{COVER_CSS}</style>
604
664
  <canvas
605
665
  ref={canvasRef}
606
666
  aria-label="Character preview"
@@ -608,6 +668,12 @@ export const CharacterCanvas = forwardRef<
608
668
  display: 'block',
609
669
  width: '100%',
610
670
  height: '100%',
671
+ // ⚠️ THE CANVAS ITSELF FADES — there is no cover element painted over it. An opaque
672
+ // panel would have to name a background colour, and no single colour is right: the
673
+ // creator's stage is a radial gradient while the canvas clears to a flat near-black.
674
+ // Fading the canvas lets the HOST's own backdrop be the cover, in every host.
675
+ opacity: assembled ? 1 : 0,
676
+ transition: 'opacity 300ms ease-out',
611
677
  // Drag-to-orbit owns every pointer gesture on the canvas — without `none` a
612
678
  // touch drag scrolls the page instead of turning the character.
613
679
  touchAction: 'none',
@@ -637,6 +703,31 @@ export const CharacterCanvas = forwardRef<
637
703
  e.currentTarget.style.cursor = 'grab';
638
704
  }}
639
705
  />
706
+ {!assembled && !err && (
707
+ <div
708
+ role="status"
709
+ data-id="character-loading"
710
+ className="ucv-loading"
711
+ style={{
712
+ position: 'absolute',
713
+ inset: 0,
714
+ display: 'flex',
715
+ flexDirection: 'column',
716
+ alignItems: 'center',
717
+ justifyContent: 'center',
718
+ gap: 10,
719
+ // Never eat a pointer gesture: the canvas underneath owns drag-to-orbit, and the
720
+ // cover is decoration.
721
+ pointerEvents: 'none',
722
+ font: '13px/1.5 system-ui, sans-serif',
723
+ letterSpacing: '0.02em',
724
+ color: 'rgba(255,255,255,0.62)',
725
+ }}
726
+ >
727
+ <span className="ucv-loading-dot" aria-hidden="true" />
728
+ Building your character…
729
+ </div>
730
+ )}
640
731
  {err && (
641
732
  <div
642
733
  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
+ }
@@ -1,2 +1,2 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.973";
2
+ export const CLI_VERSION = "0.1.975";