@voqalize/avatar 0.4.4 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/README.md +65 -154
  2. package/dist/index.d.ts +37 -26
  3. package/dist/index.js +48 -25
  4. package/dist/pin.d.ts +2 -0
  5. package/dist/pin.js +3 -0
  6. package/dist/react.d.ts +21 -6
  7. package/dist/react.js +24 -6
  8. package/package.json +8 -67
  9. package/LICENSE-APACHE-2.0 +0 -201
  10. package/LICENSE-CC-BY-4.0 +0 -396
  11. package/assets/README.md +0 -60
  12. package/assets/tanvi.glb +0 -0
  13. package/assets/tanya.glb +0 -0
  14. package/assets/tara.glb +0 -0
  15. package/assets/tess.glb +0 -0
  16. package/assets/tushar.glb +0 -0
  17. package/client/Avatar.tsx +0 -57
  18. package/client/AvatarClient.ts +0 -818
  19. package/client/createAvatar.ts +0 -177
  20. package/client/index.ts +0 -44
  21. package/client/internal.ts +0 -132
  22. package/client/playout.ts +0 -95
  23. package/client/react.ts +0 -13
  24. package/client/supports.ts +0 -27
  25. package/client/three/assets.ts +0 -26
  26. package/client/three/budgets.ts +0 -27
  27. package/client/three/character-rig.ts +0 -1746
  28. package/client/three/createCharacter.ts +0 -109
  29. package/client/three/holds.ts +0 -69
  30. package/client/three/internal.ts +0 -55
  31. package/client/three/motion-limits.json +0 -124
  32. package/client/three/sequences.ts +0 -281
  33. package/client/three/tanvi-asset.ts +0 -6
  34. package/client/three/tanvi.ts +0 -30
  35. package/client/three/tanya-asset.ts +0 -6
  36. package/client/three/tanya.ts +0 -29
  37. package/client/three/tara-asset.ts +0 -25
  38. package/client/three/tara.ts +0 -36
  39. package/client/three/tess-asset.ts +0 -6
  40. package/client/three/tess.ts +0 -30
  41. package/client/three/tushar-asset.ts +0 -6
  42. package/client/three/tushar.ts +0 -28
  43. package/client/types.ts +0 -235
  44. package/client/useAvatar.ts +0 -74
  45. package/dist/Avatar.d.ts +0 -44
  46. package/dist/Avatar.d.ts.map +0 -1
  47. package/dist/Avatar.js +0 -7
  48. package/dist/Avatar.js.map +0 -1
  49. package/dist/AvatarClient.d.ts +0 -274
  50. package/dist/AvatarClient.d.ts.map +0 -1
  51. package/dist/AvatarClient.js +0 -712
  52. package/dist/AvatarClient.js.map +0 -1
  53. package/dist/createAvatar.d.ts +0 -135
  54. package/dist/createAvatar.d.ts.map +0 -1
  55. package/dist/createAvatar.js +0 -75
  56. package/dist/createAvatar.js.map +0 -1
  57. package/dist/index.d.ts.map +0 -1
  58. package/dist/index.js.map +0 -1
  59. package/dist/internal.d.ts +0 -34
  60. package/dist/internal.d.ts.map +0 -1
  61. package/dist/internal.js +0 -56
  62. package/dist/internal.js.map +0 -1
  63. package/dist/playout.d.ts +0 -42
  64. package/dist/playout.d.ts.map +0 -1
  65. package/dist/playout.js +0 -85
  66. package/dist/playout.js.map +0 -1
  67. package/dist/react.d.ts.map +0 -1
  68. package/dist/react.js.map +0 -1
  69. package/dist/supports.d.ts +0 -19
  70. package/dist/supports.d.ts.map +0 -1
  71. package/dist/supports.js +0 -25
  72. package/dist/supports.js.map +0 -1
  73. package/dist/three/assets.d.ts +0 -10
  74. package/dist/three/assets.d.ts.map +0 -1
  75. package/dist/three/assets.js +0 -23
  76. package/dist/three/assets.js.map +0 -1
  77. package/dist/three/budgets.d.ts +0 -17
  78. package/dist/three/budgets.d.ts.map +0 -1
  79. package/dist/three/budgets.js +0 -21
  80. package/dist/three/budgets.js.map +0 -1
  81. package/dist/three/character-rig.d.ts +0 -366
  82. package/dist/three/character-rig.d.ts.map +0 -1
  83. package/dist/three/character-rig.js +0 -1644
  84. package/dist/three/character-rig.js.map +0 -1
  85. package/dist/three/createCharacter.d.ts +0 -60
  86. package/dist/three/createCharacter.d.ts.map +0 -1
  87. package/dist/three/createCharacter.js +0 -84
  88. package/dist/three/createCharacter.js.map +0 -1
  89. package/dist/three/holds.d.ts +0 -38
  90. package/dist/three/holds.d.ts.map +0 -1
  91. package/dist/three/holds.js +0 -61
  92. package/dist/three/holds.js.map +0 -1
  93. package/dist/three/internal.d.ts +0 -52
  94. package/dist/three/internal.d.ts.map +0 -1
  95. package/dist/three/internal.js +0 -49
  96. package/dist/three/internal.js.map +0 -1
  97. package/dist/three/motion-limits.json +0 -124
  98. package/dist/three/sequences.d.ts +0 -71
  99. package/dist/three/sequences.d.ts.map +0 -1
  100. package/dist/three/sequences.js +0 -262
  101. package/dist/three/sequences.js.map +0 -1
  102. package/dist/three/tanvi-asset.d.ts +0 -7
  103. package/dist/three/tanvi-asset.d.ts.map +0 -1
  104. package/dist/three/tanvi-asset.js +0 -7
  105. package/dist/three/tanvi-asset.js.map +0 -1
  106. package/dist/three/tanvi.d.ts +0 -24
  107. package/dist/three/tanvi.d.ts.map +0 -1
  108. package/dist/three/tanvi.js +0 -24
  109. package/dist/three/tanvi.js.map +0 -1
  110. package/dist/three/tanya-asset.d.ts +0 -7
  111. package/dist/three/tanya-asset.d.ts.map +0 -1
  112. package/dist/three/tanya-asset.js +0 -7
  113. package/dist/three/tanya-asset.js.map +0 -1
  114. package/dist/three/tanya.d.ts +0 -23
  115. package/dist/three/tanya.d.ts.map +0 -1
  116. package/dist/three/tanya.js +0 -23
  117. package/dist/three/tanya.js.map +0 -1
  118. package/dist/three/tara-asset.d.ts +0 -26
  119. package/dist/three/tara-asset.d.ts.map +0 -1
  120. package/dist/three/tara-asset.js +0 -26
  121. package/dist/three/tara-asset.js.map +0 -1
  122. package/dist/three/tara.d.ts +0 -30
  123. package/dist/three/tara.d.ts.map +0 -1
  124. package/dist/three/tara.js +0 -30
  125. package/dist/three/tara.js.map +0 -1
  126. package/dist/three/tess-asset.d.ts +0 -7
  127. package/dist/three/tess-asset.d.ts.map +0 -1
  128. package/dist/three/tess-asset.js +0 -7
  129. package/dist/three/tess-asset.js.map +0 -1
  130. package/dist/three/tess.d.ts +0 -24
  131. package/dist/three/tess.d.ts.map +0 -1
  132. package/dist/three/tess.js +0 -24
  133. package/dist/three/tess.js.map +0 -1
  134. package/dist/three/tushar-asset.d.ts +0 -7
  135. package/dist/three/tushar-asset.d.ts.map +0 -1
  136. package/dist/three/tushar-asset.js +0 -7
  137. package/dist/three/tushar-asset.js.map +0 -1
  138. package/dist/three/tushar.d.ts +0 -22
  139. package/dist/three/tushar.d.ts.map +0 -1
  140. package/dist/three/tushar.js +0 -22
  141. package/dist/three/tushar.js.map +0 -1
  142. package/dist/types.d.ts +0 -149
  143. package/dist/types.d.ts.map +0 -1
  144. package/dist/types.js +0 -140
  145. package/dist/types.js.map +0 -1
  146. package/dist/useAvatar.d.ts +0 -39
  147. package/dist/useAvatar.d.ts.map +0 -1
  148. package/dist/useAvatar.js +0 -35
  149. package/dist/useAvatar.js.map +0 -1
  150. package/src/avatar.d.ts +0 -436
  151. package/src/avatar.js +0 -1378
  152. package/src/behavior.d.ts +0 -42
  153. package/src/behavior.js +0 -114
  154. package/src/camera.js +0 -29
  155. package/src/clips.js +0 -155
  156. package/src/conformance.js +0 -119
  157. package/src/emotions.js +0 -58
  158. package/src/face-core.js +0 -180
  159. package/src/face-myna.d.ts +0 -7
  160. package/src/face-myna.js +0 -786
  161. package/src/face-peep-control-plane.js +0 -167
  162. package/src/face-peep.d.ts +0 -7
  163. package/src/face-peep.js +0 -925
  164. package/src/face-wren.d.ts +0 -7
  165. package/src/face-wren.js +0 -468
  166. package/src/faces.d.ts +0 -12
  167. package/src/faces.js +0 -53
  168. package/src/gaze.js +0 -504
  169. package/src/hand.js +0 -709
  170. package/src/head.js +0 -134
  171. package/src/idle.js +0 -668
  172. package/src/interjections.js +0 -747
  173. package/src/line-art.js +0 -137
  174. package/src/params.js +0 -180
  175. package/src/perform.js +0 -107
  176. package/src/prosody.js +0 -741
  177. package/src/rig.d.ts +0 -31
  178. package/src/rig.js +0 -32
  179. package/src/speech-timing.js +0 -51
  180. package/src/visemes.js +0 -410
