@divinci-ai/robot-avatar 0.1.0
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/LICENSE +21 -0
- package/README.md +52 -0
- package/dist/blend.d.ts +8 -0
- package/dist/blend.d.ts.map +1 -0
- package/dist/blend.js +17 -0
- package/dist/blend.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/render-gate.d.ts +32 -0
- package/dist/render-gate.d.ts.map +1 -0
- package/dist/render-gate.js +72 -0
- package/dist/render-gate.js.map +1 -0
- package/dist/scene/AnimatedHeart.d.ts +18 -0
- package/dist/scene/AnimatedHeart.d.ts.map +1 -0
- package/dist/scene/AnimatedHeart.js +63 -0
- package/dist/scene/AnimatedHeart.js.map +1 -0
- package/dist/scene/LogoRobot.d.ts +24 -0
- package/dist/scene/LogoRobot.d.ts.map +1 -0
- package/dist/scene/LogoRobot.js +285 -0
- package/dist/scene/LogoRobot.js.map +1 -0
- package/dist/scene/RobotScene.d.ts +43 -0
- package/dist/scene/RobotScene.d.ts.map +1 -0
- package/dist/scene/RobotScene.js +43 -0
- package/dist/scene/RobotScene.js.map +1 -0
- package/dist/scene/index.d.ts +16 -0
- package/dist/scene/index.d.ts.map +1 -0
- package/dist/scene/index.js +15 -0
- package/dist/scene/index.js.map +1 -0
- package/dist/scene/useGroupMotion.d.ts +12 -0
- package/dist/scene/useGroupMotion.d.ts.map +1 -0
- package/dist/scene/useGroupMotion.js +47 -0
- package/dist/scene/useGroupMotion.js.map +1 -0
- package/dist/scene/useRobotSignals.d.ts +28 -0
- package/dist/scene/useRobotSignals.d.ts.map +1 -0
- package/dist/scene/useRobotSignals.js +101 -0
- package/dist/scene/useRobotSignals.js.map +1 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +46 -0
- package/src/blend.ts +16 -0
- package/src/index.ts +14 -0
- package/src/render-gate.ts +102 -0
- package/src/scene/AnimatedHeart.tsx +95 -0
- package/src/scene/LogoRobot.tsx +361 -0
- package/src/scene/RobotScene.tsx +102 -0
- package/src/scene/index.ts +16 -0
- package/src/scene/useGroupMotion.ts +61 -0
- package/src/scene/useRobotSignals.ts +126 -0
- package/src/types.ts +16 -0
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* LogoRobot — the Divinci mascot, hand-built in code and fully rigged.
|
|
4
|
+
*
|
|
5
|
+
* Structure mirrors the flat logo (open frame, NO torso):
|
|
6
|
+
* - rounded-corner head with two dark eyes + two ball-tipped antennae
|
|
7
|
+
* - two "4"-shaped arm/leg forms (mirrored): diagonal + crossbar + vertical
|
|
8
|
+
* stem, one sphere hand; a foot floats below each
|
|
9
|
+
* - the AnimatedHeart floating in the chest center
|
|
10
|
+
*
|
|
11
|
+
* Every part is rigged and animates independently off shared interaction
|
|
12
|
+
* signals (page-wide gaze, keystroke reactions, idle fidgets).
|
|
13
|
+
*/
|
|
14
|
+
import { useMemo, useRef } from "react";
|
|
15
|
+
import { useFrame } from "@react-three/fiber";
|
|
16
|
+
import * as THREE from "three";
|
|
17
|
+
import { useGroupMotion } from "./useGroupMotion.js";
|
|
18
|
+
import { useRobotSignals, BASE_BODY_YAW } from "./useRobotSignals.js";
|
|
19
|
+
import { AnimatedHeart } from "./AnimatedHeart.js";
|
|
20
|
+
const { damp } = THREE.MathUtils;
|
|
21
|
+
function roundedRectGeometry(w, h, depth, r) {
|
|
22
|
+
const s = new THREE.Shape();
|
|
23
|
+
const x = -w / 2;
|
|
24
|
+
const y = -h / 2;
|
|
25
|
+
s.moveTo(x, y);
|
|
26
|
+
s.lineTo(x + w, y);
|
|
27
|
+
s.lineTo(x + w, y + h - r);
|
|
28
|
+
s.quadraticCurveTo(x + w, y + h, x + w - r, y + h);
|
|
29
|
+
s.lineTo(x + r, y + h);
|
|
30
|
+
s.quadraticCurveTo(x, y + h, x, y + h - r);
|
|
31
|
+
s.lineTo(x, y);
|
|
32
|
+
const geo = new THREE.ExtrudeGeometry(s, {
|
|
33
|
+
depth,
|
|
34
|
+
bevelEnabled: true,
|
|
35
|
+
bevelThickness: 0.26,
|
|
36
|
+
bevelSize: 0.3,
|
|
37
|
+
bevelSegments: 10,
|
|
38
|
+
curveSegments: 24,
|
|
39
|
+
});
|
|
40
|
+
geo.center();
|
|
41
|
+
return geo;
|
|
42
|
+
}
|
|
43
|
+
function roundedAllGeometry(w, h, depth, r) {
|
|
44
|
+
const s = new THREE.Shape();
|
|
45
|
+
const x = -w / 2;
|
|
46
|
+
const y = -h / 2;
|
|
47
|
+
s.moveTo(x + r, y);
|
|
48
|
+
s.lineTo(x + w - r, y);
|
|
49
|
+
s.quadraticCurveTo(x + w, y, x + w, y + r);
|
|
50
|
+
s.lineTo(x + w, y + h - r);
|
|
51
|
+
s.quadraticCurveTo(x + w, y + h, x + w - r, y + h);
|
|
52
|
+
s.lineTo(x + r, y + h);
|
|
53
|
+
s.quadraticCurveTo(x, y + h, x, y + h - r);
|
|
54
|
+
s.lineTo(x, y + r);
|
|
55
|
+
s.quadraticCurveTo(x, y, x + r, y);
|
|
56
|
+
const geo = new THREE.ExtrudeGeometry(s, {
|
|
57
|
+
depth,
|
|
58
|
+
bevelEnabled: true,
|
|
59
|
+
bevelThickness: 0.02,
|
|
60
|
+
bevelSize: 0.02,
|
|
61
|
+
bevelSegments: 2,
|
|
62
|
+
curveSegments: 10,
|
|
63
|
+
});
|
|
64
|
+
geo.center();
|
|
65
|
+
return geo;
|
|
66
|
+
}
|
|
67
|
+
function footShapeGeometry(w, h, depth, r) {
|
|
68
|
+
const s = new THREE.Shape();
|
|
69
|
+
const x = -w / 2;
|
|
70
|
+
const y = -h / 2;
|
|
71
|
+
s.moveTo(x, y);
|
|
72
|
+
s.lineTo(x + w, y);
|
|
73
|
+
s.lineTo(x + w, y + h - r);
|
|
74
|
+
s.quadraticCurveTo(x + w, y + h, x + w - r, y + h);
|
|
75
|
+
s.lineTo(x, y + h);
|
|
76
|
+
s.lineTo(x, y);
|
|
77
|
+
const geo = new THREE.ExtrudeGeometry(s, {
|
|
78
|
+
depth,
|
|
79
|
+
bevelEnabled: true,
|
|
80
|
+
bevelThickness: 0.08,
|
|
81
|
+
bevelSize: 0.08,
|
|
82
|
+
bevelSegments: 4,
|
|
83
|
+
curveSegments: 14,
|
|
84
|
+
});
|
|
85
|
+
geo.center();
|
|
86
|
+
return geo;
|
|
87
|
+
}
|
|
88
|
+
function makeNoiseNormalMap() {
|
|
89
|
+
const size = 128;
|
|
90
|
+
const data = new Uint8Array(size * size * 4);
|
|
91
|
+
for (let i = 0; i < size * size; i++) {
|
|
92
|
+
data[i * 4] = 128 + Math.round((Math.random() * 2 - 1) * 14);
|
|
93
|
+
data[i * 4 + 1] = 128 + Math.round((Math.random() * 2 - 1) * 14);
|
|
94
|
+
data[i * 4 + 2] = 255;
|
|
95
|
+
data[i * 4 + 3] = 255;
|
|
96
|
+
}
|
|
97
|
+
const tex = new THREE.DataTexture(data, size, size);
|
|
98
|
+
tex.wrapS = THREE.RepeatWrapping;
|
|
99
|
+
tex.wrapT = THREE.RepeatWrapping;
|
|
100
|
+
tex.repeat.set(5, 5);
|
|
101
|
+
tex.needsUpdate = true;
|
|
102
|
+
return tex;
|
|
103
|
+
}
|
|
104
|
+
function taperedStemGeometry(topW, botW, h, depth) {
|
|
105
|
+
const ht = topW / 2;
|
|
106
|
+
const hb = botW / 2;
|
|
107
|
+
const top = h / 2;
|
|
108
|
+
const bot = -h / 2;
|
|
109
|
+
const hipHi = 0.0;
|
|
110
|
+
const hipLo = -0.16;
|
|
111
|
+
const s = new THREE.Shape();
|
|
112
|
+
s.moveTo(-hb, bot);
|
|
113
|
+
s.lineTo(hb, bot);
|
|
114
|
+
s.lineTo(hb, hipLo);
|
|
115
|
+
s.lineTo(ht, hipHi);
|
|
116
|
+
s.lineTo(ht, top);
|
|
117
|
+
s.lineTo(-ht, top);
|
|
118
|
+
s.lineTo(-ht, hipHi);
|
|
119
|
+
s.lineTo(-hb, hipLo);
|
|
120
|
+
s.closePath();
|
|
121
|
+
const geo = new THREE.ExtrudeGeometry(s, {
|
|
122
|
+
depth,
|
|
123
|
+
bevelEnabled: true,
|
|
124
|
+
bevelThickness: 0.05,
|
|
125
|
+
bevelSize: 0.05,
|
|
126
|
+
bevelSegments: 3,
|
|
127
|
+
curveSegments: 8,
|
|
128
|
+
});
|
|
129
|
+
geo.center();
|
|
130
|
+
return geo;
|
|
131
|
+
}
|
|
132
|
+
function handFilletGeometry(cx, cy, rIn, aStart, aEnd) {
|
|
133
|
+
const rOut = rIn + 0.08;
|
|
134
|
+
const s = new THREE.Shape();
|
|
135
|
+
s.moveTo(cx + Math.cos(aStart) * rOut, cy + Math.sin(aStart) * rOut);
|
|
136
|
+
for (let a = aStart; a <= aEnd; a += 0.1)
|
|
137
|
+
s.lineTo(cx + Math.cos(a) * rOut, cy + Math.sin(a) * rOut);
|
|
138
|
+
for (let a = aEnd; a >= aStart; a -= 0.1)
|
|
139
|
+
s.lineTo(cx + Math.cos(a) * rIn, cy + Math.sin(a) * rIn);
|
|
140
|
+
s.closePath();
|
|
141
|
+
const geo = new THREE.ExtrudeGeometry(s, {
|
|
142
|
+
depth: 0.36,
|
|
143
|
+
bevelEnabled: true,
|
|
144
|
+
bevelThickness: 0.02,
|
|
145
|
+
bevelSize: 0.02,
|
|
146
|
+
bevelSegments: 2,
|
|
147
|
+
curveSegments: 6,
|
|
148
|
+
});
|
|
149
|
+
geo.translate(0, 0, -0.18);
|
|
150
|
+
return geo;
|
|
151
|
+
}
|
|
152
|
+
function FourLimb({ side, material, sig }) {
|
|
153
|
+
const arm = useRef(null);
|
|
154
|
+
const foot = useRef(null);
|
|
155
|
+
const footGeo = useMemo(() => footShapeGeometry(0.42, 0.26, 0.6, 0.13), []);
|
|
156
|
+
const rightBarGeo = useMemo(() => taperedStemGeometry(0.23, 0.23, 0.96, 0.32), []);
|
|
157
|
+
const prongGeo = useMemo(() => taperedStemGeometry(0.2, 0.2, 0.46, 0.28), []);
|
|
158
|
+
const crossGeo = useMemo(() => roundedAllGeometry(0.68, 0.26, 0.32, 0.06), []);
|
|
159
|
+
const filletGeo = useMemo(() => handFilletGeometry(-0.115, -0.359, 0.18, -0.1, Math.PI / 2 + 0.15), []);
|
|
160
|
+
useFrame((_, delta) => {
|
|
161
|
+
const t = performance.now() / 1000;
|
|
162
|
+
const dt = Math.min(delta, 0.05);
|
|
163
|
+
const s = sig.current;
|
|
164
|
+
if (s.reduced) {
|
|
165
|
+
if (arm.current)
|
|
166
|
+
arm.current.rotation.z = damp(arm.current.rotation.z, 0, 9, dt);
|
|
167
|
+
if (foot.current) {
|
|
168
|
+
foot.current.position.y = -0.92;
|
|
169
|
+
foot.current.rotation.x = 0;
|
|
170
|
+
}
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const reacting = t < s.reactUntil;
|
|
174
|
+
const fidgeting = t < s.fidgetUntil;
|
|
175
|
+
const rs = s.reactSeed;
|
|
176
|
+
const fs = s.fidgetSeed;
|
|
177
|
+
const reactStyle = Math.floor(rs * 3);
|
|
178
|
+
const fidgetStyle = Math.floor(fs * 4);
|
|
179
|
+
if (arm.current) {
|
|
180
|
+
let target = Math.sin(t * 1.4 + side) * 0.05;
|
|
181
|
+
if (reacting) {
|
|
182
|
+
const w = reactStyle === 0 ? 1.3 : reactStyle === 1 ? 0.4 : 0.95;
|
|
183
|
+
target = Math.sin(t * (8 + rs * 5) + rs * 7 + side) * (0.3 + rs * 0.25) * w;
|
|
184
|
+
}
|
|
185
|
+
else if (fidgeting) {
|
|
186
|
+
const w = fidgetStyle === 3 ? 1 : 0.3;
|
|
187
|
+
target = Math.sin(t * (2.4 + fs * 2) + fs * 6 + side) * (0.12 + fs * 0.15) * w;
|
|
188
|
+
}
|
|
189
|
+
arm.current.rotation.z = damp(arm.current.rotation.z, target, 9, dt);
|
|
190
|
+
}
|
|
191
|
+
if (foot.current) {
|
|
192
|
+
const phase = side > 0 ? 0 : Math.PI;
|
|
193
|
+
let tap = 0;
|
|
194
|
+
if (reacting) {
|
|
195
|
+
const w = reactStyle === 1 ? 1.4 : reactStyle === 0 ? 0.4 : 0.95;
|
|
196
|
+
tap = Math.max(0, Math.sin(t * (9 + rs * 5) + phase + rs * 4)) * (0.1 + rs * 0.08) * w;
|
|
197
|
+
}
|
|
198
|
+
else if (fidgeting) {
|
|
199
|
+
const w = fidgetStyle === 2 ? 1 : 0.25;
|
|
200
|
+
tap = Math.max(0, Math.sin(t * (3.5 + fs * 2) + phase)) * (0.06 + fs * 0.05) * w;
|
|
201
|
+
}
|
|
202
|
+
foot.current.position.y = -0.92 + tap;
|
|
203
|
+
foot.current.rotation.x = -tap * 1.2;
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
return (_jsxs("group", { position: [side * 0.97, 0.05, 0], scale: [-side, 1, 1], children: [_jsx("group", { ref: arm, position: [0, 0.45, 0], children: _jsxs("group", { position: [0, -0.45, 0], children: [_jsx("mesh", { geometry: rightBarGeo, material: material, position: [0.21, -0.02, 0], castShadow: true }), _jsx("mesh", { geometry: crossGeo, material: material, position: [0.01, -0.05, 0], castShadow: true }), _jsx("mesh", { geometry: prongGeo, material: material, position: [-0.19, 0.23, 0], castShadow: true }), _jsx("mesh", { geometry: filletGeo, material: material, castShadow: true }), _jsx("mesh", { material: material, position: [-0.2, -0.48, 0], castShadow: true, children: _jsx("sphereGeometry", { args: [0.17, 20, 20] }) })] }) }), _jsx("mesh", { ref: foot, geometry: footGeo, material: material, position: [0.3, -0.92, 0.04], castShadow: true })] }));
|
|
207
|
+
}
|
|
208
|
+
function Antenna({ side, material, sig }) {
|
|
209
|
+
const grp = useRef(null);
|
|
210
|
+
useFrame(() => {
|
|
211
|
+
const t = performance.now() / 1000;
|
|
212
|
+
const s = sig.current;
|
|
213
|
+
if (s.reduced) {
|
|
214
|
+
if (grp.current)
|
|
215
|
+
grp.current.rotation.z = 0;
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const reacting = t < s.reactUntil;
|
|
219
|
+
const fidgeting = t < s.fidgetUntil;
|
|
220
|
+
if (grp.current) {
|
|
221
|
+
const amp = reacting
|
|
222
|
+
? 0.32 + s.reactSeed * 0.3
|
|
223
|
+
: fidgeting
|
|
224
|
+
? (Math.floor(s.fidgetSeed * 4) === 1 ? 0.3 : 0.12) + s.fidgetSeed * 0.08
|
|
225
|
+
: 0.13;
|
|
226
|
+
const spd = 2.2 + (reacting ? s.reactSeed * 3 : 0);
|
|
227
|
+
const phase = side + (reacting ? s.reactSeed * 6 : 0);
|
|
228
|
+
grp.current.rotation.z = Math.sin(t * spd + phase) * amp;
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
return (_jsxs("group", { ref: grp, position: [side * 0.82, 0.49, 0], children: [_jsx("mesh", { material: material, position: [0, 0.25, 0], children: _jsx("cylinderGeometry", { args: [0.045, 0.045, 0.5, 12] }) }), _jsx("mesh", { material: material, position: [0, 0.54, 0], children: _jsx("sphereGeometry", { args: [0.17, 18, 18] }) })] }));
|
|
232
|
+
}
|
|
233
|
+
export function LogoRobot({ state, colors, autoRotate = false, speakerTarget }) {
|
|
234
|
+
const sig = useRobotSignals(speakerTarget);
|
|
235
|
+
const root = useRef(null);
|
|
236
|
+
const head = useRef(null);
|
|
237
|
+
const eyeL = useRef(null);
|
|
238
|
+
const eyeR = useRef(null);
|
|
239
|
+
useGroupMotion(root, state, autoRotate, sig);
|
|
240
|
+
const headGeo = useMemo(() => roundedRectGeometry(1.28, 0.71, 0.64, 0.34), []);
|
|
241
|
+
const eyeGeo = useMemo(() => roundedAllGeometry(0.19, 0.3, 0.08, 0.06), []);
|
|
242
|
+
const normalMap = useMemo(makeNoiseNormalMap, []);
|
|
243
|
+
const bodyMaterial = useMemo(() => new THREE.MeshStandardMaterial({
|
|
244
|
+
color: colors.body,
|
|
245
|
+
roughness: 0.34,
|
|
246
|
+
metalness: 0.06,
|
|
247
|
+
normalMap,
|
|
248
|
+
normalScale: new THREE.Vector2(0.12, 0.12),
|
|
249
|
+
envMapIntensity: 0.85,
|
|
250
|
+
}), [colors.body, normalMap]);
|
|
251
|
+
useFrame((_, delta) => {
|
|
252
|
+
const t = performance.now() / 1000;
|
|
253
|
+
const dt = Math.min(delta, 0.05);
|
|
254
|
+
const s = sig.current;
|
|
255
|
+
const reduced = s.reduced;
|
|
256
|
+
const thinking = !reduced && state === "thinking";
|
|
257
|
+
const fidgeting = !reduced && t < s.fidgetUntil;
|
|
258
|
+
if (head.current) {
|
|
259
|
+
const nod = thinking ? Math.sin(t * 5) * 0.07 : 0;
|
|
260
|
+
const glance = fidgeting && Math.floor(s.fidgetSeed * 4) === 0
|
|
261
|
+
? (s.fidgetSeed - 0.5) * 0.2 * Math.sin(t * 1.4)
|
|
262
|
+
: 0;
|
|
263
|
+
const gaze = Math.max(-0.6, Math.min(0.6, s.lookX)) * 0.34;
|
|
264
|
+
head.current.rotation.y = damp(head.current.rotation.y, -BASE_BODY_YAW + gaze + glance, 6, dt);
|
|
265
|
+
head.current.rotation.x = damp(head.current.rotation.x, 0.09 - s.lookY * 0.24 + nod, 6, dt);
|
|
266
|
+
}
|
|
267
|
+
// Keep the eyes open (no blink) under reduced motion; gaze dart still tracks.
|
|
268
|
+
const bt = t % 3.6;
|
|
269
|
+
const blink = reduced || bt >= 0.13 ? 1 : 1 - Math.sin((bt / 0.13) * Math.PI) * 0.92;
|
|
270
|
+
const dartX = s.lookX * 0.045;
|
|
271
|
+
const dartY = -s.lookY * 0.03;
|
|
272
|
+
if (eyeL.current) {
|
|
273
|
+
eyeL.current.position.x = -0.27 + dartX;
|
|
274
|
+
eyeL.current.position.y = dartY;
|
|
275
|
+
eyeL.current.scale.y = blink;
|
|
276
|
+
}
|
|
277
|
+
if (eyeR.current) {
|
|
278
|
+
eyeR.current.position.x = 0.27 + dartX;
|
|
279
|
+
eyeR.current.position.y = dartY;
|
|
280
|
+
eyeR.current.scale.y = blink;
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
return (_jsx("group", { ref: root, children: _jsxs("group", { scale: 0.92, position: [0, -0.78, 0], children: [_jsxs("group", { ref: head, position: [0, 1.37, 0], scale: 0.85, children: [_jsx("mesh", { geometry: headGeo, material: bodyMaterial, castShadow: true }), _jsx("mesh", { ref: eyeL, geometry: eyeGeo, position: [-0.27, 0.0, 0.7], children: _jsx("meshStandardMaterial", { color: colors.eye, roughness: 0.25, metalness: 0.2 }) }), _jsx("mesh", { ref: eyeR, geometry: eyeGeo, position: [0.27, 0.0, 0.7], children: _jsx("meshStandardMaterial", { color: colors.eye, roughness: 0.25, metalness: 0.2 }) }), _jsx(Antenna, { side: -1, material: bodyMaterial, sig: sig }), _jsx(Antenna, { side: 1, material: bodyMaterial, sig: sig })] }), _jsx(FourLimb, { side: -1, material: bodyMaterial, sig: sig }), _jsx(FourLimb, { side: 1, material: bodyMaterial, sig: sig }), _jsx(AnimatedHeart, { position: [0, -0.06, 0.2], scale: 0.45, stretchY: 1.18, sig: sig })] }) }));
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=LogoRobot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogoRobot.js","sourceRoot":"","sources":["../../src/scene/LogoRobot.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RobotScene — the shared, hardened WebGL scene for the Divinci robot.
|
|
3
|
+
*
|
|
4
|
+
* Everything importing `three` / `@react-three/*` lives under ./scene so
|
|
5
|
+
* consumers can code-split it (lazy import of "@divinci-ai/robot-avatar/scene").
|
|
6
|
+
*
|
|
7
|
+
* Hardening (applies to every surface — docs hero, web app, agent panel,
|
|
8
|
+
* extension iframe):
|
|
9
|
+
* - `powerPreference: "low-power"`: a mascot never needs the discrete GPU;
|
|
10
|
+
* the default can spin up the dGPU on dual-GPU laptops.
|
|
11
|
+
* - `failIfMajorPerformanceCaveat: true`: on software WebGL (VMs, locked-down
|
|
12
|
+
* Chrome) context creation fails instead of burning CPU in SwiftShader —
|
|
13
|
+
* the consumer's error/fallback path takes over.
|
|
14
|
+
* - `paused` → frameloop "never": render loop stops while off-screen / tab
|
|
15
|
+
* hidden / idle (pair with useRenderGate from the light entry).
|
|
16
|
+
* - `onContextLost`: `webglcontextlost` does NOT throw through React, so an
|
|
17
|
+
* error boundary never sees it — this callback lets the consumer swap to
|
|
18
|
+
* its static fallback instead of showing a frozen canvas.
|
|
19
|
+
* - dpr capped at 1.5 by default: the robot renders small; the top retina
|
|
20
|
+
* tier is wasted fill.
|
|
21
|
+
*/
|
|
22
|
+
import React from "react";
|
|
23
|
+
import type { AvatarState, RobotAvatarColors } from "../types.js";
|
|
24
|
+
import type { SpeakerTarget } from "./useRobotSignals.js";
|
|
25
|
+
export interface RobotSceneProps {
|
|
26
|
+
state: AvatarState;
|
|
27
|
+
colors: RobotAvatarColors;
|
|
28
|
+
/** When true, R3F stops its render loop (pair with useRenderGate). */
|
|
29
|
+
paused?: boolean;
|
|
30
|
+
/** Slowly auto-rotate so all sides are visible (preview / showcase use). */
|
|
31
|
+
autoRotate?: boolean;
|
|
32
|
+
/** Device-pixel-ratio clamp. Defaults to [1, 1.5]. */
|
|
33
|
+
dpr?: [number, number];
|
|
34
|
+
/** Notified once if the WebGL context is lost (GPU reset, context pressure). */
|
|
35
|
+
onContextLost?: () => void;
|
|
36
|
+
/**
|
|
37
|
+
* Optional extra gaze target (screen-normalized -1..1) the robot looks at
|
|
38
|
+
* when the cursor is still — e.g. the docs hero's "who's speaking" emoji.
|
|
39
|
+
*/
|
|
40
|
+
speakerTarget?: SpeakerTarget;
|
|
41
|
+
}
|
|
42
|
+
export declare function RobotScene({ state, colors, paused, autoRotate, dpr, onContextLost, speakerTarget, }: RobotSceneProps): React.ReactElement;
|
|
43
|
+
//# sourceMappingURL=RobotScene.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RobotScene.d.ts","sourceRoot":"","sources":["../../src/scene/RobotScene.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAsB,MAAM,OAAO,CAAC;AAI3C,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,sEAAsE;IACtE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sDAAsD;IACtD,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvB,gFAAgF;IAChF,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B;;;OAGG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,MAAM,EACN,MAAc,EACd,UAAkB,EAClB,GAAc,EACd,aAAa,EACb,aAAa,GACd,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CA8CtC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* RobotScene — the shared, hardened WebGL scene for the Divinci robot.
|
|
4
|
+
*
|
|
5
|
+
* Everything importing `three` / `@react-three/*` lives under ./scene so
|
|
6
|
+
* consumers can code-split it (lazy import of "@divinci-ai/robot-avatar/scene").
|
|
7
|
+
*
|
|
8
|
+
* Hardening (applies to every surface — docs hero, web app, agent panel,
|
|
9
|
+
* extension iframe):
|
|
10
|
+
* - `powerPreference: "low-power"`: a mascot never needs the discrete GPU;
|
|
11
|
+
* the default can spin up the dGPU on dual-GPU laptops.
|
|
12
|
+
* - `failIfMajorPerformanceCaveat: true`: on software WebGL (VMs, locked-down
|
|
13
|
+
* Chrome) context creation fails instead of burning CPU in SwiftShader —
|
|
14
|
+
* the consumer's error/fallback path takes over.
|
|
15
|
+
* - `paused` → frameloop "never": render loop stops while off-screen / tab
|
|
16
|
+
* hidden / idle (pair with useRenderGate from the light entry).
|
|
17
|
+
* - `onContextLost`: `webglcontextlost` does NOT throw through React, so an
|
|
18
|
+
* error boundary never sees it — this callback lets the consumer swap to
|
|
19
|
+
* its static fallback instead of showing a frozen canvas.
|
|
20
|
+
* - dpr capped at 1.5 by default: the robot renders small; the top retina
|
|
21
|
+
* tier is wasted fill.
|
|
22
|
+
*/
|
|
23
|
+
import { useCallback } from "react";
|
|
24
|
+
import { Canvas } from "@react-three/fiber";
|
|
25
|
+
import { Environment, Lightformer } from "@react-three/drei";
|
|
26
|
+
import { LogoRobot } from "./LogoRobot.js";
|
|
27
|
+
export function RobotScene({ state, colors, paused = false, autoRotate = false, dpr = [1, 1.5], onContextLost, speakerTarget, }) {
|
|
28
|
+
const handleCreated = useCallback(({ gl }) => {
|
|
29
|
+
if (!onContextLost)
|
|
30
|
+
return;
|
|
31
|
+
gl.domElement.addEventListener("webglcontextlost", (e) => {
|
|
32
|
+
e.preventDefault(); // allow restoration attempts, but tell the consumer now
|
|
33
|
+
onContextLost();
|
|
34
|
+
}, { once: true });
|
|
35
|
+
}, [onContextLost]);
|
|
36
|
+
return (_jsxs(Canvas, { camera: { position: [0, 0, 6.4], fov: 34 }, dpr: dpr, frameloop: paused ? "never" : "always", gl: {
|
|
37
|
+
antialias: true,
|
|
38
|
+
alpha: true,
|
|
39
|
+
powerPreference: "low-power",
|
|
40
|
+
failIfMajorPerformanceCaveat: true,
|
|
41
|
+
}, onCreated: handleCreated, style: { width: "100%", height: "100%" }, children: [_jsx("ambientLight", { intensity: 0.55 }), _jsx("directionalLight", { position: [3, 5, 4], intensity: 0.9 }), _jsx("directionalLight", { position: [-4, 2, -3], intensity: 0.35, color: colors.trim }), _jsxs(Environment, { resolution: 64, frames: 1, children: [_jsx(Lightformer, { intensity: 2.2, position: [0, 2.5, 3], scale: [6, 6, 1] }), _jsx(Lightformer, { intensity: 0.9, position: [-3, 1, 2], scale: [3, 4, 1], color: colors.trim }), _jsx(Lightformer, { intensity: 0.7, position: [3, -1.5, 2], scale: [3, 3, 1] })] }), _jsx(LogoRobot, { state: state, colors: colors, autoRotate: autoRotate, speakerTarget: speakerTarget })] }));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=RobotScene.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RobotScene.js","sourceRoot":"","sources":["../../src/scene/RobotScene.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAc,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAsB3C,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,MAAM,EACN,MAAM,GAAG,KAAK,EACd,UAAU,GAAG,KAAK,EAClB,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,EACd,aAAa,EACb,aAAa,GACG;IAChB,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,EAAE,EAAE,EAA6C,EAAE,EAAE;QACpD,IAAI,CAAC,aAAa;YAAE,OAAO;QAC3B,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAC5B,kBAAkB,EAClB,CAAC,CAAQ,EAAE,EAAE;YACX,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,wDAAwD;YAC5E,aAAa,EAAE,CAAC;QAClB,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;IACJ,CAAC,EACD,CAAC,aAAa,CAAC,CAChB,CAAC;IAEF,OAAO,CACL,MAAC,MAAM,IACL,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAC1C,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EACtC,EAAE,EAAE;YACF,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;YACX,eAAe,EAAE,WAAW;YAC5B,4BAA4B,EAAE,IAAI;SACnC,EACD,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAGxC,uBAAc,SAAS,EAAE,IAAI,GAAI,EACjC,2BAAkB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,GAAI,EACzD,2BAAkB,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,GAAI,EAIhF,MAAC,WAAW,IAAC,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,aACpC,KAAC,WAAW,IAAC,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAI,EACxE,KAAC,WAAW,IAAC,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,GAAI,EAC3F,KAAC,WAAW,IAAC,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAI,IAC7D,EAEd,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,GAAI,IAC1F,CACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @divinci-ai/robot-avatar/scene — the heavy WebGL entry (three.js et al).
|
|
3
|
+
*
|
|
4
|
+
* Lazy-import this from consumers so three.js stays out of the main bundle:
|
|
5
|
+
*
|
|
6
|
+
* const RobotScene = lazy(() =>
|
|
7
|
+
* import("@divinci-ai/robot-avatar/scene").then((m) => ({ default: m.RobotScene }))
|
|
8
|
+
* );
|
|
9
|
+
*/
|
|
10
|
+
export { RobotScene, type RobotSceneProps } from "./RobotScene.js";
|
|
11
|
+
export { LogoRobot, type LogoRobotProps } from "./LogoRobot.js";
|
|
12
|
+
export { AnimatedHeart } from "./AnimatedHeart.js";
|
|
13
|
+
export { useRobotSignals, BASE_BODY_YAW, type RobotSignals, type SpeakerTarget } from "./useRobotSignals.js";
|
|
14
|
+
export { useGroupMotion } from "./useGroupMotion.js";
|
|
15
|
+
export type { AvatarState, RobotAvatarColors } from "../types.js";
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scene/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @divinci-ai/robot-avatar/scene — the heavy WebGL entry (three.js et al).
|
|
3
|
+
*
|
|
4
|
+
* Lazy-import this from consumers so three.js stays out of the main bundle:
|
|
5
|
+
*
|
|
6
|
+
* const RobotScene = lazy(() =>
|
|
7
|
+
* import("@divinci-ai/robot-avatar/scene").then((m) => ({ default: m.RobotScene }))
|
|
8
|
+
* );
|
|
9
|
+
*/
|
|
10
|
+
export { RobotScene } from "./RobotScene.js";
|
|
11
|
+
export { LogoRobot } from "./LogoRobot.js";
|
|
12
|
+
export { AnimatedHeart } from "./AnimatedHeart.js";
|
|
13
|
+
export { useRobotSignals, BASE_BODY_YAW } from "./useRobotSignals.js";
|
|
14
|
+
export { useGroupMotion } from "./useGroupMotion.js";
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scene/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAwB,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAyC,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Root-group motion for the robot: gentle bob, a light body-lean toward the
|
|
3
|
+
* page pointer (the head leads the actual gaze), and springy reactions to
|
|
4
|
+
* keystrokes / idle fidgets. Per-part motion (head, eyes, antennae, arms,
|
|
5
|
+
* feet, heart) is layered on top by the individual parts.
|
|
6
|
+
*/
|
|
7
|
+
import * as THREE from "three";
|
|
8
|
+
import type { RefObject, MutableRefObject } from "react";
|
|
9
|
+
import type { AvatarState } from "../types.js";
|
|
10
|
+
import { type RobotSignals } from "./useRobotSignals.js";
|
|
11
|
+
export declare function useGroupMotion(ref: RefObject<THREE.Object3D | null>, state: AvatarState, autoRotate: boolean, sig: MutableRefObject<RobotSignals>): void;
|
|
12
|
+
//# sourceMappingURL=useGroupMotion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGroupMotion.d.ts","sourceRoot":"","sources":["../../src/scene/useGroupMotion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIxE,wBAAgB,cAAc,CAC5B,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,EACrC,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,OAAO,EACnB,GAAG,EAAE,gBAAgB,CAAC,YAAY,CAAC,GAClC,IAAI,CAwCN"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Root-group motion for the robot: gentle bob, a light body-lean toward the
|
|
3
|
+
* page pointer (the head leads the actual gaze), and springy reactions to
|
|
4
|
+
* keystrokes / idle fidgets. Per-part motion (head, eyes, antennae, arms,
|
|
5
|
+
* feet, heart) is layered on top by the individual parts.
|
|
6
|
+
*/
|
|
7
|
+
import { useFrame } from "@react-three/fiber";
|
|
8
|
+
import * as THREE from "three";
|
|
9
|
+
import { BASE_BODY_YAW } from "./useRobotSignals.js";
|
|
10
|
+
const { damp } = THREE.MathUtils;
|
|
11
|
+
export function useGroupMotion(ref, state, autoRotate, sig) {
|
|
12
|
+
useFrame((_, delta) => {
|
|
13
|
+
const g = ref.current;
|
|
14
|
+
if (!g)
|
|
15
|
+
return;
|
|
16
|
+
const t = performance.now() / 1000;
|
|
17
|
+
const dt = Math.min(delta, 0.05);
|
|
18
|
+
const s = sig.current;
|
|
19
|
+
// Reduced motion: settle to a still rest pose, keeping only the gentle
|
|
20
|
+
// gaze lean (cursor-/speaker-driven, not autonomous animation).
|
|
21
|
+
if (s.reduced) {
|
|
22
|
+
g.position.y = damp(g.position.y, 0, 7, dt);
|
|
23
|
+
g.scale.setScalar(damp(g.scale.x, 1, 7, dt));
|
|
24
|
+
g.rotation.z = damp(g.rotation.z, 0, 6, dt);
|
|
25
|
+
g.rotation.y = damp(g.rotation.y, BASE_BODY_YAW + s.lookX * 0.1, 5, dt);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const thinking = state === "thinking";
|
|
29
|
+
const happy = state === "happy";
|
|
30
|
+
const reacting = t < s.reactUntil;
|
|
31
|
+
const fidgeting = t < s.fidgetUntil;
|
|
32
|
+
const bobSpeed = thinking ? 4.2 : reacting ? 9 : 1.6;
|
|
33
|
+
const bobAmp = happy ? 0.1 : reacting ? 0.13 : fidgeting ? 0.07 : 0.035;
|
|
34
|
+
g.position.y = Math.sin(t * bobSpeed) * bobAmp;
|
|
35
|
+
const targetScale = happy || reacting ? 1 + Math.abs(Math.sin(t * 8)) * 0.05 : 1;
|
|
36
|
+
g.scale.setScalar(damp(g.scale.x, targetScale, 7, dt));
|
|
37
|
+
if (autoRotate) {
|
|
38
|
+
g.rotation.y += dt * 0.6;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
g.rotation.y = damp(g.rotation.y, BASE_BODY_YAW + s.lookX * 0.1, 5, dt);
|
|
42
|
+
}
|
|
43
|
+
const tilt = reacting ? Math.sin(t * 9) * 0.12 : fidgeting ? Math.sin(t * 2.5) * 0.06 : 0;
|
|
44
|
+
g.rotation.z = damp(g.rotation.z, tilt, 6, dt);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=useGroupMotion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGroupMotion.js","sourceRoot":"","sources":["../../src/scene/useGroupMotion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared interaction signals for the rigged robot. One window-listener setup,
|
|
3
|
+
* one mutable ref every body part reads from. Provides:
|
|
4
|
+
* - lookX/lookY: where his attention should go — the cursor when it's moving,
|
|
5
|
+
* the focused input when you're typing, otherwise the user (screen center).
|
|
6
|
+
* - keystroke reactions + idle fidgets, each with a fresh random seed/style so
|
|
7
|
+
* the motion never loops identically.
|
|
8
|
+
*/
|
|
9
|
+
import type { MutableRefObject } from "react";
|
|
10
|
+
export declare const BASE_BODY_YAW = 0.08;
|
|
11
|
+
/**
|
|
12
|
+
* Optional extra gaze target, screen-normalized to -1..1. Returns null when
|
|
13
|
+
* nobody is "speaking". The docs hero injects one that tracks the orbiting
|
|
14
|
+
* conversation satellites; other surfaces leave it unset.
|
|
15
|
+
*/
|
|
16
|
+
export type SpeakerTarget = () => [number, number] | null;
|
|
17
|
+
export interface RobotSignals {
|
|
18
|
+
lookX: number;
|
|
19
|
+
lookY: number;
|
|
20
|
+
reactUntil: number;
|
|
21
|
+
reactSeed: number;
|
|
22
|
+
fidgetUntil: number;
|
|
23
|
+
fidgetSeed: number;
|
|
24
|
+
/** Honor the OS "reduce motion" setting — freezes autonomous idle motion. */
|
|
25
|
+
reduced: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare function useRobotSignals(speakerTarget?: SpeakerTarget): MutableRefObject<RobotSignals>;
|
|
28
|
+
//# sourceMappingURL=useRobotSignals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRobotSignals.d.ts","sourceRoot":"","sources":["../../src/scene/useRobotSignals.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAE9C,eAAO,MAAM,aAAa,OAAO,CAAC;AAElC;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,eAAe,CAAC,aAAa,CAAC,EAAE,aAAa,GAAG,gBAAgB,CAAC,YAAY,CAAC,CA4F7F"}
|