@memori.ai/memori-react 7.19.1 → 7.21.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/CHANGELOG.md +57 -0
- package/dist/components/Avatar/Avatar.js +3 -3
- package/dist/components/Avatar/Avatar.js.map +1 -1
- package/dist/components/Avatar/AvatarView/AvatarComponent/Shadow/DynamicShadow.d.ts +3 -2
- package/dist/components/Avatar/AvatarView/AvatarComponent/Shadow/DynamicShadow.js +13 -6
- package/dist/components/Avatar/AvatarView/AvatarComponent/Shadow/DynamicShadow.js.map +1 -1
- package/dist/components/Avatar/AvatarView/AvatarComponent/avatarComponent.d.ts +14 -18
- package/dist/components/Avatar/AvatarView/AvatarComponent/avatarComponent.js +19 -77
- package/dist/components/Avatar/AvatarView/AvatarComponent/avatarComponent.js.map +1 -1
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.d.ts +17 -2
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js +95 -70
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js.map +1 -1
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarAnimator.d.ts +65 -0
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarAnimator.js +747 -0
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarAnimator.js.map +1 -0
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.d.ts +9 -2
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js +60 -2
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js.map +1 -1
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.d.ts +3 -4
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.js +5 -11
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.js.map +1 -1
- package/dist/components/Avatar/AvatarView/AvatarComponent/constants.d.ts +13 -52
- package/dist/components/Avatar/AvatarView/AvatarComponent/constants.js +68 -70
- package/dist/components/Avatar/AvatarView/AvatarComponent/constants.js.map +1 -1
- package/dist/components/Avatar/AvatarView/index.d.ts +1 -1
- package/dist/components/Avatar/AvatarView/index.js +2 -2
- package/dist/components/Avatar/AvatarView/index.js.map +1 -1
- package/dist/components/Chat/Chat.js +2 -2
- package/dist/components/Chat/Chat.js.map +1 -1
- package/dist/components/ChatBubble/ChatBubble.js +12 -9
- package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
- package/dist/components/ExpertsDrawer/ExpertsDrawer.js +1 -1
- package/dist/components/ExpertsDrawer/ExpertsDrawer.js.map +1 -1
- package/dist/components/LoginDrawer/LoginDrawer.js +6 -6
- package/dist/components/LoginDrawer/LoginDrawer.js.map +1 -1
- package/dist/components/MemoriWidget/MemoriWidget.js +143 -64
- package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
- package/dist/components/SignupForm/SignupForm.js +4 -4
- package/dist/components/SignupForm/SignupForm.js.map +1 -1
- package/dist/components/StartPanel/StartPanel.js +5 -5
- package/dist/components/StartPanel/StartPanel.js.map +1 -1
- package/dist/components/UploadButton/UploadButton.js +2 -2
- package/dist/components/UploadButton/UploadButton.js.map +1 -1
- package/dist/components/WhyThisAnswer/WhyThisAnswer.css +43 -0
- package/dist/components/WhyThisAnswer/WhyThisAnswer.js +2 -1
- package/dist/components/WhyThisAnswer/WhyThisAnswer.js.map +1 -1
- package/dist/context/visemeContext.js +0 -39
- package/dist/context/visemeContext.js.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/locales/de.json +1 -0
- package/dist/locales/en.json +1 -0
- package/dist/locales/es.json +1 -0
- package/dist/locales/fr.json +1 -0
- package/dist/locales/it.json +1 -0
- package/esm/components/Avatar/Avatar.js +3 -3
- package/esm/components/Avatar/Avatar.js.map +1 -1
- package/esm/components/Avatar/AvatarView/AvatarComponent/Shadow/DynamicShadow.d.ts +3 -2
- package/esm/components/Avatar/AvatarView/AvatarComponent/Shadow/DynamicShadow.js +13 -6
- package/esm/components/Avatar/AvatarView/AvatarComponent/Shadow/DynamicShadow.js.map +1 -1
- package/esm/components/Avatar/AvatarView/AvatarComponent/avatarComponent.d.ts +14 -18
- package/esm/components/Avatar/AvatarView/AvatarComponent/avatarComponent.js +20 -78
- package/esm/components/Avatar/AvatarView/AvatarComponent/avatarComponent.js.map +1 -1
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.d.ts +17 -2
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js +99 -74
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js.map +1 -1
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarAnimator.d.ts +65 -0
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarAnimator.js +743 -0
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarAnimator.js.map +1 -0
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.d.ts +9 -2
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js +61 -3
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.js.map +1 -1
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.d.ts +3 -4
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.js +5 -11
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.js.map +1 -1
- package/esm/components/Avatar/AvatarView/AvatarComponent/constants.d.ts +13 -52
- package/esm/components/Avatar/AvatarView/AvatarComponent/constants.js +67 -69
- package/esm/components/Avatar/AvatarView/AvatarComponent/constants.js.map +1 -1
- package/esm/components/Avatar/AvatarView/index.d.ts +1 -1
- package/esm/components/Avatar/AvatarView/index.js +2 -2
- package/esm/components/Avatar/AvatarView/index.js.map +1 -1
- package/esm/components/Chat/Chat.js +2 -2
- package/esm/components/Chat/Chat.js.map +1 -1
- package/esm/components/ChatBubble/ChatBubble.js +12 -9
- package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
- package/esm/components/ExpertsDrawer/ExpertsDrawer.js +1 -1
- package/esm/components/ExpertsDrawer/ExpertsDrawer.js.map +1 -1
- package/esm/components/LoginDrawer/LoginDrawer.js +6 -6
- package/esm/components/LoginDrawer/LoginDrawer.js.map +1 -1
- package/esm/components/MemoriWidget/MemoriWidget.js +143 -64
- package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
- package/esm/components/SignupForm/SignupForm.js +4 -4
- package/esm/components/SignupForm/SignupForm.js.map +1 -1
- package/esm/components/StartPanel/StartPanel.js +5 -5
- package/esm/components/StartPanel/StartPanel.js.map +1 -1
- package/esm/components/UploadButton/UploadButton.js +2 -2
- package/esm/components/UploadButton/UploadButton.js.map +1 -1
- package/esm/components/WhyThisAnswer/WhyThisAnswer.css +43 -0
- package/esm/components/WhyThisAnswer/WhyThisAnswer.js +2 -1
- package/esm/components/WhyThisAnswer/WhyThisAnswer.js.map +1 -1
- package/esm/context/visemeContext.js +0 -39
- package/esm/context/visemeContext.js.map +1 -1
- package/esm/index.js +4 -3
- package/esm/index.js.map +1 -1
- package/esm/locales/de.json +1 -0
- package/esm/locales/en.json +1 -0
- package/esm/locales/es.json +1 -0
- package/esm/locales/fr.json +1 -0
- package/esm/locales/it.json +1 -0
- package/package.json +2 -2
- package/src/components/Avatar/Avatar.tsx +3 -3
- package/src/components/Avatar/AvatarView/AvatarComponent/Shadow/DynamicShadow.tsx +15 -8
- package/src/components/Avatar/AvatarView/AvatarComponent/avatarComponent.tsx +64 -219
- package/src/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.tsx +221 -124
- package/src/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarAnimator.ts +1250 -0
- package/src/components/Avatar/AvatarView/AvatarComponent/components/controllers/MorphTargetController.ts +164 -8
- package/src/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.tsx +19 -17
- package/src/components/Avatar/AvatarView/AvatarComponent/constants.ts +80 -79
- package/src/components/Avatar/AvatarView/index.tsx +1 -7
- package/src/components/Chat/Chat.tsx +2 -2
- package/src/components/ChatBubble/ChatBubble.tsx +37 -26
- package/src/components/ExpertsDrawer/ExpertsDrawer.tsx +1 -1
- package/src/components/LoginDrawer/LoginDrawer.tsx +6 -6
- package/src/components/MemoriWidget/MemoriWidget.tsx +184 -78
- package/src/components/SignupForm/SignupForm.tsx +5 -5
- package/src/components/StartPanel/StartPanel.tsx +5 -5
- package/src/components/UploadButton/UploadButton.tsx +4 -4
- package/src/components/UploadButton/__snapshots__/UploadButton.test.tsx.snap +1 -1
- package/src/components/WhyThisAnswer/WhyThisAnswer.css +43 -0
- package/src/components/WhyThisAnswer/WhyThisAnswer.stories.tsx +44 -3
- package/src/components/WhyThisAnswer/WhyThisAnswer.test.tsx +128 -8
- package/src/components/WhyThisAnswer/WhyThisAnswer.tsx +28 -3
- package/src/components/WhyThisAnswer/__snapshots__/WhyThisAnswer.test.tsx.snap +15 -1
- package/src/components/layouts/layouts.stories.tsx +0 -8
- package/src/context/visemeContext.tsx +40 -41
- package/src/index.stories.tsx +63 -65
- package/src/index.tsx +5 -3
- package/src/locales/de.json +1 -0
- package/src/locales/en.json +1 -0
- package/src/locales/es.json +1 -0
- package/src/locales/fr.json +1 -0
- package/src/locales/it.json +1 -0
- package/src/mocks/data.ts +3 -9
- package/src/components/Avatar/AvatarView/AvatarComponent/components/controllers/AnimationController.ts +0 -308
- package/src/helpers/tenant.ts +0 -47
|
@@ -1,94 +1,36 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
import AnimationControlPanel from './components/controls';
|
|
2
|
+
import { useRef, useEffect, useCallback, memo } from 'react';
|
|
4
3
|
import { FullbodyAvatar } from './components/FullbodyAvatar/fullbodyAvatar';
|
|
5
4
|
import HalfBodyAvatar from './components/halfbodyAvatar';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const [emotionMorphTargets, setEmotionMorphTargets] = useState({});
|
|
15
|
-
const [isRPM, setIsRPM] = useState(false);
|
|
16
|
-
const [timeScale, setTimeScale] = useState(0.8);
|
|
17
|
-
const emotionMap = {
|
|
18
|
-
Joy: { Joy: 1 },
|
|
19
|
-
Anger: { Anger: 1 },
|
|
20
|
-
Surprise: { Surprise: 1 },
|
|
21
|
-
Sadness: { Sadness: 1 },
|
|
22
|
-
Fear: { Fear: 1 },
|
|
23
|
-
};
|
|
24
|
-
const getDefaultEmotions = () => Object.keys(emotionMap).reduce((acc, key) => ({ ...acc, [key]: 0 }), {});
|
|
25
|
-
const handleRPMBlendShape = useCallback((outputContent) => MAPPING_BLEND_SHAPE_TO_EMOTION_RPM[outputContent], []);
|
|
26
|
-
const handleCustomGLBBlendShape = useCallback((outputContent) => MAPPING_BLEND_SHAPE_TO_EMOTION_CUSTOM_GLB[outputContent], []);
|
|
27
|
-
const setEmotionMorphTargetInfluences = useCallback((action, outputContent) => {
|
|
28
|
-
if (action.startsWith('Loading'))
|
|
29
|
-
return;
|
|
30
|
-
const defaultEmotions = getDefaultEmotions();
|
|
31
|
-
if (outputContent === 'default') {
|
|
32
|
-
setEmotionMorphTargets(defaultEmotions);
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
if (isRPM) {
|
|
36
|
-
const emotion = handleRPMBlendShape(outputContent);
|
|
37
|
-
setEmotionMorphTargets(_ => ({ ...defaultEmotions, ...emotion }));
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
const emotion = handleCustomGLBBlendShape(outputContent);
|
|
41
|
-
const emotionValues = emotion === 'default' ? defaultEmotions : emotionMap[emotion];
|
|
42
|
-
setEmotionMorphTargets(_ => ({ ...defaultEmotions, ...emotionValues }));
|
|
5
|
+
const MemoizedFullbodyAvatar = memo(FullbodyAvatar);
|
|
6
|
+
const MemoizedHalfBodyAvatar = memo(HalfBodyAvatar);
|
|
7
|
+
export const AvatarView = ({ chatEmission, url, sex, eyeBlink, halfBody, loading, avatarHeight = 50, avatarDepth = -50, updateCurrentViseme, setCameraZ, headMovement, showControls, }) => {
|
|
8
|
+
const animatorRef = useRef(null);
|
|
9
|
+
const setAnimatorRef = useCallback((animator) => {
|
|
10
|
+
if (animator !== animatorRef.current) {
|
|
11
|
+
console.log('[AvatarView] Animator reference updated');
|
|
12
|
+
animatorRef.current = animator;
|
|
43
13
|
}
|
|
44
|
-
}, [isRPM, handleRPMBlendShape, handleCustomGLBBlendShape]);
|
|
45
|
-
const onBaseActionChange = useCallback((action, outputContent) => {
|
|
46
|
-
setEmotionMorphTargetInfluences(action, outputContent);
|
|
47
|
-
setCurrentBaseAction({ action, weight: 1 });
|
|
48
|
-
}, [setEmotionMorphTargetInfluences]);
|
|
49
|
-
const onMorphTargetInfluencesChange = useCallback((influences) => {
|
|
50
|
-
setMorphTargetInfluences(prev => ({ ...prev, ...influences }));
|
|
51
|
-
}, []);
|
|
52
|
-
const onMorphTargetDictionaryChange = useCallback((dictionary) => {
|
|
53
|
-
setMorphTargetDictionary(dictionary);
|
|
54
14
|
}, []);
|
|
55
15
|
useEffect(() => {
|
|
56
|
-
|
|
57
|
-
if (loading) {
|
|
58
|
-
const randomNumber = Math.floor(Math.random() * 3) + 1;
|
|
59
|
-
onBaseActionChange(`Loading${randomNumber}`, '');
|
|
16
|
+
if (!animatorRef.current)
|
|
60
17
|
return;
|
|
18
|
+
try {
|
|
19
|
+
animatorRef.current.processChatEmission(chatEmission, loading);
|
|
61
20
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
? (_b = (_a = chatEmission === null || chatEmission === void 0 ? void 0 : chatEmission.split('<output class="memori-emotion">')[1]) === null || _a === void 0 ? void 0 : _a.split('</output>')[0]) === null || _b === void 0 ? void 0 : _b.trim()
|
|
65
|
-
: null;
|
|
66
|
-
const hasOutputTagSequence = chatEmission === null || chatEmission === void 0 ? void 0 : chatEmission.includes('<output class="animation-sequence">');
|
|
67
|
-
const outputContentSequence = hasOutputTagSequence
|
|
68
|
-
? (_d = (_c = chatEmission === null || chatEmission === void 0 ? void 0 : chatEmission.split('<output class="animation-sequence">')[1]) === null || _c === void 0 ? void 0 : _c.split('</output>')[0]) === null || _d === void 0 ? void 0 : _d.trim()
|
|
69
|
-
: null;
|
|
70
|
-
if (outputContentSequence && outputContentSequence.includes('->')) {
|
|
71
|
-
onBaseActionChange(outputContentSequence, outputContentSequence);
|
|
72
|
-
}
|
|
73
|
-
else if (outputContentEmotion) {
|
|
74
|
-
console.log('[AvatarView] outputContentEmotion:', outputContentEmotion);
|
|
75
|
-
const randomNumber = Math.floor(Math.random() * 3) + 1;
|
|
76
|
-
onBaseActionChange(`${outputContentEmotion}${randomNumber}`, outputContentEmotion);
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
const randomNumber = Math.floor(Math.random() * 5) + 1;
|
|
80
|
-
onBaseActionChange(`Idle${randomNumber === 3 ? 4 : randomNumber}`, '');
|
|
21
|
+
catch (error) {
|
|
22
|
+
console.error('Error processing chat emission:', error);
|
|
81
23
|
}
|
|
82
|
-
}, [
|
|
83
|
-
const commonAvatarProps = {
|
|
24
|
+
}, [loading, chatEmission]);
|
|
25
|
+
const commonAvatarProps = useCallback(() => ({
|
|
84
26
|
url,
|
|
85
27
|
onCameraZChange: setCameraZ,
|
|
86
|
-
setMorphTargetInfluences,
|
|
87
|
-
setMorphTargetDictionary,
|
|
88
28
|
updateCurrentViseme,
|
|
89
29
|
avatarHeight,
|
|
90
30
|
avatarDepth,
|
|
91
|
-
|
|
92
|
-
|
|
31
|
+
setAnimatorRef,
|
|
32
|
+
}), [url, setCameraZ, updateCurrentViseme, avatarHeight, avatarDepth, setAnimatorRef]);
|
|
33
|
+
return (_jsxs(_Fragment, { children: [halfBody ? (_jsx(MemoizedHalfBodyAvatar, { ...commonAvatarProps(), eyeBlink: eyeBlink, headMovement: headMovement })) : (_jsx(MemoizedFullbodyAvatar, { ...commonAvatarProps(), sex: sex, eyeBlink: eyeBlink, chatEmission: chatEmission, loading: loading })), showControls && animatorRef.current && (_jsx("div", { className: "animation-controls" }))] }));
|
|
93
34
|
};
|
|
35
|
+
export default memo(AvatarView);
|
|
94
36
|
//# sourceMappingURL=avatarComponent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatarComponent.js","sourceRoot":"","sources":["../../../../../src/components/Avatar/AvatarView/AvatarComponent/avatarComponent.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"avatarComponent.js","sourceRoot":"","sources":["../../../../../src/components/Avatar/AvatarView/AvatarComponent/avatarComponent.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAC5E,OAAO,cAAc,MAAM,6BAA6B,CAAC;AAqBzD,MAAM,sBAAsB,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;AAGpD,MAAM,sBAAsB,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EACzB,YAAY,EACZ,GAAG,EACH,GAAG,EACH,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,YAAY,GAAG,EAAE,EACjB,WAAW,GAAG,CAAC,EAAE,EACjB,mBAAmB,EACnB,UAAU,EACV,YAAY,EAEZ,YAAY,GACI,EAAE,EAAE;IAEpB,MAAM,WAAW,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IAGxD,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,QAA+B,EAAE,EAAE;QACrE,IAAI,QAAQ,KAAK,WAAW,CAAC,OAAO,EAAE;YACpC,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;YACvD,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;SAChC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAIP,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,WAAW,CAAC,OAAO;YAAE,OAAO;QAEjC,IAAI;YAEF,WAAW,CAAC,OAAO,CAAC,mBAAmB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;SAChE;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;SACzD;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAG5B,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3C,GAAG;QACH,eAAe,EAAE,UAAU;QAC3B,mBAAmB;QACnB,YAAY;QACZ,WAAW;QACX,cAAc;KACf,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;IAGvF,OAAO,CACL,8BACG,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,sBAAsB,OACjB,iBAAiB,EAAE,EACvB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,GAC1B,CACH,CAAC,CAAC,CAAC,CACF,KAAC,sBAAsB,OACjB,iBAAiB,EAAE,EACvB,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,OAAO,GAChB,CACH,EACA,YAAY,IAAI,WAAW,CAAC,OAAO,IAAI,CACtC,cAAK,SAAS,EAAC,oBAAoB,GAE7B,CACP,IACA,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC,UAAU,CAAC,CAAC"}
|
|
@@ -1,2 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export
|
|
1
|
+
import { AvatarAnimator } from '../controllers/AvatarAnimator';
|
|
2
|
+
export interface FullbodyAvatarProps {
|
|
3
|
+
url: string;
|
|
4
|
+
sex: 'MALE' | 'FEMALE';
|
|
5
|
+
eyeBlink: boolean;
|
|
6
|
+
updateCurrentViseme: (currentTime: number) => {
|
|
7
|
+
name: string;
|
|
8
|
+
weight: number;
|
|
9
|
+
} | null;
|
|
10
|
+
avatarHeight?: number;
|
|
11
|
+
avatarDepth?: number;
|
|
12
|
+
onCameraZChange?: (value: number) => void;
|
|
13
|
+
chatEmission: any;
|
|
14
|
+
loading: boolean;
|
|
15
|
+
setAnimatorRef?: (animator: AvatarAnimator | null) => void;
|
|
16
|
+
}
|
|
17
|
+
export declare function FullbodyAvatar({ url, sex, eyeBlink, updateCurrentViseme, avatarHeight, avatarDepth, onCameraZChange, chatEmission, loading, setAnimatorRef, }: FullbodyAvatarProps): JSX.Element;
|
package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js
CHANGED
|
@@ -1,27 +1,38 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useEffect, useRef, useMemo } from 'react';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { useEffect, useRef, useMemo, useCallback, useState } from 'react';
|
|
3
|
+
import { SkinnedMesh } from 'three';
|
|
4
|
+
import { useGLTF, useAnimations } from '@react-three/drei';
|
|
5
5
|
import { useFrame } from '@react-three/fiber';
|
|
6
|
-
import { AnimationState } from './types';
|
|
7
|
-
import { AnimationController } from '../controllers/AnimationController';
|
|
8
6
|
import { MorphTargetController } from '../controllers/MorphTargetController';
|
|
9
7
|
import { AvatarPositionController } from '../controllers/AvatarPositionController';
|
|
10
|
-
import {
|
|
8
|
+
import { AvatarAnimator } from '../controllers/AvatarAnimator';
|
|
9
|
+
import { ANIMATION_URLS, AVATAR_POSITION, AVATAR_ROTATION, SCALE_LERP_FACTOR, } from '../../constants';
|
|
11
10
|
import DynamicShadow from '../../Shadow/DynamicShadow';
|
|
12
|
-
export function FullbodyAvatar({ url, sex,
|
|
13
|
-
const { scene } = useGLTF(url);
|
|
14
|
-
const { animations: baseAnimations } = useGLTF(url);
|
|
11
|
+
export function FullbodyAvatar({ url, sex, eyeBlink, updateCurrentViseme, avatarHeight = 50, avatarDepth = 0, onCameraZChange, chatEmission, loading, setAnimatorRef, }) {
|
|
12
|
+
const { scene, animations: baseAnimations } = useGLTF(url);
|
|
15
13
|
const { animations: additionalAnimations } = useGLTF(ANIMATION_URLS[sex]);
|
|
16
|
-
const
|
|
14
|
+
const needsAdditionalAnimations = useMemo(() => {
|
|
15
|
+
let found = false;
|
|
16
|
+
scene.traverse((object) => {
|
|
17
|
+
if (object instanceof SkinnedMesh &&
|
|
18
|
+
(object.name === 'GBNL__Head' ||
|
|
19
|
+
object.name === 'Wolf3D_Avatar' ||
|
|
20
|
+
object.name === 'Wolf3D_Avatar006_1')) {
|
|
21
|
+
found = true;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
return found;
|
|
25
|
+
}, [scene]);
|
|
26
|
+
const mergedAnimations = useMemo(() => needsAdditionalAnimations ? [...baseAnimations, ...additionalAnimations] : baseAnimations, [baseAnimations, additionalAnimations, needsAdditionalAnimations]);
|
|
17
27
|
const { actions } = useAnimations(mergedAnimations, scene);
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const
|
|
28
|
+
const morphTargetControllerRef = useRef(null);
|
|
29
|
+
const positionControllerRef = useRef(null);
|
|
30
|
+
const animatorRef = useRef(null);
|
|
31
|
+
const isInitializedRef = useRef(false);
|
|
21
32
|
const lastPositionRef = useRef(AVATAR_POSITION.clone());
|
|
22
33
|
const positionUpdateThrottleRef = useRef(0);
|
|
23
34
|
const POSITION_UPDATE_INTERVAL = 1;
|
|
24
|
-
const
|
|
35
|
+
const [isRpm, setIsRpm] = useState(false);
|
|
25
36
|
const blinkStateRef = useRef({
|
|
26
37
|
isBlinking: false,
|
|
27
38
|
lastBlinkTime: 0,
|
|
@@ -29,27 +40,35 @@ export function FullbodyAvatar({ url, sex, setIsRpm, currentBaseAction, timeScal
|
|
|
29
40
|
blinkStartTime: 0,
|
|
30
41
|
});
|
|
31
42
|
useEffect(() => {
|
|
32
|
-
if (!
|
|
33
|
-
positionControllerRef.current = new AvatarPositionController(AVATAR_POSITION);
|
|
34
|
-
}
|
|
35
|
-
if (!actions || !scene)
|
|
43
|
+
if (!scene)
|
|
36
44
|
return;
|
|
37
|
-
|
|
38
|
-
|
|
45
|
+
let headMesh = null;
|
|
46
|
+
scene.traverse((object) => {
|
|
47
|
+
if (object instanceof SkinnedMesh &&
|
|
48
|
+
(object.name === 'GBNL__Head' ||
|
|
49
|
+
object.name === 'Wolf3D_Avatar' ||
|
|
50
|
+
object.name === 'Wolf3D_Avatar006_1')) {
|
|
51
|
+
if (object.name === 'Wolf3D_Avatar' ||
|
|
52
|
+
object.name === 'Wolf3D_Avatar006_1') {
|
|
53
|
+
setIsRpm(true);
|
|
54
|
+
console.log('RPM avatar detected');
|
|
55
|
+
}
|
|
56
|
+
headMesh = object;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
39
59
|
if (headMesh) {
|
|
40
|
-
morphTargetControllerRef.current
|
|
41
|
-
|
|
42
|
-
setMorphTargetDictionary(headMesh.morphTargetDictionary);
|
|
43
|
-
const initialInfluences = Object.keys(headMesh.morphTargetDictionary)
|
|
44
|
-
.reduce((acc, key) => ({ ...acc, [key]: 0 }), {});
|
|
45
|
-
setMorphTargetInfluences(initialInfluences);
|
|
60
|
+
if (!morphTargetControllerRef.current) {
|
|
61
|
+
morphTargetControllerRef.current = new MorphTargetController(headMesh);
|
|
46
62
|
}
|
|
47
63
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
64
|
+
}, [scene]);
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
if (!positionControllerRef.current) {
|
|
67
|
+
positionControllerRef.current = new AvatarPositionController(AVATAR_POSITION);
|
|
68
|
+
}
|
|
69
|
+
return () => {
|
|
70
|
+
};
|
|
71
|
+
}, []);
|
|
53
72
|
useEffect(() => {
|
|
54
73
|
if (positionControllerRef.current) {
|
|
55
74
|
positionControllerRef.current.updateHeight(avatarHeight, false);
|
|
@@ -61,69 +80,75 @@ export function FullbodyAvatar({ url, sex, setIsRpm, currentBaseAction, timeScal
|
|
|
61
80
|
onCameraZChange(newCameraZ);
|
|
62
81
|
}
|
|
63
82
|
}, [avatarDepth, onCameraZChange]);
|
|
64
|
-
const headMesh = useMemo(() => {
|
|
65
|
-
let foundMesh;
|
|
66
|
-
scene === null || scene === void 0 ? void 0 : scene.traverse((object) => {
|
|
67
|
-
if (object instanceof SkinnedMesh &&
|
|
68
|
-
(object.name === 'GBNL__Head' || object.name === 'Wolf3D_Avatar' || object.name === 'Wolf3D_Avatar006_1')) {
|
|
69
|
-
if (object.name === 'GBNL__Head') {
|
|
70
|
-
setIsRpm(false);
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
setIsRpm(true);
|
|
74
|
-
}
|
|
75
|
-
foundMesh = object;
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
return foundMesh;
|
|
79
|
-
}, [scene]);
|
|
80
83
|
useEffect(() => {
|
|
81
|
-
if (!
|
|
84
|
+
if (!scene || !actions || isInitializedRef.current) {
|
|
82
85
|
return;
|
|
83
|
-
if (currentBaseAction.action.startsWith('Loading')) {
|
|
84
|
-
animationControllerRef.current.updateIsChatAlreadyStarted(true);
|
|
85
|
-
animationControllerRef.current.transitionTo(AnimationState.LOADING, currentBaseAction.action);
|
|
86
86
|
}
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
console.log('Initializing animator');
|
|
88
|
+
if (!animatorRef.current) {
|
|
89
|
+
animatorRef.current = new AvatarAnimator();
|
|
89
90
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
91
|
+
const animator = animatorRef.current;
|
|
92
|
+
const initWithPreloadedAnimations = async () => {
|
|
93
|
+
try {
|
|
94
|
+
if (animator.isInitialized()) {
|
|
95
|
+
console.log('Animator already initialized, skipping initialization');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
await animator.initialize(scene, actions, mergedAnimations, isRpm ? 'RPM' : 'CUSTOM_GLB');
|
|
99
|
+
console.log('AvatarAnimator initialized with', Object.keys(actions).length, 'animations');
|
|
100
|
+
if (setAnimatorRef) {
|
|
101
|
+
setAnimatorRef(animator);
|
|
102
|
+
}
|
|
103
|
+
isInitializedRef.current = true;
|
|
104
|
+
animator.setTimeScale(0.8);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
console.error('Error initializing AvatarAnimator:', error);
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
initWithPreloadedAnimations();
|
|
111
|
+
return () => {
|
|
112
|
+
if (animatorRef.current && isInitializedRef.current) {
|
|
113
|
+
console.log('Cleaning up animator');
|
|
114
|
+
if ('mixer' in animatorRef.current && animatorRef.current['mixer']) {
|
|
115
|
+
animatorRef.current['mixer'].stopAllAction();
|
|
116
|
+
}
|
|
117
|
+
if (setAnimatorRef) {
|
|
118
|
+
setAnimatorRef(null);
|
|
119
|
+
}
|
|
120
|
+
isInitializedRef.current = false;
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
}, [scene, actions, mergedAnimations, sex, setAnimatorRef]);
|
|
124
|
+
const frameCallback = useCallback((state, delta) => {
|
|
103
125
|
const currentTime = state.clock.elapsedTime * 1000;
|
|
104
|
-
(
|
|
126
|
+
if (animatorRef.current && isInitializedRef.current) {
|
|
127
|
+
animatorRef.current.update(delta);
|
|
128
|
+
}
|
|
105
129
|
if (morphTargetControllerRef.current) {
|
|
106
130
|
const currentViseme = updateCurrentViseme(currentTime / 1000);
|
|
107
|
-
morphTargetControllerRef.current.updateMorphTargets(currentTime,
|
|
131
|
+
morphTargetControllerRef.current.updateMorphTargets(currentTime, chatEmission, loading, currentViseme, eyeBlink, blinkStateRef.current);
|
|
108
132
|
}
|
|
109
133
|
if (scene && positionControllerRef.current) {
|
|
110
134
|
const newScale = positionControllerRef.current.updateScale(SCALE_LERP_FACTOR);
|
|
111
135
|
scene.scale.copy(newScale);
|
|
112
|
-
if (currentTime - positionUpdateThrottleRef.current >=
|
|
136
|
+
if (currentTime - positionUpdateThrottleRef.current >=
|
|
137
|
+
POSITION_UPDATE_INTERVAL) {
|
|
113
138
|
const currentPosition = positionControllerRef.current.getPosition();
|
|
114
139
|
currentPosition.setX(Number(currentPosition.x.toFixed(6)));
|
|
115
140
|
currentPosition.setY(Number(currentPosition.y.toFixed(6)));
|
|
116
141
|
currentPosition.setZ(Number(currentPosition.z.toFixed(6)));
|
|
117
|
-
const positionDelta = currentPosition.distanceTo(lastPositionRef.current);
|
|
118
142
|
lastPositionRef.current.copy(currentPosition);
|
|
119
143
|
positionUpdateThrottleRef.current = currentTime;
|
|
120
144
|
}
|
|
121
145
|
}
|
|
122
|
-
});
|
|
146
|
+
}, [scene, updateCurrentViseme, chatEmission, loading, eyeBlink]);
|
|
147
|
+
useFrame(frameCallback);
|
|
123
148
|
const position = useMemo(() => {
|
|
124
149
|
var _a;
|
|
125
|
-
return ((_a = positionControllerRef.current) === null || _a === void 0 ? void 0 : _a.getPosition()) || AVATAR_POSITION.clone();
|
|
126
|
-
}, [
|
|
127
|
-
return (_jsxs(_Fragment, { children: [_jsx(DynamicShadow, {
|
|
150
|
+
return (((_a = positionControllerRef.current) === null || _a === void 0 ? void 0 : _a.getPosition()) || AVATAR_POSITION.clone());
|
|
151
|
+
}, []);
|
|
152
|
+
return (_jsxs(_Fragment, { children: [_jsx(DynamicShadow, { animator: animatorRef.current, avatarPosition: position }), _jsx("group", { position: position, rotation: AVATAR_ROTATION, children: _jsx("primitive", { object: scene }) })] }));
|
|
128
153
|
}
|
|
129
154
|
//# sourceMappingURL=fullbodyAvatar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fullbodyAvatar.js","sourceRoot":"","sources":["../../../../../../../src/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"fullbodyAvatar.js","sourceRoot":"","sources":["../../../../../../../src/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.tsx"],"names":[],"mappings":"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"}
|
package/esm/components/Avatar/AvatarView/AvatarComponent/components/controllers/AvatarAnimator.d.ts
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { AnimationAction, AnimationClip, Scene } from 'three';
|
|
2
|
+
export type AnimationCategory = 'IDLE' | 'LOADING' | 'ACTION';
|
|
3
|
+
export interface AnimationInfo {
|
|
4
|
+
name: string;
|
|
5
|
+
category: AnimationCategory;
|
|
6
|
+
duration: number;
|
|
7
|
+
canLoop: boolean;
|
|
8
|
+
defaultLoopCount: number;
|
|
9
|
+
}
|
|
10
|
+
export interface AnimationPlayOptions {
|
|
11
|
+
fadeInDuration?: number;
|
|
12
|
+
fadeOutDuration?: number;
|
|
13
|
+
timeScale?: number;
|
|
14
|
+
loopCount?: number;
|
|
15
|
+
fallbackToIdle?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare class AvatarAnimator {
|
|
18
|
+
private mixer;
|
|
19
|
+
private actions;
|
|
20
|
+
private animations;
|
|
21
|
+
private currentAnimation;
|
|
22
|
+
private currentSequence;
|
|
23
|
+
private sequenceIndex;
|
|
24
|
+
private isTransitioning;
|
|
25
|
+
private timeScale;
|
|
26
|
+
private fadeInDuration;
|
|
27
|
+
private fadeOutDuration;
|
|
28
|
+
private avatarType;
|
|
29
|
+
private eventListeners;
|
|
30
|
+
private initialized;
|
|
31
|
+
private idleRotationCount;
|
|
32
|
+
private currentIdleAnimation;
|
|
33
|
+
private idleRotationLimit;
|
|
34
|
+
private lastAnimationTime;
|
|
35
|
+
initialize(scene: Scene, preloadedActions: Record<string, AnimationAction>, animations?: AnimationClip[], avatarType?: 'RPM' | 'CUSTOM_GLB'): Promise<void>;
|
|
36
|
+
private registerClipsDirectly;
|
|
37
|
+
private registerAnimations;
|
|
38
|
+
private registerAnimation;
|
|
39
|
+
play(animationName: string, options?: AnimationPlayOptions): void;
|
|
40
|
+
execute(command: string): void;
|
|
41
|
+
processChatEmission(chatEmission: string | null | undefined, isLoading: boolean): void;
|
|
42
|
+
private calculateTransitionOptions;
|
|
43
|
+
private executeWithTransition;
|
|
44
|
+
idle(options?: AnimationPlayOptions): void;
|
|
45
|
+
loading(options?: AnimationPlayOptions): void;
|
|
46
|
+
playSequence(sequence: string[], options?: AnimationPlayOptions): void;
|
|
47
|
+
forceIdle(): void;
|
|
48
|
+
update(delta: number): void;
|
|
49
|
+
private isAnimationPlaying;
|
|
50
|
+
private setupMixerEvents;
|
|
51
|
+
private handleSequenceProgressionIfNeeded;
|
|
52
|
+
private handleIdleRotationIfNeeded;
|
|
53
|
+
setTimeScale(timeScale: number): void;
|
|
54
|
+
private getRandomAnimation;
|
|
55
|
+
private getAnimationInfo;
|
|
56
|
+
private getAnimationCategory;
|
|
57
|
+
on(event: 'start' | 'complete' | 'loop' | 'transition' | 'error', callback: (data: any) => void): void;
|
|
58
|
+
off(event: 'start' | 'complete' | 'loop' | 'transition' | 'error', callback: (data: any) => void): void;
|
|
59
|
+
private emit;
|
|
60
|
+
getCurrentAnimationName(): string | null;
|
|
61
|
+
getAvatarType(): 'RPM' | 'CUSTOM_GLB';
|
|
62
|
+
isInitialized(): boolean;
|
|
63
|
+
getAllAnimationNames(): string[];
|
|
64
|
+
getAnimationsByCategory(category: AnimationCategory): AnimationInfo[];
|
|
65
|
+
}
|