@@ -1,71 +0,0 @@
1
- import type { AvatarSupport } from "../internal.js";
2
- type Keyframes = Record<string, [number, number][]>;
3
- interface Sequence {
4
- readonly id: string;
5
- readonly label: string;
6
- readonly text: string;
7
- readonly duration: number;
8
- readonly keys: Keyframes;
9
- }
10
- /**
11
- * What a server may address on a Blender avatar by name, beyond the two every
12
- * avatar owes it.
13
- *
14
- * Shared by every character in this package rather than owned by tara, because
15
- * they are all driven through the same 30 channels. A character that needs its
16
- * own shape of one of these overrides that entry; it does not get a second
17
- * table.
18
- */
19
- export declare const BLENDER_SEQUENCES: Readonly<{
20
- NOD_SMALL: Sequence;
21
- NOD_ASSESS: Sequence;
22
- NOD_REALIZE: Sequence;
23
- NOD_NO: Sequence;
24
- }>;
25
- export type BlenderSequenceId = keyof typeof BLENDER_SEQUENCES;
26
- /**
27
- * The Blender avatars' own shape for one of the mixer's own actions, passed to
28
- * it as `actions`. Same ids, same intent; only the rendering is theirs.
29
- *
30
- * **`ACK_NOD` is the continuer here.** It is the nod a server sends while the
31
- * user is still talking — "mm-hm, go on" — and that is half of all nods and
32
- * most of what this avatar does, because it listens far more than it speaks.
33
- * The shared clip is two strokes that render 15° on this head, which is past
34
- * even agreement (6–10°) and is what the owner read as the head dropping. A
35
- * server that means agreement or realisation, and knows a Blender avatar is
36
- * mounted, asks for `NOD_ASSESS` or `NOD_REALIZE`.
37
- *
38
- * Aliased rather than restated, so the continuer and the portable nod cannot
39
- * drift apart.
40
- *
41
- * The other shared clips with head keys stay shared, because they already
42
- * land inside their meaning on tara: `GESTURE_APPROVE` renders 8.8° of
43
- * chin-down (agreement's band), `GESTURE_GREET` 2.9° of chin-up, and
44
- * `GESTURE_WAIT` 5.2° of yaw.
45
- */
46
- export declare const BLENDER_ACTIONS: Readonly<{
47
- ACK_NOD: {
48
- id: string;
49
- label: string;
50
- text: string;
51
- duration: number;
52
- keys: Keyframes;
53
- };
54
- }>;
55
- /**
56
- * What every character in this package answers to — each one's `supports`, the
57
- * optional declaration a driving UI reads (`AvatarSupport`).
58
- *
59
- * Derived rather than written down, because every part of it already exists: the
60
- * ids every avatar owes a server, the mixer's own clip catalogue these
61
- * characters inherit whole, and this file's own names. A hand-kept copy beside
62
- * them would only be able to disagree with them. `BLENDER_ACTIONS` adds nothing —
63
- * it re-shapes an id the mixer already has.
64
- *
65
- * It is one list for every 2.5-D character for the same reason the tables are:
66
- * they are one rig driven through one set of channels. A character that stops
67
- * being able to do one of these owes its own `supports`, not an edit here.
68
- */
69
- export declare const BLENDER_SUPPORTS: AvatarSupport;
70
- export {};
71
- //# sourceMappingURL=sequences.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sequences.d.ts","sourceRoot":"","sources":["../../client/three/sequences.ts"],"names":[],"mappings":"AA8DA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AACpD,UAAU,QAAQ;IAChB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;CAC1B;AAiJD;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB;;;;;EAE5B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,eAAe;;;;cAvLX,MAAM;kBACF,MAAM;cACV,SAAS;;EAuLxB,CAAC;AAOH;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,EAAE,aAM7B,CAAC"}
@@ -1,262 +0,0 @@
1
- /**
2
- * The Blender avatars' own addressable motions, and their own shape for the one
3
- * shared action whose keys do not fit a head that turns in degrees.
4
- *
5
- * These are *shapes*, authored in a rig whose pose unit is a degree, and a
6
- * server addresses them by name with `cmd: "action"` when it knows which avatar
7
- * is mounted. The wire's action vocabulary is open, so they need no promotion
8
- * and are not trying to get one; a face without them ignores the message
9
- * ([contract-wire.md](../../../docs/contract-wire.md) § Action).
10
- *
11
- * **Why nods get three shapes and one intent.** A 2025 ICMI motion-capture
12
- * corpus of 90 attentive-listening dialogues separates nodding into three types
13
- * and publishes the distribution (research-biomechanics.md § 3.3):
14
- *
15
- * | type | what it co-occurs with | share of nods | mean duration |
16
- * |---|---|---:|---:|
17
- * | `short` | continuer backchannel — "mm-hm, go on" | 49% | 0.83 s |
18
- * | `long` | assessment, lexical response — "yes, that's right" | 40% | 1.42 s |
19
- * | `long_p` | a cognitive shift — "ah, I see" | 12% | 1.75 s |
20
- *
21
- * Their gloss: "nodding co-occurring with continuer backchannel has a smaller
22
- * average range of movement, whereas that co-occurring with assessment
23
- * backchannel and lexical responses has a larger average range", and "nodding
24
- * with swinging up is regarded to reflect a cognitive shift in the listener."
25
- *
26
- * That is three different things to say, not three sizes of one thing — which
27
- * is exactly why they are this avatar's own names and not three spellings of
28
- * one. `ACKNOWLEDGE` remains the portable "acknowledge the user" that every
29
- * renderer answers, and resolves to the continuer here; a server that knows it
30
- * is driving tara can say *which* nod.
31
- *
32
- * **How big, in degrees** (research-head-rotation.md § 2.3, peak-to-peak):
33
- * a continuer 3–5°, one stroke that returns as far as it went; agreement 6–10°,
34
- * single, ample and stressed; "oh, I see" 6–10°, opening upward. People's nods
35
- * are narrower than they look — Blomsma 2024 measures 5.95° on average at
36
- * backchannel opportunities, Kato 2026 about 4° — and a nod past them stops
37
- * reading as listening and starts reading as the head dropping.
38
- *
39
- * **§ 3.4's structural laws hold in every clip here**, because the paper's
40
- * finding is that flat repeated cycles are what real nods are not:
41
- *
42
- * 1. *Anticipatory rising* — a longer nod starts bigger, from the first
43
- * cycle. The head knows how long the nod will be before it begins.
44
- * 2. *Declination* — each cycle is smaller than the one before it, by about
45
- * 0.7× (Mori 2025).
46
- * 3. *Under 1.5 Hz* — above it a nod reads as impatience rather than
47
- * attention, and the head's own 160 ms smoothing eats most of it anyway.
48
- * People repeat nods at 2–3.5 Hz; the cap is a perceptual choice and it
49
- * stays, so a repeated nod here is slower than a person's.
50
- *
51
- * **Amplitudes are pre-compensated and the numbers are not free.** A stroke is
52
- * a target the head chases at a 160 ms time constant, so what renders is well
53
- * under what is written. `test/nods.test.ts` steps the real mixer and holds
54
- * each clip's rendered degrees to its band; the degrees quoted below are its.
55
- *
56
- * TARA-SPECIFIC: the keys are pose units, and a pose unit becomes degrees
57
- * through the mounted avatar's `HEAD_DEG` — tara's is 24° of pitch at the
58
- * ±1.4 clamp, 17.1° a unit. A second Blender avatar with another envelope
59
- * renders these same keys at other angles, and the degrees are recorded per
60
- * character where they are measured rather than here.
61
- */
62
- import { ACTION_IDS, ACTIONS, CORE_ACTION_IDS } from "../internal.js";
63
- /**
64
- * The continuer. "Go on, I'm with you" — half of all nods, and the one the
65
- * avatar would be doing most if a server drove every backchannel.
66
- *
67
- * One stroke down and back, because a continuer is "a single small nod" (Kato
68
- * 2026) and within a cycle the return is as big as the stroke (Mori 2025): no
69
- * rebound above neutral, which on a head that really rotates reads as a second,
70
- * upward nod. The stroke is fast and the return takes its time, which is what
71
- * makes it a beat rather than a bob. 720 ms, inside the 0.5–0.8 s a single
72
- * small nod lasts.
73
- *
74
- * **No preparatory up-beat, and that is a rate constraint rather than taste.**
75
- * An earlier draft opened with a dip, which put a turning point 308 ms before
76
- * the down-peak — 1.63 Hz. The corpus lists the swing-up as optional on `short`
77
- * and mandatory only on `long_p`, so the one that had to go was the one never
78
- * carrying meaning.
79
- *
80
- * The trunk sets forward a fraction and the shoulders with it — about a fifth
81
- * and a third of the shared `ACK_NOD`'s — because a head that nods on a body
82
- * that does not move is a head on a stick, and more than that turns "go on"
83
- * into leaning in.
84
- *
85
- * Renders ~4° of chin-down on tara.
86
- */
87
- const NOD_SMALL = {
88
- id: "NOD_SMALL", label: "nod: continuer", text: "", duration: 720,
89
- keys: {
90
- headPitch: [[0, 0], [0.36, 0.34], [1, 0]],
91
- // The lid dip is what separates a nod from a bob: eyes stay with the user
92
- // and close a fraction on the beat.
93
- lidL: [[0, 0], [0.40, 0.045], [1, 0]],
94
- lidR: [[0, 0], [0.40, 0.045], [1, 0]],
95
- torsoLean: [[0, 0], [0.40, 0.026], [1, 0]],
96
- shoulderL: [[0, 0], [0.46, 0.019], [1, 0]],
97
- shoulderR: [[0, 0], [0.46, 0.019], [1, 0]],
98
- },
99
- };
100
- /**
101
- * The assessment nod — "yes, that's right".
102
- *
103
- * Agreement is "single, ample and stressed" (Poggi), larger and faster than
104
- * feedback (Bauer 2024), so it is one stroke with a hold at the bottom rather
105
- * than the continuer made bigger: the hold is the stress, and it is what keeps
106
- * a large nod from reading as a twitch. About twice the continuer's depth.
107
- *
108
- * It aliased the shared `ACK_NOD` until 2026-09-14. That clip is two strokes
109
- * sized for a line face, and on a head that really rotates it rendered 15°,
110
- * which is past every row of research § 2.3.
111
- *
112
- * Renders ~8° of chin-down on tara.
113
- */
114
- const NOD_ASSESS = {
115
- id: "NOD_ASSESS", label: "nod: assessment", text: "", duration: 1000,
116
- keys: {
117
- headPitch: [[0, 0], [0.26, 0.56], [0.50, 0.50], [1, 0]],
118
- lidL: [[0, 0], [0.28, 0.06], [0.55, 0.04], [1, 0]],
119
- lidR: [[0, 0], [0.28, 0.06], [0.55, 0.04], [1, 0]],
120
- torsoLean: [[0, 0], [0.32, 0.04], [0.60, 0.03], [1, 0]],
121
- shoulderL: [[0, 0], [0.40, 0.025], [1, 0]],
122
- shoulderR: [[0, 0], [0.40, 0.025], [1, 0]],
123
- },
124
- };
125
- /**
126
- * "Ah — I see." The realisation nod, and the only one that *starts by going
127
- * up*.
128
- *
129
- * The swing-up is the whole gesture, not an ornament: it is what the corpus
130
- * separates `long_p` from `long` by, and what makes this read as a mind
131
- * changing rather than a head agreeing (Mori 2022: upward-first marks a change
132
- * of state). Then two declining beats at 1.30 Hz, the second about 0.65 of the
133
- * first.
134
- *
135
- * Longest of the three at 1.75 s, and that is the corpus mean for this type —
136
- * a realisation takes longer than an agreement because something happened in
137
- * between.
138
- *
139
- * Renders ~3.5° of chin-up, then ~6° of chin-down, on tara.
140
- */
141
- const NOD_REALIZE = {
142
- id: "NOD_REALIZE", label: "nod: realisation", text: "", duration: 1750,
143
- keys: {
144
- // Same as the assessment nod: no trailing flourish. A −0.08 at 0.95 put two
145
- // return beats 542 ms apart, 1.85 Hz, which is a twitch on the way out of a
146
- // gesture whose whole point is the deliberate lift at the start.
147
- headPitch: [[0, 0], [0.14, -0.30], [0.40, 0.48], [0.64, -0.12], [0.84, 0.30], [1, 0]],
148
- // Brows up with the swing and down as the nod lands: the face arrives at
149
- // the understanding before the head finishes agreeing with it.
150
- browRaiseL: [[0, 0], [0.16, 0.42], [0.46, 0.10], [1, 0]],
151
- browRaiseR: [[0, 0], [0.16, 0.38], [0.46, 0.10], [1, 0]],
152
- lidL: [[0, 0], [0.14, -0.08], [0.42, 0.06], [1, 0]],
153
- lidR: [[0, 0], [0.14, -0.08], [0.42, 0.06], [1, 0]],
154
- // The corners come up late, on the second beat. Warmth that arrives *with*
155
- // the realisation reads as having known already.
156
- mouthCornerL: [[0, 0], [0.55, 0.10], [0.84, 0.26], [1, 0.12]],
157
- mouthCornerR: [[0, 0], [0.55, 0.10], [0.84, 0.26], [1, 0.12]],
158
- },
159
- };
160
- /**
161
- * "No." The head shake, and it had to be authored for this rig rather than
162
- * borrowed.
163
- *
164
- * `INTERNAL_CLIPS.HEAD_SHAKE` is written in pose units that mean pixels on a
165
- * line face. On tara a pose unit is a degree, and that clip's +-0.55 lands at
166
- * +-3.5 deg authored and about +-2 deg rendered — ambient drift, not a refusal.
167
- * Two things had to change and only one of them is amplitude.
168
- *
169
- * **Yaw is the axis this rig is weakest on**, because the albedo is a front
170
- * projection of a shallow shell: a turn parallaxes rather than re-silhouettes.
171
- * Measured against the tile, though, it is not as weak as it looks — 8.7 deg
172
- * moves 13% of the pixels past a 16/255 delta and carries the silhouette 6 px,
173
- * which is comparable to what 5.7 deg of roll does. So a shake reads here; it
174
- * just has to actually reach those angles.
175
- *
176
- * **And it has to be slow enough to survive the smoothing.** The borrowed clip
177
- * swings at 1.42 Hz where the head returns about 0.57 of what it is asked for.
178
- * At 1.05 Hz it returns ~0.71, which buys a quarter more amplitude for nothing
179
- * and sits further from the impatience line a *refusal* can least afford to
180
- * cross.
181
- *
182
- * Renders about 11 deg peak-to-peak of yaw. § 3.4's laws again: first swing
183
- * biggest, every one after it smaller.
184
- */
185
- const NOD_NO = {
186
- id: "NOD_NO", label: "no (head shake)", text: "", duration: 1900,
187
- keys: {
188
- headYaw: [[0, 0], [0.14, -1.35], [0.39, 1.15], [0.64, -0.62], [0.85, 0.24], [1, 0]],
189
- // A small roll in phase with the turn, because a head that swings on one
190
- // axis alone is a turret. Kept to a fifth of the yaw: more and the refusal
191
- // starts reading as a wince.
192
- headRoll: [[0, 0], [0.14, -0.26], [0.39, 0.22], [0.64, -0.12], [1, 0]],
193
- // The set of the face is what makes it a "no" rather than a look around.
194
- // A refusal over a resting smile reads as teasing.
195
- mouthPress: [[0, 0], [0.18, 0.40], [0.82, 0.34], [1, 0]],
196
- mouthCornerL: [[0, 0], [0.22, -0.22], [1, 0]],
197
- mouthCornerR: [[0, 0], [0.22, -0.22], [1, 0]],
198
- browRaiseL: [[0, 0], [0.18, -0.24], [0.86, -0.12], [1, 0]],
199
- browRaiseR: [[0, 0], [0.18, -0.24], [0.86, -0.12], [1, 0]],
200
- },
201
- };
202
- /**
203
- * What a server may address on a Blender avatar by name, beyond the two every
204
- * avatar owes it.
205
- *
206
- * Shared by every character in this package rather than owned by tara, because
207
- * they are all driven through the same 30 channels. A character that needs its
208
- * own shape of one of these overrides that entry; it does not get a second
209
- * table.
210
- */
211
- export const BLENDER_SEQUENCES = Object.freeze({
212
- NOD_SMALL, NOD_ASSESS, NOD_REALIZE, NOD_NO,
213
- });
214
- /**
215
- * The Blender avatars' own shape for one of the mixer's own actions, passed to
216
- * it as `actions`. Same ids, same intent; only the rendering is theirs.
217
- *
218
- * **`ACK_NOD` is the continuer here.** It is the nod a server sends while the
219
- * user is still talking — "mm-hm, go on" — and that is half of all nods and
220
- * most of what this avatar does, because it listens far more than it speaks.
221
- * The shared clip is two strokes that render 15° on this head, which is past
222
- * even agreement (6–10°) and is what the owner read as the head dropping. A
223
- * server that means agreement or realisation, and knows a Blender avatar is
224
- * mounted, asks for `NOD_ASSESS` or `NOD_REALIZE`.
225
- *
226
- * Aliased rather than restated, so the continuer and the portable nod cannot
227
- * drift apart.
228
- *
229
- * The other shared clips with head keys stay shared, because they already
230
- * land inside their meaning on tara: `GESTURE_APPROVE` renders 8.8° of
231
- * chin-down (agreement's band), `GESTURE_GREET` 2.9° of chin-up, and
232
- * `GESTURE_WAIT` 5.2° of yaw.
233
- */
234
- export const BLENDER_ACTIONS = Object.freeze({
235
- ACK_NOD: { ...NOD_SMALL, id: "ACK_NOD", label: "acknowledge: nod" },
236
- });
237
- // A shape for an action the mixer already has, never a new one: the mixer
238
- // refuses an id that is not its own, and this keeps the table honest at the type
239
- // level too. A *new* motion goes in the table above, which is the open door.
240
- void BLENDER_ACTIONS;
241
- /**
242
- * What every character in this package answers to — each one's `supports`, the
243
- * optional declaration a driving UI reads (`AvatarSupport`).
244
- *
245
- * Derived rather than written down, because every part of it already exists: the
246
- * ids every avatar owes a server, the mixer's own clip catalogue these
247
- * characters inherit whole, and this file's own names. A hand-kept copy beside
248
- * them would only be able to disagree with them. `BLENDER_ACTIONS` adds nothing —
249
- * it re-shapes an id the mixer already has.
250
- *
251
- * It is one list for every 2.5-D character for the same reason the tables are:
252
- * they are one rig driven through one set of channels. A character that stops
253
- * being able to do one of these owes its own `supports`, not an edit here.
254
- */
255
- export const BLENDER_SUPPORTS = Object.freeze({
256
- actions: Object.freeze([
257
- ...CORE_ACTION_IDS,
258
- ...ACTION_IDS.filter((id) => !CORE_ACTION_IDS.includes(id)),
259
- ...Object.keys(BLENDER_SEQUENCES),
260
- ]),
261
- });
262
- //# sourceMappingURL=sequences.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sequences.js","sourceRoot":"","sources":["../../client/three/sequences.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Where tanvi's compiled GLB is. One character, one module — see
3
- * [tara-asset.ts](./tara-asset.ts) for why that separation is load-bearing and
4
- * why the `new URL` literal is spelled exactly this way.
5
- */
6
- export declare const TANVI_GLB: string;
7
- //# sourceMappingURL=tanvi-asset.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tanvi-asset.d.ts","sourceRoot":"","sources":["../../client/three/tanvi-asset.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,SAAS,QAA0D,CAAC"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Where tanvi's compiled GLB is. One character, one module — see
3
- * [tara-asset.ts](./tara-asset.ts) for why that separation is load-bearing and
4
- * why the `new URL` literal is spelled exactly this way.
5
- */
6
- export const TANVI_GLB = new URL("../../assets/tanvi.glb", import.meta.url).href;
7
- //# sourceMappingURL=tanvi-asset.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tanvi-asset.js","sourceRoot":"","sources":["../../client/three/tanvi-asset.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,wBAAwB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC"}
@@ -1,24 +0,0 @@
1
- /**
2
- * tanvi — Indian, and the first character whose hair is not part of her head.
3
- *
4
- * Her GLB is the shared scripts run with her landmarks (`characters/tanvi/`).
5
- * Her long waves fall past both shoulders onto her chest, which a `Hair` shell
6
- * painted into the head's atlas cannot carry: it can only be where the head is.
7
- * So her photograph is split into her with the hair pulled back, which is what
8
- * every other script reads, and the hair alone, which becomes a `HairLayer`
9
- * mesh of its own — turning with the skull, holding back its share of a roll
10
- * like tanya's hanging hair, lifting with the shoulders below the chin, and
11
- * drawn over everything behind it (`character-rig.ts`).
12
- *
13
- * Her head angles have not been read off her yet. `motion-limits.json` says so
14
- * rather than guessing, and `headHold` gives her the tightest budget any face
15
- * is still vouched for until the owner drives her.
16
- */
17
- import type { CharacterAvatarOptions } from "./createCharacter.js";
18
- export type { CharacterAvatarOptions as AvatarOptions };
19
- export type { AvatarInstance } from "./createCharacter.js";
20
- /** The optional driving-UI declaration; one list for every Blender character
21
- * (`sequences.ts`), because they are one rig. */
22
- export declare const supports: import("../createAvatar.js").AvatarSupport;
23
- export declare const createAvatar: import("../createAvatar.js").AvatarFactory<CharacterAvatarOptions>;
24
- //# sourceMappingURL=tanvi.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tanvi.d.ts","sourceRoot":"","sources":["../../client/three/tanvi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAInE,YAAY,EAAE,sBAAsB,IAAI,aAAa,EAAE,CAAC;AACxD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D;kDACkD;AAClD,eAAO,MAAM,QAAQ,4CAAmB,CAAC;AAEzC,eAAO,MAAM,YAAY,oEAAgC,CAAC"}
@@ -1,24 +0,0 @@
1
- /**
2
- * tanvi — Indian, and the first character whose hair is not part of her head.
3
- *
4
- * Her GLB is the shared scripts run with her landmarks (`characters/tanvi/`).
5
- * Her long waves fall past both shoulders onto her chest, which a `Hair` shell
6
- * painted into the head's atlas cannot carry: it can only be where the head is.
7
- * So her photograph is split into her with the hair pulled back, which is what
8
- * every other script reads, and the hair alone, which becomes a `HairLayer`
9
- * mesh of its own — turning with the skull, holding back its share of a roll
10
- * like tanya's hanging hair, lifting with the shoulders below the chin, and
11
- * drawn over everything behind it (`character-rig.ts`).
12
- *
13
- * Her head angles have not been read off her yet. `motion-limits.json` says so
14
- * rather than guessing, and `headHold` gives her the tightest budget any face
15
- * is still vouched for until the owner drives her.
16
- */
17
- import { character } from "./createCharacter.js";
18
- import { BLENDER_SUPPORTS } from "./sequences.js";
19
- import { TANVI_GLB } from "./tanvi-asset.js";
20
- /** The optional driving-UI declaration; one list for every Blender character
21
- * (`sequences.ts`), because they are one rig. */
22
- export const supports = BLENDER_SUPPORTS;
23
- export const createAvatar = character("tanvi", TANVI_GLB);
24
- //# sourceMappingURL=tanvi.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tanvi.js","sourceRoot":"","sources":["../../client/three/tanvi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAK7C;kDACkD;AAClD,MAAM,CAAC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;AAEzC,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Where tanya's compiled GLB is. One character, one module — see
3
- * [tara-asset.ts](./tara-asset.ts) for why that separation is load-bearing and
4
- * why the `new URL` literal is spelled exactly this way.
5
- */
6
- export declare const TANYA_GLB: string;
7
- //# sourceMappingURL=tanya-asset.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tanya-asset.d.ts","sourceRoot":"","sources":["../../client/three/tanya-asset.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,SAAS,QAA0D,CAAC"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Where tanya's compiled GLB is. One character, one module — see
3
- * [tara-asset.ts](./tara-asset.ts) for why that separation is load-bearing and
4
- * why the `new URL` literal is spelled exactly this way.
5
- */
6
- export const TANYA_GLB = new URL("../../assets/tanya.glb", import.meta.url).href;
7
- //# sourceMappingURL=tanya-asset.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tanya-asset.js","sourceRoot":"","sources":["../../client/three/tanya-asset.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,wBAAwB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC"}
@@ -1,23 +0,0 @@
1
- /**
2
- * tanya — the third 3-D character, and the first whose atlas is not tara's
3
- * window.
4
- *
5
- * Her GLB is the shared scripts run with her landmarks and atlas layout
6
- * (`characters/tanya/`, whose README has the provenance and the commands).
7
- * Her hair is the silhouette down past the jaw, out to |u| 0.761 where tara's
8
- * window stops at 0.64, so `characters/tanya/face_texture.py` widens it to
9
- * 1408x1568 at the same 800 pixels per face height. That is a fact about the
10
- * asset and costs this file nothing — the rig reads the window from the GLB.
11
- *
12
- * Hair that hangs is what else makes her the third rather than a fourth copy:
13
- * hers is the only `Hair` mesh that carries the roll channels, because it is
14
- * the only one with anything below the hold line to lag behind a tilt.
15
- */
16
- import type { CharacterAvatarOptions } from "./createCharacter.js";
17
- export type { CharacterAvatarOptions as AvatarOptions };
18
- export type { AvatarInstance } from "./createCharacter.js";
19
- /** The optional driving-UI declaration; one list for every Blender character
20
- * (`sequences.ts`), because they are one rig. */
21
- export declare const supports: import("../createAvatar.js").AvatarSupport;
22
- export declare const createAvatar: import("../createAvatar.js").AvatarFactory<CharacterAvatarOptions>;
23
- //# sourceMappingURL=tanya.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tanya.d.ts","sourceRoot":"","sources":["../../client/three/tanya.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAInE,YAAY,EAAE,sBAAsB,IAAI,aAAa,EAAE,CAAC;AACxD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D;kDACkD;AAClD,eAAO,MAAM,QAAQ,4CAAmB,CAAC;AAEzC,eAAO,MAAM,YAAY,oEAAgC,CAAC"}
@@ -1,23 +0,0 @@
1
- /**
2
- * tanya — the third 3-D character, and the first whose atlas is not tara's
3
- * window.
4
- *
5
- * Her GLB is the shared scripts run with her landmarks and atlas layout
6
- * (`characters/tanya/`, whose README has the provenance and the commands).
7
- * Her hair is the silhouette down past the jaw, out to |u| 0.761 where tara's
8
- * window stops at 0.64, so `characters/tanya/face_texture.py` widens it to
9
- * 1408x1568 at the same 800 pixels per face height. That is a fact about the
10
- * asset and costs this file nothing — the rig reads the window from the GLB.
11
- *
12
- * Hair that hangs is what else makes her the third rather than a fourth copy:
13
- * hers is the only `Hair` mesh that carries the roll channels, because it is
14
- * the only one with anything below the hold line to lag behind a tilt.
15
- */
16
- import { character } from "./createCharacter.js";
17
- import { BLENDER_SUPPORTS } from "./sequences.js";
18
- import { TANYA_GLB } from "./tanya-asset.js";
19
- /** The optional driving-UI declaration; one list for every Blender character
20
- * (`sequences.ts`), because they are one rig. */
21
- export const supports = BLENDER_SUPPORTS;
22
- export const createAvatar = character("tanya", TANYA_GLB);
23
- //# sourceMappingURL=tanya.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tanya.js","sourceRoot":"","sources":["../../client/three/tanya.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAK7C;kDACkD;AAClD,MAAM,CAAC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;AAEzC,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC"}
@@ -1,26 +0,0 @@
1
- /**
2
- * Where tara's compiled GLB is — one character, one module, on purpose.
3
- *
4
- * `new URL(…, import.meta.url)` and not a bundler's asset import: these files
5
- * are fetched at runtime by a consumer's app, and the spelling has to survive
6
- * Vite, webpack, Rollup, esbuild, a plain `tsc` output and a browser loading the
7
- * module directly. The query-suffix form this used to carry is Vite syntax —
8
- * every other toolchain, including the compiler that now builds this directory,
9
- * passes it through verbatim and produces an import of a file that is not there.
10
- *
11
- * The depth is the same from the source tree and from the compiled one
12
- * (`client/three/` and `dist/three/` are siblings), so one literal is correct in
13
- * both — and literal is load-bearing, because a bundler can only follow this
14
- * pattern when it can read the path without running anything.
15
- *
16
- * **One module per character is the whole point, and it is a bundling fact, not
17
- * tidiness.** A bundler that can follow `new URL` emits the file it names, and
18
- * it decides what to emit per *module*: three literals in one object meant a
19
- * consumer who imported one character shipped all three GLBs — ~1.3 MB of a
20
- * character they never mount, in every build we checked. Splitting them is what
21
- * makes `@voqalize/avatar/avatars/tara` cost tara. Nothing that a character
22
- * module loads may reach for another character's URL, which is also why the rig
23
- * takes its `url` from its caller instead of defaulting to tara's.
24
- */
25
- export declare const TARA_GLB: string;
26
- //# sourceMappingURL=tara-asset.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tara-asset.d.ts","sourceRoot":"","sources":["../../client/three/tara-asset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,QAAQ,QAAyD,CAAC"}
@@ -1,26 +0,0 @@
1
- /**
2
- * Where tara's compiled GLB is — one character, one module, on purpose.
3
- *
4
- * `new URL(…, import.meta.url)` and not a bundler's asset import: these files
5
- * are fetched at runtime by a consumer's app, and the spelling has to survive
6
- * Vite, webpack, Rollup, esbuild, a plain `tsc` output and a browser loading the
7
- * module directly. The query-suffix form this used to carry is Vite syntax —
8
- * every other toolchain, including the compiler that now builds this directory,
9
- * passes it through verbatim and produces an import of a file that is not there.
10
- *
11
- * The depth is the same from the source tree and from the compiled one
12
- * (`client/three/` and `dist/three/` are siblings), so one literal is correct in
13
- * both — and literal is load-bearing, because a bundler can only follow this
14
- * pattern when it can read the path without running anything.
15
- *
16
- * **One module per character is the whole point, and it is a bundling fact, not
17
- * tidiness.** A bundler that can follow `new URL` emits the file it names, and
18
- * it decides what to emit per *module*: three literals in one object meant a
19
- * consumer who imported one character shipped all three GLBs — ~1.3 MB of a
20
- * character they never mount, in every build we checked. Splitting them is what
21
- * makes `@voqalize/avatar/avatars/tara` cost tara. Nothing that a character
22
- * module loads may reach for another character's URL, which is also why the rig
23
- * takes its `url` from its caller instead of defaulting to tara's.
24
- */
25
- export const TARA_GLB = new URL("../../assets/tara.glb", import.meta.url).href;
26
- //# sourceMappingURL=tara-asset.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tara-asset.js","sourceRoot":"","sources":["../../client/three/tara-asset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC"}
@@ -1,30 +0,0 @@
1
- /**
2
- * tara — the first 3-D character, as a complete `createAvatar` module.
3
- *
4
- * Structurally this is the canvas avatars' shape, one layer down: the mixer
5
- * (`@voqalize/avatar/internal`) does states, layers, gaze, idle, blinks, clips
6
- * and per-channel smoothing exactly as it does for every SVG face, and the only
7
- * thing a Blender character replaces is the renderer at the end of it. That is
8
- * the whole argument for authoring her morph targets under the library's pose
9
- * channel names: nothing above this line knows there is a GPU involved, and
10
- * every clip, viseme and co-articulation rule the SVG faces have works here
11
- * unmodified.
12
- *
13
- * How a Blender character is driven is `createCharacter.ts`, and it is the same
14
- * for all of them. What is hers is the mesh — and, until 2026-09-23, rather
15
- * more than that: this file was the original, the others were copies of it, and
16
- * the performance every character inherits was measured on her face. It is the
17
- * house performance now (`CHARACTER_TUNING`), which changes nothing about how
18
- * she looks and everything about where it is decided.
19
- *
20
- * The Three.js import lives behind this module rather than in the barrel so an
21
- * SVG or Canvas consumer never downloads it.
22
- */
23
- import type { CharacterAvatarOptions } from "./createCharacter.js";
24
- export type { CharacterAvatarOptions as AvatarOptions };
25
- export type { AvatarInstance } from "./createCharacter.js";
26
- /** The optional driving-UI declaration; one list for every Blender character
27
- * (`sequences.ts`), because they are one rig. */
28
- export declare const supports: import("../createAvatar.js").AvatarSupport;
29
- export declare const createAvatar: import("../createAvatar.js").AvatarFactory<CharacterAvatarOptions>;
30
- //# sourceMappingURL=tara.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tara.d.ts","sourceRoot":"","sources":["../../client/three/tara.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAInE,YAAY,EAAE,sBAAsB,IAAI,aAAa,EAAE,CAAC;AACxD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D;kDACkD;AAClD,eAAO,MAAM,QAAQ,4CAAmB,CAAC;AAEzC,eAAO,MAAM,YAAY,oEAA8B,CAAC"}