@oxy.so/bloom 7.1.3 → 7.1.5
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/assets/character-runtime/README.md +19 -114
- package/assets/character-runtime/legacy-engine.mjs +54 -406
- package/assets/character-runtime/legacy-geometry.mjs +85 -242
- package/assets/character-runtime/legacy-worker.mjs +23 -82
- package/assets/character-runtime/managed-avatar.mjs +18 -12
- package/assets/character-runtime/render-budget.mjs +11 -6
- package/assets/character-runtime/runtime.mjs +295 -744
- package/docs/agent-avatar.mdx +8 -45
- package/docs/agent-creator.mdx +3 -13
- package/lib/commonjs/agent-avatar/AgentAvatar.js +1 -1
- package/lib/commonjs/agent-avatar/AgentAvatar.js.map +1 -1
- package/lib/commonjs/agent-avatar/CharacterAvatar.js +1 -2
- package/lib/commonjs/agent-avatar/CharacterAvatar.js.map +1 -1
- package/lib/commonjs/agent-avatar/config-character.js +0 -4
- package/lib/commonjs/agent-avatar/config-character.js.map +1 -1
- package/lib/commonjs/agent-avatar/legacy-recipe.js +6 -19
- package/lib/commonjs/agent-avatar/legacy-recipe.js.map +1 -1
- package/lib/commonjs/agent-creator/AgentCreatorBase.js +107 -67
- package/lib/commonjs/agent-creator/AgentCreatorBase.js.map +1 -1
- package/lib/commonjs/agent-creator/CharacterControls.js +5 -23
- package/lib/commonjs/agent-creator/CharacterControls.js.map +1 -1
- package/lib/commonjs/agent-creator/EmotionPicker.js +1 -8
- package/lib/commonjs/agent-creator/EmotionPicker.js.map +1 -1
- package/lib/commonjs/agent-creator/ShapeSilhouette.js +1 -8
- package/lib/commonjs/agent-creator/ShapeSilhouette.js.map +1 -1
- package/lib/commonjs/agent-creator/constants.js +17 -16
- package/lib/commonjs/agent-creator/constants.js.map +1 -1
- package/lib/commonjs/agent-creator/messages.js +1 -1
- package/lib/commonjs/agent-creator/messages.js.map +1 -1
- package/lib/commonjs/locale/translations/ar.js +1 -1
- package/lib/commonjs/locale/translations/ar.js.map +1 -1
- package/lib/commonjs/locale/translations/bn.js +1 -1
- package/lib/commonjs/locale/translations/bn.js.map +1 -1
- package/lib/commonjs/locale/translations/ca.js +1 -1
- package/lib/commonjs/locale/translations/ca.js.map +1 -1
- package/lib/commonjs/locale/translations/de.js +1 -1
- package/lib/commonjs/locale/translations/de.js.map +1 -1
- package/lib/commonjs/locale/translations/es.js +1 -1
- package/lib/commonjs/locale/translations/es.js.map +1 -1
- package/lib/commonjs/locale/translations/fr.js +1 -1
- package/lib/commonjs/locale/translations/fr.js.map +1 -1
- package/lib/commonjs/locale/translations/hi.js +1 -1
- package/lib/commonjs/locale/translations/hi.js.map +1 -1
- package/lib/commonjs/locale/translations/id.js +1 -1
- package/lib/commonjs/locale/translations/id.js.map +1 -1
- package/lib/commonjs/locale/translations/it.js +1 -1
- package/lib/commonjs/locale/translations/it.js.map +1 -1
- package/lib/commonjs/locale/translations/ja.js +1 -1
- package/lib/commonjs/locale/translations/ja.js.map +1 -1
- package/lib/commonjs/locale/translations/pt.js +1 -1
- package/lib/commonjs/locale/translations/pt.js.map +1 -1
- package/lib/commonjs/locale/translations/ru.js +1 -1
- package/lib/commonjs/locale/translations/ru.js.map +1 -1
- package/lib/commonjs/locale/translations/tr.js +1 -1
- package/lib/commonjs/locale/translations/tr.js.map +1 -1
- package/lib/commonjs/locale/translations/zh.js +1 -1
- package/lib/commonjs/locale/translations/zh.js.map +1 -1
- package/lib/module/agent-avatar/AgentAvatar.js +1 -1
- package/lib/module/agent-avatar/AgentAvatar.js.map +1 -1
- package/lib/module/agent-avatar/CharacterAvatar.js +1 -2
- package/lib/module/agent-avatar/CharacterAvatar.js.map +1 -1
- package/lib/module/agent-avatar/config-character.js +0 -4
- package/lib/module/agent-avatar/config-character.js.map +1 -1
- package/lib/module/agent-avatar/legacy-recipe.js +6 -19
- package/lib/module/agent-avatar/legacy-recipe.js.map +1 -1
- package/lib/module/agent-creator/AgentCreatorBase.js +109 -69
- package/lib/module/agent-creator/AgentCreatorBase.js.map +1 -1
- package/lib/module/agent-creator/CharacterControls.js +6 -24
- package/lib/module/agent-creator/CharacterControls.js.map +1 -1
- package/lib/module/agent-creator/EmotionPicker.js +1 -8
- package/lib/module/agent-creator/EmotionPicker.js.map +1 -1
- package/lib/module/agent-creator/ShapeSilhouette.js +1 -8
- package/lib/module/agent-creator/ShapeSilhouette.js.map +1 -1
- package/lib/module/agent-creator/constants.js +16 -8
- package/lib/module/agent-creator/constants.js.map +1 -1
- package/lib/module/agent-creator/messages.js +1 -1
- package/lib/module/agent-creator/messages.js.map +1 -1
- package/lib/module/locale/translations/ar.js +1 -1
- package/lib/module/locale/translations/ar.js.map +1 -1
- package/lib/module/locale/translations/bn.js +1 -1
- package/lib/module/locale/translations/bn.js.map +1 -1
- package/lib/module/locale/translations/ca.js +1 -1
- package/lib/module/locale/translations/ca.js.map +1 -1
- package/lib/module/locale/translations/de.js +1 -1
- package/lib/module/locale/translations/de.js.map +1 -1
- package/lib/module/locale/translations/es.js +1 -1
- package/lib/module/locale/translations/es.js.map +1 -1
- package/lib/module/locale/translations/fr.js +1 -1
- package/lib/module/locale/translations/fr.js.map +1 -1
- package/lib/module/locale/translations/hi.js +1 -1
- package/lib/module/locale/translations/hi.js.map +1 -1
- package/lib/module/locale/translations/id.js +1 -1
- package/lib/module/locale/translations/id.js.map +1 -1
- package/lib/module/locale/translations/it.js +1 -1
- package/lib/module/locale/translations/it.js.map +1 -1
- package/lib/module/locale/translations/ja.js +1 -1
- package/lib/module/locale/translations/ja.js.map +1 -1
- package/lib/module/locale/translations/pt.js +1 -1
- package/lib/module/locale/translations/pt.js.map +1 -1
- package/lib/module/locale/translations/ru.js +1 -1
- package/lib/module/locale/translations/ru.js.map +1 -1
- package/lib/module/locale/translations/tr.js +1 -1
- package/lib/module/locale/translations/tr.js.map +1 -1
- package/lib/module/locale/translations/zh.js +1 -1
- package/lib/module/locale/translations/zh.js.map +1 -1
- package/lib/typescript/commonjs/agent-avatar/CharacterAvatar.d.ts.map +1 -1
- package/lib/typescript/commonjs/agent-avatar/config-character.d.ts +0 -4
- package/lib/typescript/commonjs/agent-avatar/config-character.d.ts.map +1 -1
- package/lib/typescript/commonjs/agent-avatar/legacy-recipe.d.ts +10 -2
- package/lib/typescript/commonjs/agent-avatar/legacy-recipe.d.ts.map +1 -1
- package/lib/typescript/commonjs/agent-creator/AgentCreatorBase.d.ts.map +1 -1
- package/lib/typescript/commonjs/agent-creator/CharacterControls.d.ts +1 -2
- package/lib/typescript/commonjs/agent-creator/CharacterControls.d.ts.map +1 -1
- package/lib/typescript/commonjs/agent-creator/EmotionPicker.d.ts +0 -1
- package/lib/typescript/commonjs/agent-creator/EmotionPicker.d.ts.map +1 -1
- package/lib/typescript/commonjs/agent-creator/ShapeSilhouette.d.ts.map +1 -1
- package/lib/typescript/commonjs/agent-creator/constants.d.ts +15 -7
- package/lib/typescript/commonjs/agent-creator/constants.d.ts.map +1 -1
- package/lib/typescript/commonjs/agent-creator/messages.d.ts.map +1 -1
- package/lib/typescript/module/agent-avatar/CharacterAvatar.d.ts.map +1 -1
- package/lib/typescript/module/agent-avatar/config-character.d.ts +0 -4
- package/lib/typescript/module/agent-avatar/config-character.d.ts.map +1 -1
- package/lib/typescript/module/agent-avatar/legacy-recipe.d.ts +10 -2
- package/lib/typescript/module/agent-avatar/legacy-recipe.d.ts.map +1 -1
- package/lib/typescript/module/agent-creator/AgentCreatorBase.d.ts.map +1 -1
- package/lib/typescript/module/agent-creator/CharacterControls.d.ts +1 -2
- package/lib/typescript/module/agent-creator/CharacterControls.d.ts.map +1 -1
- package/lib/typescript/module/agent-creator/EmotionPicker.d.ts +0 -1
- package/lib/typescript/module/agent-creator/EmotionPicker.d.ts.map +1 -1
- package/lib/typescript/module/agent-creator/ShapeSilhouette.d.ts.map +1 -1
- package/lib/typescript/module/agent-creator/constants.d.ts +15 -7
- package/lib/typescript/module/agent-creator/constants.d.ts.map +1 -1
- package/lib/typescript/module/agent-creator/messages.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/agent-avatar/AgentAvatar.tsx +1 -1
- package/src/agent-avatar/CharacterAvatar.tsx +1 -4
- package/src/agent-avatar/config-character.ts +6 -39
- package/src/agent-avatar/legacy-recipe.ts +6 -34
- package/src/agent-creator/AgentCreatorBase.tsx +152 -121
- package/src/agent-creator/CharacterControls.tsx +14 -39
- package/src/agent-creator/EmotionPicker.tsx +16 -55
- package/src/agent-creator/ShapeSilhouette.tsx +1 -16
- package/src/agent-creator/constants.ts +14 -47
- package/src/agent-creator/messages.ts +1 -2
- package/src/locale/translations/ar.ts +1 -1
- package/src/locale/translations/bn.ts +1 -1
- package/src/locale/translations/ca.ts +1 -1
- package/src/locale/translations/de.ts +1 -1
- package/src/locale/translations/es.ts +1 -1
- package/src/locale/translations/fr.ts +1 -1
- package/src/locale/translations/hi.ts +1 -1
- package/src/locale/translations/id.ts +1 -1
- package/src/locale/translations/it.ts +1 -1
- package/src/locale/translations/ja.ts +1 -1
- package/src/locale/translations/pt.ts +1 -1
- package/src/locale/translations/ru.ts +1 -1
- package/src/locale/translations/tr.ts +1 -1
- package/src/locale/translations/zh.ts +1 -1
- package/assets/character-runtime/authored-parts.mjs +0 -754
- package/assets/character-runtime/catalog-parts.mjs +0 -362
- package/assets/character-runtime/character-recipe.mjs +0 -247
- package/assets/character-runtime/clippo-geometry.mjs +0 -679
- package/assets/character-runtime/controller-mode.mjs +0 -208
- package/assets/character-runtime/cyclops-geometry.mjs +0 -180
- package/assets/character-runtime/migrated-contours.mjs +0 -2067
- package/assets/character-runtime/migrated-faces.mjs +0 -59
- package/assets/character-runtime/pose-transition.mjs +0 -523
- package/assets/character-runtime/preparation-cache.mjs +0 -60
- package/assets/character-runtime/render-errors.mjs +0 -180
- package/assets/character-runtime/resolution.mjs +0 -10
- package/assets/character-runtime/sha256.mjs +0 -44
- package/assets/character-runtime/shared-programs.mjs +0 -534
- package/assets/character-runtime/shared-surface.mjs +0 -490
- package/assets/character-runtime/shared-textures.mjs +0 -420
- package/assets/character-runtime/thumbnails/eyes/todd.png +0 -0
- package/lib/commonjs/agent-avatar/character-colors.js +0 -19
- package/lib/commonjs/agent-avatar/character-colors.js.map +0 -1
- package/lib/commonjs/agent-avatar/character-shapes.js +0 -106
- package/lib/commonjs/agent-avatar/character-shapes.js.map +0 -1
- package/lib/commonjs/agent-creator/ClippoArtwork.js +0 -63
- package/lib/commonjs/agent-creator/ClippoArtwork.js.map +0 -1
- package/lib/commonjs/agent-creator/CyclopsArtwork.js +0 -45
- package/lib/commonjs/agent-creator/CyclopsArtwork.js.map +0 -1
- package/lib/commonjs/agent-creator/ToddArtwork.js +0 -29
- package/lib/commonjs/agent-creator/ToddArtwork.js.map +0 -1
- package/lib/module/agent-avatar/character-colors.js +0 -15
- package/lib/module/agent-avatar/character-colors.js.map +0 -1
- package/lib/module/agent-avatar/character-shapes.js +0 -97
- package/lib/module/agent-avatar/character-shapes.js.map +0 -1
- package/lib/module/agent-creator/ClippoArtwork.js +0 -59
- package/lib/module/agent-creator/ClippoArtwork.js.map +0 -1
- package/lib/module/agent-creator/CyclopsArtwork.js +0 -41
- package/lib/module/agent-creator/CyclopsArtwork.js.map +0 -1
- package/lib/module/agent-creator/ToddArtwork.js +0 -25
- package/lib/module/agent-creator/ToddArtwork.js.map +0 -1
- package/lib/typescript/commonjs/agent-avatar/character-colors.d.ts +0 -13
- package/lib/typescript/commonjs/agent-avatar/character-colors.d.ts.map +0 -1
- package/lib/typescript/commonjs/agent-avatar/character-shapes.d.ts +0 -19
- package/lib/typescript/commonjs/agent-avatar/character-shapes.d.ts.map +0 -1
- package/lib/typescript/commonjs/agent-creator/ClippoArtwork.d.ts +0 -6
- package/lib/typescript/commonjs/agent-creator/ClippoArtwork.d.ts.map +0 -1
- package/lib/typescript/commonjs/agent-creator/CyclopsArtwork.d.ts +0 -5
- package/lib/typescript/commonjs/agent-creator/CyclopsArtwork.d.ts.map +0 -1
- package/lib/typescript/commonjs/agent-creator/ToddArtwork.d.ts +0 -6
- package/lib/typescript/commonjs/agent-creator/ToddArtwork.d.ts.map +0 -1
- package/lib/typescript/module/agent-avatar/character-colors.d.ts +0 -13
- package/lib/typescript/module/agent-avatar/character-colors.d.ts.map +0 -1
- package/lib/typescript/module/agent-avatar/character-shapes.d.ts +0 -19
- package/lib/typescript/module/agent-avatar/character-shapes.d.ts.map +0 -1
- package/lib/typescript/module/agent-creator/ClippoArtwork.d.ts +0 -6
- package/lib/typescript/module/agent-creator/ClippoArtwork.d.ts.map +0 -1
- package/lib/typescript/module/agent-creator/CyclopsArtwork.d.ts +0 -5
- package/lib/typescript/module/agent-creator/CyclopsArtwork.d.ts.map +0 -1
- package/lib/typescript/module/agent-creator/ToddArtwork.d.ts +0 -6
- package/lib/typescript/module/agent-creator/ToddArtwork.d.ts.map +0 -1
- package/src/agent-avatar/character-colors.ts +0 -12
- package/src/agent-avatar/character-shapes.ts +0 -122
- package/src/agent-creator/ClippoArtwork.tsx +0 -49
- package/src/agent-creator/CyclopsArtwork.tsx +0 -27
- package/src/agent-creator/ToddArtwork.tsx +0 -24
package/docs/agent-avatar.mdx
CHANGED
|
@@ -26,70 +26,33 @@ Host the package's complete `assets/character-runtime/` directory. The provider
|
|
|
26
26
|
|
|
27
27
|
## Editing
|
|
28
28
|
|
|
29
|
-
The `character` recipe holds a `preset` and optional `selections` for shape, color, eyes, eyewear and accessory. Explicit selections override preset defaults. `none` removes eyewear or an accessory.
|
|
29
|
+
The `character` recipe holds a `preset` and optional `selections` for shape, color, eyes, eyewear and accessory. Explicit selections override preset defaults. `none` removes eyewear or an accessory. The editor reads the engine's actual selection and availability, including shape-dependent eye styles. Changing shape clears an explicit eye override so an unsupported pair is not restored.
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
The editor presents one shape catalog and one eye catalog through `ShapeArc` and `EmotionPicker`. The eye orbit offers the engine’s nine native styles for both original and migrated bodies, with unsupported combinations disabled. Migrated bodies default to the original oval eyes. Saved expression, eye-size, spacing and tilt fields no longer modify a migrated face; the engine owns its eye geometry and animation. The shared `GlossArt` palette and custom color picker edit either body source. Original presets keep their authored appearance until explicitly edited.
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
Each shape defines its own eye positions and size. Changing the eye style preserves that layout; changing shape adopts the new body's layout. Eye depth follows the actual body surface so shallow styles remain visible on bodies such as Todd. Eyewear fits the composed eyes, and a final rigid adjustment keeps crown accessories clear of eyes and frames. `selections.eyes: 'cyclops'` uses one large white eye with a teal iris, dark pupil and highlight at the shape's face center. There is no eye-placement control in AgentCreator. Historical `character.eyeSpacing` and `eyeGap` values remain readable but do not override the 3D layout. The **Universal Customization** and **Single Eye** stories exercise the shared editor and cross-body eye selections.
|
|
36
|
-
|
|
37
|
-
`selections.shape: 'todd'` selects Todd's original body independently of its eye style. Its selector silhouette is sampled from the original mesh; no avatar runs inside the shape wheel. Editing a named preset's face or accessories preserves its original body, while an explicit shape selection replaces that body and retains the selected parts.
|
|
38
|
-
|
|
39
|
-
`{ character: { preset: 'clippo' } }` selects Clippo’s grey open-wire body, large white eyes, dark pupils and asymmetric brows. `selections.shape: 'clippo'` and `selections.eyes: 'clippo'` are independent choices: other eyes can use the clip body, and other bodies can use Clippo’s face. Its tube is generated as a real hollow silhouette with rounded ends, without fur; it uses the same native character, lighting, interaction and work controller. Color, eyewear and headwear remain editable. The shape and eye wheels use static SVG thumbnails. Storybook’s **Clippo** story provides React/Work controls and cross-body examples.
|
|
40
|
-
|
|
41
|
-
Alien avatars have been removed from the available catalog. Saved aliens, mascots and hidden-face recipes retain compatibility rendering. The shape selector shows static silhouettes without eyes or accessories: original catalog PNGs and cached SVG contours for migrated bodies. Paper grain and material effects become the engine’s 3D surface. Migrated bodies accept the original eyewear and accessory catalog. Headwear, Bulb, bow and Tuft use rigid contour anchors; eyewear fits the final eye geometry and headphones use body anchors. Original meshes, materials and fur remain intact.
|
|
33
|
+
Alien avatars have been removed from the available catalog. Saved aliens, mascots and hidden-face recipes retain compatibility rendering. The shape selector shows static silhouettes without eyes or accessories: original catalog PNGs and cached SVG contours for migrated bodies. Paper grain and material effects become the engine’s 3D surface. Migrated bodies accept the original eyewear and accessory catalog. Headwear, Bulb, bow and Tuft use rigid contour anchors; eyewear and headphones retain their original placement. Original meshes, materials and fur remain intact.
|
|
42
34
|
|
|
43
35
|
## Interaction and lifecycle
|
|
44
36
|
|
|
45
|
-
`interactive` enables the original engine's pointer tracking and touch/drag interaction. Change `reactionKey` from an accessible button to
|
|
37
|
+
`interactive` enables the original engine's pointer tracking and touch/drag interaction. Change `reactionKey` from an accessible button to replay its authored signature reaction for an intact preset, or the original 3D wave for customized and migrated bodies. Shape changes retain the last painted frame while the new geometry prepares. Changing `workingKey` starts a working episode and then returns to the interactive mode; `workingCycles` controls its duration. The creator’s **React** and **Work** buttons preview these original animations for both original and migrated bodies.
|
|
46
38
|
|
|
47
39
|
`paused`, reduced motion and `motion: 0` stop animation after a complete appearance frame. `portrait` prepares a static thumbnail. The beta can report readiness while drawing transparency if initialized with its reduced-motion flag; the adapter waits for painted pixels and then freezes its clock instead.
|
|
48
40
|
|
|
49
|
-
Web
|
|
50
|
-
|
|
51
|
-
Shaders and linked programs are shared by exact source and attribute bindings. Logical program handles retain independent uniforms and Emscripten metadata; switching skips values already present on the physical program. Small avatars (up to 128 CSS pixels) use the original compact mesh. The drawing resolution uses DPR at most 1 up to 64 CSS pixels, 1.5 up to 128, and 2 above that, with a 64-pixel floor and 512-pixel ceiling. The original engine derives its fur draw count from that drawing size, so reducing prepared fur arrays would not reduce its draw calls. Original fur and materials remain in use. The two 512-pixel mipmapped RGBA8 images and the 576×960 RGBA8 atlas share storage only when bytes and parameters match exactly; mutation or framebuffer attachment creates an independent copy. Private render targets, mutable geometry buffers and other textures remain per-character.
|
|
52
|
-
|
|
53
|
-
The scheduler submits at most eight avatars per batch within an 8 ms CPU allowance, then waits asynchronously on a WebGL fence before checking driver errors and copying images. This releases the JavaScript thread while the GPU finishes; it does not make that GPU work free. Native setup/probing and Emscripten’s own `GL.lastError` checks retain their behavior. A graphics error discards every pending image in that batch and reports failure to its touched characters. Appearance edits, resize and disposal wait for the batch to finish. Pointer capture happens synchronously on pointer-down; native input is queued in order. A single native render remains non-interruptible. Diagnostics separate `renderMilliseconds` (submission plus presentation CPU time) from `renderWaitMilliseconds` (elapsed wait and task dispatch, not a GPU timer).
|
|
54
|
-
|
|
55
|
-
Original and migrated bodies share one rendering WASM module and one preparation worker (the worker owns its own WASM instance). Prepared geometry identities include the contour and attachment transform. Cold preparation is admitted serially, while already painted moving avatars remain resident. Its owner receives a render turn every batch until its first complete paint, preventing the resident crowd from delaying the next preparation. The most recent interaction receives priority on alternate batches; the remaining turns use round-robin scheduling. Exact contour preparations are cached with an 8 MiB/16-entry LRU bound, keyed by appearance bytes, quality, activity mode, contour and authored parts. Cache hits receive independent buffer copies; native delivery still waits for the GPU boundary. Offscreen/background characters release their lease and retain their last complete 2D image. Static portraits use a bounded 64-image cache and release rendering resources after painting. Storybook’s **Many Avatars** story exercises 48 original/migrated avatars with React/Work controls and scrolling. **Shared Parts** shows Todd’s eyes and Felipe’s beret on all 21 shapes, with default-part, pause and animation controls.
|
|
56
|
-
|
|
57
|
-
### Physical-device measurements
|
|
58
|
-
|
|
59
|
-
The [current controller/transition benchmark](./benchmarks/avatar-continuous-renderer.json) uses a Pixel 8a (Mali-G715, Android 16, Android WebView 148), with all avatars visible at 48 CSS pixels and 64 backing pixels. Original presets and migrated contours alternate. After every avatar is ready, a three-second warmup precedes a roughly five-second sample. Output pixel hashes confirm that every avatar moves; page RAF cadence is measured separately from each avatar's paint rate. The artifact records the exact tested asset hashes; it predates the authored Todd/Felipe part compositor.
|
|
60
|
-
|
|
61
|
-
| Visible avatars | Median paints per avatar per second | Page RAF interval, p95 | Time until all are ready | WebGL contexts |
|
|
62
|
-
| --- | --- | --- | --- | --- |
|
|
63
|
-
| 24 | 4.42 | 25.1 ms | 14.85 s | 1 |
|
|
64
|
-
| 48 | 2.29 | 25.1 ms | 24.80 s | 1 |
|
|
65
|
-
|
|
66
|
-
These results remove context loss, but **do not deliver fluid 30 fps animation**. The [previous baseline](./benchmarks/avatar-shared-renderer.json) took 24.6/74.1 seconds until all avatars were ready, with mean paint rates of 3.76/2.59 Hz. Startup improves substantially; drawing throughput does not improve uniformly. An [intermediate snapshot](./benchmarks/avatar-deferred-renderer.json) isolates deferred GPU waiting before eager activity preparation. These are individual runs, not controlled repeated trials or sustained thermal measurements. Readiness uses a new document/engine and warm HTTP caches. Pixel-hash sampling adds readback overhead.
|
|
41
|
+
Web shares the beta engine and one animation clock per document, with a shared budget of **four live renderers** across original and migrated avatars. Additional avatars retain real 3D pixels from their last completed frame while their GPU renderer is released. Pointer interaction and React/Work commands prioritize reclaiming a renderer; overflow images remain visible while that renderer prepares. A newly visible avatar without a cached frame waits for its first rendering slot; preparation is one avatar at a time, and an `interactive` avatar (the editor's live preview, whose capabilities enable the editor's eye and colour controls) is admitted before passive thumbnails mounted ahead of it. This bounds graphics resources; the recovered engine’s synchronous first preparation can still cause a long task, especially for uncached migrated contours. Leaving the viewport or hiding the document releases the renderer lease, and returning avatars can display their retained image before resuming animation.
|
|
67
42
|
|
|
68
|
-
|
|
43
|
+
Different migrated contours isolate their rendering modules because the recovered engine caches geometry by its original appearance key; they share one preparation worker. Unused contour modules are released. Use `portrait` for galleries and selectors. Static preparation is serialized and the image cache is bounded to 64 entries; unmount releases listeners and rendering resources. Storybook’s **Many Avatars** story exercises 48 original/migrated avatars with per-avatar React/Work controls and document scrolling.
|
|
69
44
|
|
|
70
45
|
In the repository, run the scheduler tests and the browser budget check (with Storybook running):
|
|
71
46
|
|
|
72
47
|
```bash
|
|
73
|
-
node --test scripts/test-avatar-render-budget.mjs
|
|
74
|
-
node scripts/verify-avatar-shared-surface.mjs
|
|
75
|
-
node scripts/verify-avatar-shared-programs.mjs
|
|
76
|
-
node scripts/verify-avatar-shared-textures.mjs
|
|
77
|
-
node scripts/verify-avatar-runtime-errors.mjs
|
|
78
|
-
node scripts/verify-avatar-preparation-scope.mjs
|
|
48
|
+
node --test scripts/test-avatar-render-budget.mjs
|
|
79
49
|
node scripts/verify-avatar-render-budget.mjs
|
|
80
|
-
node scripts/verify-avatar-shared-renderer.mjs
|
|
81
|
-
node scripts/verify-avatar-deferred-input.mjs
|
|
82
|
-
node scripts/verify-avatar-controller-continuity.mjs
|
|
83
|
-
node scripts/verify-avatar-pose-transition.mjs
|
|
84
|
-
node scripts/verify-avatar-authored-parts.mjs
|
|
85
|
-
node scripts/verify-avatar-clippo.mjs
|
|
86
|
-
node scripts/verify-avatar-editor.mjs
|
|
87
50
|
```
|
|
88
51
|
|
|
89
52
|
`className` and `style` apply to the outer layout node through Bloom's NativeWind wrapper. `label` defaults to the translated “Agent avatar”; `locale` overrides the scope and `accessibilityLabel` overrides the name. Prefer a meaningful name when the avatar identifies an agent.
|
|
90
53
|
|
|
91
54
|
## Native and fallback
|
|
92
55
|
|
|
93
|
-
The optional native bridge uses `react-native-webview` and requires an absolute runtime URL reachable by the device.
|
|
56
|
+
The optional native bridge uses `react-native-webview` and requires an absolute runtime URL reachable by the device. Web is verified in Chrome; physical-device validation remains pending. Each native WebView owns a separate document, so the four-renderer web budget is **not an application-wide native limit**. Separate WebViews cannot share engine memory, graphics contexts or the web document’s viewport reclamation.
|
|
94
57
|
|
|
95
58
|
An unavailable runtime or missing native peer displays the translated unavailable state. Consumers without a runtime provider retain the universal SVG renderer for procedural recipes. That renderer preserves the original contours, folds, expression springs and deterministic grain; it does not support the beta's new 3D parts.
|
package/docs/agent-creator.mdx
CHANGED
|
@@ -25,17 +25,9 @@ Mount under `BloomProvider` and give the editor a bounded height. Layout classes
|
|
|
25
25
|
|
|
26
26
|
## Appearance
|
|
27
27
|
|
|
28
|
-
The preview is 162px. With `AgentAvatarProvider`, one shape arc combines the eleven original engine shapes
|
|
28
|
+
The preview is 162px. With `AgentAvatarProvider`, one shape arc combines the eleven original engine shapes with eight distinct migrated bodies: pebble, squircle, slender, pocket, petal, star, cloud and shield. Equivalent circle, triangle, flower, diamond and heart recipes reuse the original geometry. Alien avatars have been removed from the available catalog and examples; saved alien recipes remain readable for compatibility.
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
The eye orbit offers nine original 3D eye styles plus Todd, Clippo and Single eye for both body sources. Changing shape preserves the selected eyes, eyewear and accessory. Named presets provide their original defaults; choosing another eye style retains the preset's body. Historical recipes without an explicit eye selection default to oval eyes. Historical expression, eye-size, `eyeGap` and tilt settings remain readable; the engine owns the 3D face geometry and animation.
|
|
33
|
-
|
|
34
|
-
Known eye, color, eyewear and accessory choices stay available while a new appearance prepares. A pending capability response does not disable the controls or replace the current recipe with provisional defaults. Shape-comparison stories use one shared appearance across all bodies, including the same color, rather than giving old contours a separate flesh-colored default.
|
|
35
|
-
|
|
36
|
-
**Eye placement belongs to the shape.** Each body defines eye positions and size; every interchangeable eye style uses that layout. Changing shape automatically adopts its face layout without introducing another editor control. Historical `character.eyeSpacing` values remain readable for saved-recipe compatibility and are ignored by the renderer. Storybook's **Universal Customization** story starts with Todd and shows the saved recipe beside the existing editor.
|
|
37
|
-
|
|
38
|
-
**Single eye** (`selections.eyes: 'cyclops'`) selects a large white eye with a teal iris, dark pupil and highlight on any body. Its orbit thumbnail is static SVG artwork. It uses the selected shape’s face center and size. Storybook's **Single Eye** story shows it on the original and migrated shapes.
|
|
30
|
+
The eye orbit offers nine original 3D eye styles for both body sources. Migrated bodies default to oval eyes; historical expression, eye-size, spacing and tilt settings no longer alter their faces. The engine owns eye geometry and animation, and its capabilities disable unsupported combinations. Changing shape clears an incompatible eye override. Original presets keep their authored eyes until explicitly edited.
|
|
39
31
|
|
|
40
32
|
Upright eye chips orbit at a 116px radius; dragging or a mouse wheel rotates the orbit. Hover, focus, backgrounding and reduced motion pause automatic movement. The shape selector uses a 210px circular track, an unbounded index, spring, drag and wheel geometry. Choose a silhouette by pressing it; keyboard arrows, Home and End select shapes on web. BloomProvider’s direction reverses horizontal movement in RTL.
|
|
41
33
|
|
|
@@ -43,9 +35,7 @@ Nine glossy color presets and the shared custom picker edit both original and mi
|
|
|
43
35
|
|
|
44
36
|
The preview accepts pointer and touch reactions. **React** and **Work** buttons also support keyboard activation and preview the original engine’s animations on either body source. Working returns to the interactive preview after its episode. Eye chips and original shape chips use catalog PNG thumbnails. Migrated shape chips use cached static SVG silhouettes from their actual contours, matching the catalog’s flat pink artwork. The shape wheel renders no avatars or 3D canvases.
|
|
45
37
|
|
|
46
|
-
The
|
|
47
|
-
|
|
48
|
-
The preset selector provides authored characters; eyewear and accessories use Bloom Select on both original and migrated bodies. Explicit selections survive switching between these bodies. Headwear, Bulb, bow and Tuft attach to migrated contour anchors; eyewear fits the final eye geometry and headphones use body anchors. Reactions follow the body's original native signature after customization; catalog shapes with an authored counterpart use its profile, while unmatched shapes, Clippo and distinct migrated contours use Todd's signature as the shared standard. Work keeps the chosen body and fitted parts. Catalog titles retain their original English names by default. Hosts can translate them through `labels.characterOption(category, id, title)`; control labels follow the editor locale. Consumers without a runtime provider retain compatibility rendering and controls for saved procedural recipes.
|
|
38
|
+
The preset selector provides authored characters; eyewear and accessories use Bloom Select on both original and migrated bodies. Explicit selections survive switching between these bodies. Headwear, Bulb, bow and Tuft attach to migrated contour anchors; eyewear and headphones keep their original placement. Intact presets retain their authored signature reaction; edited and migrated bodies use the original 3D wave. Catalog titles retain their original English names by default. Hosts can translate them through `labels.characterOption(category, id, title)`; control labels follow the editor locale. Consumers without a runtime provider retain compatibility rendering and controls for saved procedural recipes.
|
|
49
39
|
|
|
50
40
|
## Preferences and speech
|
|
51
41
|
|
|
@@ -19,7 +19,7 @@ const AgentAvatar = exports.AgentAvatar = /*#__PURE__*/(0, _react.memo)(function
|
|
|
19
19
|
const legacy = runtimeUrl && !(0, _legacyRecipe.legacyRecipeUnsupported)(props.config);
|
|
20
20
|
return beta || legacy ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_CharacterAvatar.CharacterAvatar, {
|
|
21
21
|
...props
|
|
22
|
-
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_ProceduralAvatar.ProceduralAvatar, {
|
|
22
|
+
}, beta ? 'character' : 'legacy') : /*#__PURE__*/(0, _jsxRuntime.jsx)(_ProceduralAvatar.ProceduralAvatar, {
|
|
23
23
|
...props
|
|
24
24
|
});
|
|
25
25
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_CharacterAvatar","_ProceduralAvatar","_context","_legacyRecipe","_jsxRuntime","AgentAvatar","exports","memo","props","runtimeUrl","useContext","CharacterRuntimeContext","beta","config","character","preset","legacy","legacyRecipeUnsupported","jsx","CharacterAvatar","ProceduralAvatar"],"sourceRoot":"../../../src","sources":["agent-avatar/AgentAvatar.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAD,OAAA;AACA,IAAAE,iBAAA,GAAAF,OAAA;AACA,IAAAG,QAAA,GAAAH,OAAA;AACA,IAAAI,aAAA,GAAAJ,OAAA;AAA0D,IAAAK,WAAA,GAAAL,OAAA;AAG1D;AACO,MAAMM,WAAW,GAAAC,OAAA,CAAAD,WAAA,gBAAG,IAAAE,WAAI,EAAC,SAASF,WAAWA,CAACG,KAAuB,EAAE;EAC5E,MAAM;IAAEC;EAAW,CAAC,GAAG,IAAAC,iBAAU,EAACC,gCAAuB,CAAC;EAC1D,MAAMC,IAAI,GACRJ,KAAK,CAACK,MAAM,CAACC,SAAS,IAAIN,KAAK,CAACK,MAAM,CAACC,SAAS,CAACC,MAAM,KAAK,OAAO;EACrE,MAAMC,MAAM,GAAGP,UAAU,IAAI,CAAC,IAAAQ,qCAAuB,EAACT,KAAK,CAACK,MAAM,CAAC;EACnE,OAAOD,IAAI,IAAII,MAAM,gBACnB,IAAAZ,WAAA,CAAAc,GAAA,EAAClB,gBAAA,CAAAmB,eAAe;IAAA,
|
|
1
|
+
{"version":3,"names":["_react","require","_CharacterAvatar","_ProceduralAvatar","_context","_legacyRecipe","_jsxRuntime","AgentAvatar","exports","memo","props","runtimeUrl","useContext","CharacterRuntimeContext","beta","config","character","preset","legacy","legacyRecipeUnsupported","jsx","CharacterAvatar","ProceduralAvatar"],"sourceRoot":"../../../src","sources":["agent-avatar/AgentAvatar.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAD,OAAA;AACA,IAAAE,iBAAA,GAAAF,OAAA;AACA,IAAAG,QAAA,GAAAH,OAAA;AACA,IAAAI,aAAA,GAAAJ,OAAA;AAA0D,IAAAK,WAAA,GAAAL,OAAA;AAG1D;AACO,MAAMM,WAAW,GAAAC,OAAA,CAAAD,WAAA,gBAAG,IAAAE,WAAI,EAAC,SAASF,WAAWA,CAACG,KAAuB,EAAE;EAC5E,MAAM;IAAEC;EAAW,CAAC,GAAG,IAAAC,iBAAU,EAACC,gCAAuB,CAAC;EAC1D,MAAMC,IAAI,GACRJ,KAAK,CAACK,MAAM,CAACC,SAAS,IAAIN,KAAK,CAACK,MAAM,CAACC,SAAS,CAACC,MAAM,KAAK,OAAO;EACrE,MAAMC,MAAM,GAAGP,UAAU,IAAI,CAAC,IAAAQ,qCAAuB,EAACT,KAAK,CAACK,MAAM,CAAC;EACnE,OAAOD,IAAI,IAAII,MAAM,gBACnB,IAAAZ,WAAA,CAAAc,GAAA,EAAClB,gBAAA,CAAAmB,eAAe;IAAA,GAAyCX;EAAK,GAAxCI,IAAI,GAAG,WAAW,GAAG,QAAsB,CAAC,gBAElE,IAAAR,WAAA,CAAAc,GAAA,EAACjB,iBAAA,CAAAmB,gBAAgB;IAAA,GAAKZ;EAAK,CAAG,CAC/B;AACH,CAAC,CAAC","ignoreList":[]}
|
|
@@ -15,7 +15,6 @@ var _characterHtml = require("./character-html.js");
|
|
|
15
15
|
var _characterRuntimeModule = require("./character-runtime-module.js");
|
|
16
16
|
var _characterWebview = require("./character-webview.js");
|
|
17
17
|
var _legacyRecipe = require("./legacy-recipe.js");
|
|
18
|
-
var _characterShapes = require("./character-shapes.js");
|
|
19
18
|
var _messages2 = require("./messages.js");
|
|
20
19
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
21
20
|
function WebCharacter({
|
|
@@ -172,7 +171,7 @@ function CharacterAvatar(props) {
|
|
|
172
171
|
};
|
|
173
172
|
}, []);
|
|
174
173
|
(0, _react.useEffect)(() => setFailed(false), [runtimeUrl, config.character]);
|
|
175
|
-
const legacy = (0, _react.useMemo)(() => !config.character || config.character.preset === 'bloom'
|
|
174
|
+
const legacy = (0, _react.useMemo)(() => !config.character || config.character.preset === 'bloom' ? (0, _legacyRecipe.legacyRecipe)(config) : undefined, [config]);
|
|
176
175
|
const value = (0, _react.useMemo)(() => ({
|
|
177
176
|
config,
|
|
178
177
|
legacy,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_reactNative","_reactNativeReanimated","_messages","_styledPrimitives","_index","_context","_characterHtml","_characterRuntimeModule","_characterWebview","_legacyRecipe","
|
|
1
|
+
{"version":3,"names":["_react","require","_reactNative","_reactNativeReanimated","_messages","_styledPrimitives","_index","_context","_characterHtml","_characterRuntimeModule","_characterWebview","_legacyRecipe","_messages2","_jsxRuntime","WebCharacter","runtimeUrl","value","onError","reportCapabilities","useContext","CharacterRuntimeContext","report","useRef","current","host","controller","latest","fail","useEffect","element","document","stopped","started","canvas","createElement","setAttribute","Object","assign","style","width","height","display","touchAction","appendChild","start","module","loadCharacterRuntime","instance","createAvatar","onCapabilities","info","dispose","update","observer","IntersectionObserver","entries","some","entry","isIntersecting","observe","disconnect","remove","jsx","StyledView","ref","flex","NativeCharacter","WebView","characterWebView","initial","source","useMemo","html","characterHtml","baseUrl","send","injectJavaScript","scriptJson","backgroundColor","scrollEnabled","javaScriptEnabled","originWhitelist","onMessage","event","nativeEvent","data","startsWith","JSON","parse","slice","CharacterAvatar","props","messages","useMessages","AGENT_AVATAR_MESSAGES","locale","initialReduced","useReducedMotion","reduced","setReduced","useState","active","setActive","AppState","currentState","failed","setFailed","config","paused","portrait","workingKey","reactionKey","entranceKey","workingCycles","interactive","size","motion","AccessibilityInfo","addEventListener","state","next","media","Platform","OS","window","matchMedia","undefined","change","matches","removeEventListener","character","legacy","preset","legacyRecipe","Renderer","className","accessible","accessibilityRole","accessibilityLabel","label","testID","children","Text","numberOfLines","fontSize","unavailable"],"sourceRoot":"../../../src","sources":["agent-avatar/CharacterAvatar.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -17,10 +17,6 @@ function parseCharacterConfig(value) {
|
|
|
17
17
|
const result = {
|
|
18
18
|
preset: candidate.preset
|
|
19
19
|
};
|
|
20
|
-
if (candidate.eyeSpacing !== undefined) {
|
|
21
|
-
if (typeof candidate.eyeSpacing !== 'number' || !Number.isFinite(candidate.eyeSpacing) || candidate.eyeSpacing < 0.5 || candidate.eyeSpacing > 1.5) throw new Error('Invalid character eye spacing.');
|
|
22
|
-
result.eyeSpacing = candidate.eyeSpacing;
|
|
23
|
-
}
|
|
24
20
|
if (candidate.bodyColor !== undefined) {
|
|
25
21
|
if (typeof candidate.bodyColor !== 'string' || candidate.bodyColor.length !== 7 || !/^#[0-9a-f]{6}$/i.test(candidate.bodyColor)) throw new Error('Invalid character body color.');
|
|
26
22
|
result.bodyColor = candidate.bodyColor.toLowerCase();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["categories","validId","value","length","parseCharacterConfig","Array","isArray","Error","candidate","preset","result","
|
|
1
|
+
{"version":3,"names":["categories","validId","value","length","parseCharacterConfig","Array","isArray","Error","candidate","preset","result","bodyColor","undefined","test","toLowerCase","selections","category","id","Object","entries","includes"],"sourceRoot":"../../../src","sources":["agent-avatar/config-character.ts"],"mappings":";;;;;;AAAA;;AAUA,MAAMA,UAA8C,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC;AACzG,MAAMC,OAAO,GAAIC,KAAc,IAC7B,OAAOA,KAAK,KAAK,QAAQ,IAAIA,KAAK,CAACC,MAAM,GAAG,CAAC,IAAID,KAAK,CAACC,MAAM,IAAI,EAAE;;AAErE;AACO,SAASC,oBAAoBA,CAACF,KAAc,EAAyB;EAC1E,IAAI,CAACA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAIG,KAAK,CAACC,OAAO,CAACJ,KAAK,CAAC,EAC7D,MAAM,IAAIK,KAAK,CAAC,kCAAkC,CAAC;EACrD,MAAMC,SAAS,GAAGN,KAAgC;EAClD,IAAI,CAACD,OAAO,CAACO,SAAS,CAACC,MAAM,CAAC,EAAE,MAAM,IAAIF,KAAK,CAAC,2BAA2B,CAAC;EAC5E,MAAMG,MAA6B,GAAG;IAAED,MAAM,EAAED,SAAS,CAACC;EAAO,CAAC;EAClE,IAAID,SAAS,CAACG,SAAS,KAAKC,SAAS,EAAE;IACrC,IAAI,OAAOJ,SAAS,CAACG,SAAS,KAAK,QAAQ,IAAIH,SAAS,CAACG,SAAS,CAACR,MAAM,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAACU,IAAI,CAACL,SAAS,CAACG,SAAS,CAAC,EAC7H,MAAM,IAAIJ,KAAK,CAAC,+BAA+B,CAAC;IAClDG,MAAM,CAACC,SAAS,GAAGH,SAAS,CAACG,SAAS,CAACG,WAAW,CAAC,CAAC;EACtD;EACA,IAAIN,SAAS,CAACO,UAAU,KAAKH,SAAS,EAAE;IACtC,IAAI,CAACJ,SAAS,CAACO,UAAU,IAAI,OAAOP,SAAS,CAACO,UAAU,KAAK,QAAQ,IAAIV,KAAK,CAACC,OAAO,CAACE,SAAS,CAACO,UAAU,CAAC,EAC1G,MAAM,IAAIR,KAAK,CAAC,+BAA+B,CAAC;IAClD,MAAMQ,UAA4D,GAAG,CAAC,CAAC;IACvE,KAAK,MAAM,CAACC,QAAQ,EAAEC,EAAE,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACX,SAAS,CAACO,UAAU,CAAC,EAAE;MACjE,IAAI,CAACf,UAAU,CAACoB,QAAQ,CAACJ,QAAmC,CAAC,IAAI,CAACf,OAAO,CAACgB,EAAE,CAAC,EAC3E,MAAM,IAAIV,KAAK,CAAC,8BAA8B,CAAC;MACjDQ,UAAU,CAACC,QAAQ,CAA4B,GAAGC,EAAE;IACtD;IACAP,MAAM,CAACK,UAAU,GAAGA,UAAU;EAChC;EACA,IAAI,OAAO,IAAIP,SAAS,EAAE,MAAM,IAAID,KAAK,CAAC,0CAA0C,CAAC;EACrF,OAAOG,MAAM;AACf","ignoreList":[]}
|
|
@@ -8,13 +8,10 @@ exports.legacyNativeShape = legacyNativeShape;
|
|
|
8
8
|
exports.legacyRecipe = legacyRecipe;
|
|
9
9
|
exports.legacyRecipeUnsupported = legacyRecipeUnsupported;
|
|
10
10
|
exports.radialContour = radialContour;
|
|
11
|
-
var _characterColors = require("./character-colors.js");
|
|
12
|
-
var _characterShapes = require("./character-shapes.js");
|
|
13
11
|
var _avatarColor = require("./avatar-color.js");
|
|
14
12
|
var _legacyContours = require("./legacy-contours.js");
|
|
15
13
|
/** Saved unsupported artwork stays readable without pretending it was migrated. */
|
|
16
14
|
function legacyRecipeUnsupported(config) {
|
|
17
|
-
if ((0, _characterShapes.isMigratedCharacterShape)(config.character?.selections?.shape)) return false;
|
|
18
15
|
return config.family === 'alien' || config.family === 'mascot' || !config.face;
|
|
19
16
|
}
|
|
20
17
|
|
|
@@ -61,7 +58,6 @@ function radialContour(polygons, samples = 256) {
|
|
|
61
58
|
|
|
62
59
|
/** Shared capability identity for the editor and the legacy engine adapter. */
|
|
63
60
|
function legacyCharacterRecipe(config) {
|
|
64
|
-
if (config.character && config.character.preset !== 'bloom') return config.character;
|
|
65
61
|
const customization = config.character?.preset === 'bloom' ? config.character : undefined;
|
|
66
62
|
return {
|
|
67
63
|
preset: 'legacy',
|
|
@@ -75,10 +71,7 @@ function legacyCharacterRecipe(config) {
|
|
|
75
71
|
accessory: customization.selections.accessory
|
|
76
72
|
} : {})
|
|
77
73
|
},
|
|
78
|
-
bodyColor: customization?.bodyColor ??
|
|
79
|
-
...(customization?.eyeSpacing !== undefined ? {
|
|
80
|
-
eyeSpacing: customization.eyeSpacing
|
|
81
|
-
} : {})
|
|
74
|
+
bodyColor: customization?.bodyColor ?? (0, _avatarColor.avatarHex)(config)
|
|
82
75
|
};
|
|
83
76
|
}
|
|
84
77
|
|
|
@@ -88,25 +81,19 @@ function legacyCharacterRecipe(config) {
|
|
|
88
81
|
*/
|
|
89
82
|
function legacyRecipe(config, samples = 256) {
|
|
90
83
|
if (legacyRecipeUnsupported(config)) throw new Error('Unsupported legacy 3D recipe');
|
|
91
|
-
const
|
|
92
|
-
const canonical = config.character && config.character.preset !== 'bloom';
|
|
93
|
-
const selectedShape = canonical ? config.character?.selections?.shape : undefined;
|
|
94
|
-
const shape = (0, _characterShapes.isMigratedCharacterShape)(selectedShape) ? undefined : selectedShape ?? legacyNativeShape(geometry);
|
|
84
|
+
const shape = legacyNativeShape(config);
|
|
95
85
|
const recipe = legacyCharacterRecipe(config);
|
|
96
86
|
const {
|
|
97
87
|
eyewear,
|
|
98
88
|
accessory
|
|
99
|
-
} = recipe.selections
|
|
89
|
+
} = recipe.selections;
|
|
100
90
|
return {
|
|
101
91
|
...(shape ? {
|
|
102
92
|
shape
|
|
103
93
|
} : {
|
|
104
|
-
points: radialContour((0, _legacyContours.legacyContours)(
|
|
94
|
+
points: radialContour((0, _legacyContours.legacyContours)(config), samples)
|
|
105
95
|
}),
|
|
106
|
-
eyes: recipe.selections
|
|
107
|
-
...(recipe.eyeSpacing !== undefined ? {
|
|
108
|
-
eyeSpacing: recipe.eyeSpacing
|
|
109
|
-
} : {}),
|
|
96
|
+
eyes: recipe.selections.eyes,
|
|
110
97
|
...(eyewear || accessory ? {
|
|
111
98
|
selections: {
|
|
112
99
|
...(eyewear ? {
|
|
@@ -118,7 +105,7 @@ function legacyRecipe(config, samples = 256) {
|
|
|
118
105
|
}
|
|
119
106
|
} : {}),
|
|
120
107
|
patch: {
|
|
121
|
-
bodyColor: recipe.bodyColor
|
|
108
|
+
bodyColor: recipe.bodyColor
|
|
122
109
|
}
|
|
123
110
|
};
|
|
124
111
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["_avatarColor","require","_legacyContours","legacyRecipeUnsupported","config","family","face","legacyNativeShape","shared","circle","triangle","flower","diamond","heart","foldShape","shape","undefined","radialContour","polygons","samples","Number","isInteger","Error","Array","from","length","_","i","angle","Math","PI","dx","cos","dy","sin","radius","polygon","j","ax","ay","bx","by","ex","ey","denominator","abs","distance","segment","isFinite","legacyCharacterRecipe","customization","character","preset","selections","eyes","eyewear","accessory","bodyColor","avatarHex","legacyRecipe","recipe","points","legacyContours","patch"],"sourceRoot":"../../../src","sources":["agent-avatar/legacy-recipe.ts"],"mappings":"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","ignoreList":[]}
|