@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,167 +0,0 @@
1
- /**
2
- * Peep control-plane study.
3
- *
4
- * This is intentionally not a character and is not registered in faces.js.
5
- * It retains only SVG elements whose geometry is written from apply(params):
6
- * brows, eyes, mouth interior/lips, teeth and tongue. The other pose-layer
7
- * groups remain empty because poseTransforms writes their transforms; keeping
8
- * the groups lets this file exercise the exact same animation contract without
9
- * silently changing the engine.
10
- */
11
-
12
- import { clamp, lerp } from './params.js';
13
- import { f, createFaceShell, faceApi, poseTransforms, pairedTeeth } from './face-core.js';
14
- import { taper, taperRing, region } from './line-art.js';
15
-
16
- export const THEME = {
17
- ink: '#1b1b1b', paper: '#ffffff', accent: '#f97415',
18
- mouthIn: '#1b1b1b', teeth: '#ffffff', tongue: '#8d7f79',
19
- };
20
-
21
- const VB = { x: 92, y: 76, w: 576, h: 800 };
22
- export const META = {
23
- viewBox: { ...VB },
24
- mouthCrop: { x: 296, y: 434, w: 168, h: 98 },
25
- };
26
-
27
- // These are geometry anchors for paths regenerated by apply(), not drawn art.
28
- const CX = 380;
29
- const BROW_L = [[CX - 20, 347], [CX - 40, 340], [CX - 60, 336], [CX - 76, 337],
30
- [CX - 86, 339], [CX - 94, 343], [CX - 99, 348]];
31
- const BROW_R = [[CX + 22, 344], [CX + 40, 337], [CX + 58, 333], [CX + 73, 335],
32
- [CX + 83, 337], [CX + 90, 341], [CX + 95, 346]];
33
- const EYE = { y: 386, dx: 55, rx: 14, ry: 16.5 };
34
- const MOUTH = { cx: CX, cy: 488 };
35
- const MOUTH_APERTURE = 38;
36
-
37
- // The original pose specification is retained verbatim: this study is for
38
- // observing control planes, not for creating a second motion model.
39
- const PIVOT = { x: CX, y: 700 };
40
- const POSE = {
41
- leanTravel: 23, leanPivot: { x: PIVOT.x, y: 560 },
42
- shrugLift: 30, shrugTiltDeg: 1.6, shrugPivot: { x: PIVOT.x, y: 800 },
43
- yawPx: 28, pitchPx: 17, pivot: PIVOT,
44
- pitch: {
45
- headLayers: ['skull', 'features', 'hair'], neckLayer: 'neck',
46
- hinge: { x: CX, y: 620 }, neckBase: { x: CX, y: 720 },
47
- headTravel: 1.0, neckTravel: 0.22, foreshorten: 0.040, neckCompress: 0.034,
48
- },
49
- breathSwell: 0.008, swellPivot: { x: CX, y: 950 }, turnPx: 16,
50
- layers: ['neck', 'skull', 'body', 'features', 'hair'],
51
- parallax: { neck: 1.0, skull: 1.0, body: 0.1, features: 1.22, hair: 1.12 },
52
- torsoLayers: ['body'], units: 1,
53
- };
54
-
55
- function mouthGeometry(p) {
56
- const cx = MOUTH.cx, cy = MOUTH.cy;
57
- const open = clamp(p.mouthOpen), round = clamp(p.mouthRound), tuck = clamp(p.mouthTuck);
58
- const w = (26 + clamp(p.mouthWidth) * 32) * (1 - 0.36 * round);
59
- const t = 1 - 0.4 * clamp(p.mouthPress);
60
- const profile = [2.5 * t, 10.5 * t, 3 * t, 11.5 * t * (1 + 0.35 * tuck), 2.5 * t];
61
- const halfUp = profile[1] / 2, halfLo = profile[3] / 2;
62
- const h = open * MOUTH_APERTURE, k = clamp(open / 0.18);
63
- const yL = cy - 1.5 - p.mouthCornerL * 24;
64
- const yR = cy - 1.5 - p.mouthCornerR * 24;
65
- const apTop = cy - h * 0.25;
66
- let apBot = cy + h * 0.75;
67
- if (tuck > 0) apBot = Math.max(apTop + 6, apBot - tuck * (h * 0.6 + 4));
68
- const cornerMid = (yL + yR) / 8;
69
- const topY = (apTop - k * halfUp - cornerMid) / 0.75;
70
- const botY = (apBot + k * halfLo - cornerMid) / 0.75;
71
- const contour = [
72
- [cx - w, yL], [cx - w * 0.55, topY], [cx + w * 0.55, topY], [cx + w, yR],
73
- [cx + w * 0.55, botY], [cx - w * 0.55, botY], [cx - w, yL],
74
- ];
75
- return {
76
- contour, profile, cx, w, open, tuck,
77
- innerTop: cornerMid + 0.75 * topY + halfUp,
78
- innerBot: cornerMid + 0.75 * botY - halfLo,
79
- };
80
- }
81
-
82
- function teethPath(m, amt, lower) {
83
- if (amt < 0.01) return '';
84
- const gap = m.innerBot - m.innerTop;
85
- if (gap < 2) return '';
86
- const tw = m.w * (lower ? 0.6 : 0.76);
87
- const cap = lower ? 0.5 : 0.5 + 0.35 * m.tuck;
88
- const th = Math.min(amt * (lower ? 13 : 20), gap * cap);
89
- if (lower) {
90
- const base = m.innerBot + 8, edge = m.innerBot - th, end = m.innerBot - th * 0.35;
91
- return `M${f(m.cx - tw)} ${f(base)}L${f(m.cx + tw)} ${f(base)}`
92
- + `L${f(m.cx + tw * 0.92)} ${f(end)}Q${f(m.cx)} ${f(2 * edge - end)} ${f(m.cx - tw * 0.92)} ${f(end)}Z`;
93
- }
94
- const top = m.innerTop - 8, edge = m.innerTop + th, end = m.innerTop + th * 0.35;
95
- return `M${f(m.cx - tw)} ${f(top)}L${f(m.cx + tw)} ${f(top)}`
96
- + `L${f(m.cx + tw * 0.92)} ${f(end)}Q${f(m.cx)} ${f(2 * edge - end)} ${f(m.cx - tw * 0.92)} ${f(end)}Z`;
97
- }
98
-
99
- function eyePath(cx, cy, lid, squint, tiltDeg) {
100
- const L = clamp(lid);
101
- const topY = lerp(cy - EYE.ry * 1.05, cy - EYE.ry * 0.42, L);
102
- const botY = lerp(cy + EYE.ry * 1.05, cy - EYE.ry * 0.05, L) - clamp(squint) * EYE.ry * 0.7;
103
- const a = (tiltDeg * Math.PI) / 180, ca = Math.cos(a), sa = Math.sin(a);
104
- const R = (x, y) => {
105
- const dx = x - cx, dy = y - cy;
106
- return `${f(cx + dx * ca - dy * sa)} ${f(cy + dx * sa + dy * ca)}`;
107
- };
108
- return `M${R(cx - EYE.rx, cy)}C${R(cx - EYE.rx * 0.5, topY)} ${R(cx + EYE.rx * 0.5, topY)} ${R(cx + EYE.rx, cy)}`
109
- + `C${R(cx + EYE.rx * 0.5, botY)} ${R(cx - EYE.rx * 0.5, botY)} ${R(cx - EYE.rx, cy)}Z`;
110
- }
111
-
112
- function browPath(pts, raise, angle, inner) {
113
- const n = pts.length - 1;
114
- return taper(pts.map(([x, y], i) => {
115
- const u = i / n;
116
- return [x, y - raise * 15 - inner * 11 * (1 - u) - angle * 12 * u];
117
- }), [3.5, 17, 8], 6);
118
- }
119
-
120
- function markup(id, t) {
121
- return `<svg id="${id}" viewBox="${VB.x} ${VB.y} ${VB.w} ${VB.h}" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid meet" style="display:block;width:100%;height:100%">
122
- <defs><clipPath id="${id}-clipMouth"><path id="${id}-clipMouthP" d=""/></clipPath></defs>
123
- <g id="${id}-neck"/>
124
- <g id="${id}-skull"/>
125
- <g id="${id}-body"/>
126
- <g id="${id}-features">
127
- <path id="${id}-browL" fill="${t.ink}"/><path id="${id}-browR" fill="${t.ink}"/>
128
- <g id="${id}-eyes"><path id="${id}-eyeL" fill="${t.ink}"/><path id="${id}-eyeR" fill="${t.ink}"/></g>
129
- <g id="${id}-mouth"><path id="${id}-mouthIn" fill="${t.mouthIn}"/>
130
- <g clip-path="url(#${id}-clipMouth)"><ellipse id="${id}-tongue" fill="${t.tongue}"/><path id="${id}-teeth" fill="${t.teeth}"/><path id="${id}-teethLo" fill="${t.teeth}" opacity=".85"/></g>
131
- <path id="${id}-lips" fill="${t.ink}"/></g>
132
- </g>
133
- <g id="${id}-hair"/>
134
- </svg>`;
135
- }
136
-
137
- let uid = 0;
138
- export function createFace(mount, theme = {}) {
139
- const t = Object.assign({}, THEME, theme);
140
- const id = `peepControlPlane${++uid}`;
141
- const { svg, $, set } = createFaceShell(mount, id, markup(id, t));
142
- const el = {
143
- neck: $('neck'), skull: $('skull'), body: $('body'), features: $('features'), hair: $('hair'),
144
- browL: $('browL'), browR: $('browR'), eyes: $('eyes'), eyeL: $('eyeL'), eyeR: $('eyeR'),
145
- mouthIn: $('mouthIn'), lips: $('lips'), clipMouth: $('clipMouthP'),
146
- teeth: $('teeth'), teethLo: $('teethLo'), tongue: $('tongue'),
147
- };
148
- function apply(p) {
149
- poseTransforms(p, set, el, POSE);
150
- set(el.eyes, 'transform', `translate(${f(p.pupilX * 11)} ${f(p.pupilY * 8)})`);
151
- const lidFollow = Math.max(0, p.pupilY) * 0.22;
152
- set(el.eyeL, 'd', eyePath(CX - EYE.dx, EYE.y + 1, p.lidL + lidFollow, p.squintL, -9));
153
- set(el.eyeR, 'd', eyePath(CX + EYE.dx, EYE.y - 1, p.lidR + lidFollow, p.squintR, 8));
154
- set(el.browL, 'd', browPath(BROW_L, p.browRaiseL, p.browAngleL, p.browInnerL));
155
- set(el.browR, 'd', browPath(BROW_R, p.browRaiseR, p.browAngleR, p.browInnerR));
156
- const m = mouthGeometry(p), contour = region(m.contour);
157
- set(el.mouthIn, 'd', contour); set(el.clipMouth, 'd', contour); set(el.lips, 'd', taperRing(m.contour, m.profile, 12));
158
- set(el.mouthIn, 'opacity', f(clamp((m.innerBot - m.innerTop) / 3)));
159
- pairedTeeth(p, set, el, teethPath, m);
160
- const tg = clamp(p.tongue);
161
- set(el.tongue, 'cx', f(m.cx)); set(el.tongue, 'cy', f(m.innerBot + 6 - tg * ((m.innerBot - m.innerTop) * 0.8 + 6)));
162
- set(el.tongue, 'rx', f(m.w * 0.58)); set(el.tongue, 'ry', '8'); set(el.tongue, 'opacity', tg > 0.02 ? '1' : '0');
163
- }
164
- return faceApi(mount, svg, apply, t);
165
- }
166
-
167
- export const peepControlPlane = { create: createFace, meta: META };
@@ -1,7 +0,0 @@
1
- import type { AvatarMeta, Face, FaceFactory } from "./avatar.js";
2
-
3
- export const createFace: FaceFactory;
4
- export const META: AvatarMeta;
5
- /** Default palette. Passed as `createAvatar({ theme })`; see authoring-a-face.md. */
6
- export const THEME: Readonly<Record<string, string>>;
7
- export const peep: Face;