@memori.ai/memori-react 7.11.3 → 7.12.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 +48 -0
- package/README.md +2 -1
- package/dist/components/Avatar/AvatarView/AvatarComponent/avatarComponent.js +52 -75
- package/dist/components/Avatar/AvatarView/AvatarComponent/avatarComponent.js.map +1 -1
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/AnimationController.js +2 -2
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/AnimationController.js.map +1 -1
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.d.ts +1 -1
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js +8 -2
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js.map +1 -1
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/types.d.ts +1 -0
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/MorphTargetController.js +6 -3
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/MorphTargetController.js.map +1 -1
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/PositionController.js +1 -1
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/PositionController.js.map +1 -1
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/controls.d.ts +1 -1
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/controls.js +1 -1
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/controls.js.map +1 -1
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.js +1 -1
- package/dist/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.js.map +1 -1
- package/dist/components/Avatar/AvatarView/AvatarComponent/constants.d.ts +74 -0
- package/dist/components/Avatar/AvatarView/AvatarComponent/constants.js +101 -0
- package/dist/components/Avatar/AvatarView/AvatarComponent/constants.js.map +1 -0
- package/dist/components/Chat/Chat.d.ts +10 -1
- package/dist/components/Chat/Chat.js +2 -10
- package/dist/components/Chat/Chat.js.map +1 -1
- package/dist/components/ChatBubble/ChatBubble.css +4 -0
- package/dist/components/ChatBubble/ChatBubble.js +14 -4
- package/dist/components/ChatBubble/ChatBubble.js.map +1 -1
- package/dist/components/ChatInputs/ChatInputs.d.ts +11 -2
- package/dist/components/ChatInputs/ChatInputs.js +44 -6
- package/dist/components/ChatInputs/ChatInputs.js.map +1 -1
- package/dist/components/CompletionProviderStatus/CompletionProviderStatus.css +8 -0
- package/dist/components/CompletionProviderStatus/CompletionProviderStatus.js +75 -51
- package/dist/components/CompletionProviderStatus/CompletionProviderStatus.js.map +1 -1
- package/dist/components/ExpertsDrawer/ExpertsDrawer.js +1 -1
- package/dist/components/ExpertsDrawer/ExpertsDrawer.js.map +1 -1
- package/dist/components/FilePreview/FilePreview.css +155 -0
- package/dist/components/FilePreview/FilePreview.d.ts +12 -0
- package/dist/components/FilePreview/FilePreview.js +21 -0
- package/dist/components/FilePreview/FilePreview.js.map +1 -0
- package/dist/components/MemoriWidget/MemoriWidget.d.ts +3 -1
- package/dist/components/MemoriWidget/MemoriWidget.js +26 -11
- package/dist/components/MemoriWidget/MemoriWidget.js.map +1 -1
- package/dist/components/UploadButton/UploadButton.css +38 -0
- package/dist/components/UploadButton/UploadButton.d.ts +8 -0
- package/dist/components/UploadButton/UploadButton.js +79 -0
- package/dist/components/UploadButton/UploadButton.js.map +1 -0
- package/dist/components/icons/Preview.d.ts +5 -0
- package/dist/components/icons/Preview.js +6 -0
- package/dist/components/icons/Preview.js.map +1 -0
- package/dist/components/icons/Upload.d.ts +5 -0
- package/dist/components/icons/Upload.js +6 -0
- package/dist/components/icons/Upload.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/styles.css +2 -0
- package/esm/components/Avatar/AvatarView/AvatarComponent/avatarComponent.js +52 -75
- package/esm/components/Avatar/AvatarView/AvatarComponent/avatarComponent.js.map +1 -1
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/AnimationController.js +2 -2
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/AnimationController.js.map +1 -1
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.d.ts +1 -1
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js +8 -2
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.js.map +1 -1
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/types.d.ts +1 -0
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/MorphTargetController.js +6 -3
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/MorphTargetController.js.map +1 -1
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/PositionController.js +1 -1
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/PositionController.js.map +1 -1
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/controls.d.ts +1 -1
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/controls.js +1 -1
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/controls.js.map +1 -1
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.js +1 -1
- package/esm/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.js.map +1 -1
- package/esm/components/Avatar/AvatarView/AvatarComponent/constants.d.ts +74 -0
- package/esm/components/Avatar/AvatarView/AvatarComponent/constants.js +98 -0
- package/esm/components/Avatar/AvatarView/AvatarComponent/constants.js.map +1 -0
- package/esm/components/Chat/Chat.d.ts +10 -1
- package/esm/components/Chat/Chat.js +2 -10
- package/esm/components/Chat/Chat.js.map +1 -1
- package/esm/components/ChatBubble/ChatBubble.css +4 -0
- package/esm/components/ChatBubble/ChatBubble.js +14 -4
- package/esm/components/ChatBubble/ChatBubble.js.map +1 -1
- package/esm/components/ChatInputs/ChatInputs.d.ts +11 -2
- package/esm/components/ChatInputs/ChatInputs.js +45 -7
- package/esm/components/ChatInputs/ChatInputs.js.map +1 -1
- package/esm/components/CompletionProviderStatus/CompletionProviderStatus.css +8 -0
- package/esm/components/CompletionProviderStatus/CompletionProviderStatus.js +76 -52
- package/esm/components/CompletionProviderStatus/CompletionProviderStatus.js.map +1 -1
- package/esm/components/ExpertsDrawer/ExpertsDrawer.js +1 -1
- package/esm/components/ExpertsDrawer/ExpertsDrawer.js.map +1 -1
- package/esm/components/FilePreview/FilePreview.css +155 -0
- package/esm/components/FilePreview/FilePreview.d.ts +12 -0
- package/esm/components/FilePreview/FilePreview.js +18 -0
- package/esm/components/FilePreview/FilePreview.js.map +1 -0
- package/esm/components/MemoriWidget/MemoriWidget.d.ts +3 -1
- package/esm/components/MemoriWidget/MemoriWidget.js +26 -11
- package/esm/components/MemoriWidget/MemoriWidget.js.map +1 -1
- package/esm/components/UploadButton/UploadButton.css +38 -0
- package/esm/components/UploadButton/UploadButton.d.ts +8 -0
- package/esm/components/UploadButton/UploadButton.js +76 -0
- package/esm/components/UploadButton/UploadButton.js.map +1 -0
- package/esm/components/icons/Preview.d.ts +5 -0
- package/esm/components/icons/Preview.js +4 -0
- package/esm/components/icons/Preview.js.map +1 -0
- package/esm/components/icons/Upload.d.ts +5 -0
- package/esm/components/icons/Upload.js +4 -0
- package/esm/components/icons/Upload.js.map +1 -0
- package/esm/index.d.ts +1 -0
- package/esm/index.js +3 -2
- package/esm/index.js.map +1 -1
- package/esm/styles.css +2 -0
- package/package.json +2 -1
- package/src/components/Avatar/AvatarView/AvatarComponent/avatarComponent.tsx +120 -153
- package/src/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/AnimationController.ts +3 -6
- package/src/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/fullbodyAvatar.tsx +11 -1
- package/src/components/Avatar/AvatarView/AvatarComponent/components/FullbodyAvatar/types.ts +1 -0
- package/src/components/Avatar/AvatarView/AvatarComponent/components/MorphTargetController.ts +33 -10
- package/src/components/Avatar/AvatarView/AvatarComponent/components/PositionController.ts +1 -1
- package/src/components/Avatar/AvatarView/AvatarComponent/components/controls.tsx +2 -2
- package/src/components/Avatar/AvatarView/AvatarComponent/components/halfbodyAvatar.tsx +1 -1
- package/src/components/Avatar/AvatarView/AvatarComponent/constants.ts +127 -0
- package/src/components/Chat/Chat.tsx +16 -10
- package/src/components/ChatBubble/ChatBubble.css +4 -0
- package/src/components/ChatBubble/ChatBubble.stories.tsx +12 -0
- package/src/components/ChatBubble/ChatBubble.tsx +23 -2
- package/src/components/ChatInputs/ChatInputs.stories.tsx +5 -0
- package/src/components/ChatInputs/ChatInputs.test.tsx +6 -6
- package/src/components/ChatInputs/ChatInputs.tsx +91 -23
- package/src/components/CompletionProviderStatus/CompletionProviderStatus.css +8 -0
- package/src/components/CompletionProviderStatus/CompletionProviderStatus.stories.tsx +1 -1
- package/src/components/CompletionProviderStatus/CompletionProviderStatus.tsx +95 -66
- package/src/components/ExpertsDrawer/ExpertsDrawer.tsx +3 -1
- package/src/components/FilePreview/FilePreview.css +155 -0
- package/src/components/FilePreview/FilePreview.stories.tsx +66 -0
- package/src/components/FilePreview/FilePreview.test.tsx +26 -0
- package/src/components/FilePreview/FilePreview.tsx +85 -0
- package/src/components/FilePreview/__snapshots__/FilePreview.test.tsx.snap +149 -0
- package/src/components/MemoriWidget/MemoriWidget.tsx +68 -3
- package/src/components/StartPanel/__snapshots__/StartPanel.test.tsx.snap +240 -0
- package/src/components/UploadButton/UploadButton.css +38 -0
- package/src/components/UploadButton/UploadButton.stories.tsx +62 -0
- package/src/components/UploadButton/UploadButton.test.tsx +11 -0
- package/src/components/UploadButton/UploadButton.tsx +126 -0
- package/src/components/UploadButton/__snapshots__/UploadButton.test.tsx.snap +31 -0
- package/src/components/icons/Preview.tsx +23 -0
- package/src/components/icons/Upload.tsx +23 -0
- package/src/components/layouts/__snapshots__/Chat.test.tsx.snap +24 -0
- package/src/components/layouts/__snapshots__/FullPage.test.tsx.snap +24 -0
- package/src/components/layouts/__snapshots__/Totem.test.tsx.snap +24 -0
- package/src/components/layouts/__snapshots__/ZoomedFullBody.test.tsx.snap +24 -0
- package/src/components/layouts/layouts.stories.tsx +30 -46
- package/src/index.stories.tsx +68 -2
- package/src/index.tsx +4 -0
- package/src/styles.css +2 -0
- package/src/components/Avatar/AvatarView/AvatarComponent/components/constants.ts +0 -29
package/esm/index.js
CHANGED
|
@@ -25,7 +25,7 @@ const getPreferredLanguages = () => {
|
|
|
25
25
|
fallbackLng: 'it',
|
|
26
26
|
};
|
|
27
27
|
};
|
|
28
|
-
const Memori = ({ ownerUserName, ownerUserID, memoriName, memoriID, integrationID, tenantID, secretToken, sessionID, layout = 'DEFAULT', customLayout, showShare = true, showCopyButton = true, showTranslationOriginal = false, showSettings = true, showInstruct = false, showTypingText = false, showClear = false, showOnlyLastMessages = false, showInputs = true, showDates = false, showContextPerLine = false, showLogin, height = '100%', baseURL, apiURL = 'https://backend.memori.ai', engineURL = 'https://engine.memori.ai', tag, pin, context, initialQuestion, uiLang, spokenLang, multilingual, authToken, AZURE_COGNITIVE_SERVICES_TTS_KEY, enableAudio, defaultSpeakerActive = true, disableTextEnteredEvents = false, onStateChange, additionalInfo, customMediaRenderer, additionalSettings, userAvatar, useMathFormatting = false, }) => {
|
|
28
|
+
const Memori = ({ ownerUserName, ownerUserID, memoriName, memoriID, integrationID, tenantID, secretToken, sessionID, layout = 'DEFAULT', customLayout, showShare = true, showCopyButton = true, showTranslationOriginal = false, showSettings = true, showInstruct = false, showTypingText = false, showClear = false, showOnlyLastMessages = false, showInputs = true, showDates = false, showContextPerLine = false, showUpload = false, showLogin, height = '100%', baseURL, apiURL = 'https://backend.memori.ai', engineURL = 'https://engine.memori.ai', tag, pin, context, initialQuestion, uiLang, spokenLang, multilingual, authToken, AZURE_COGNITIVE_SERVICES_TTS_KEY, enableAudio, defaultSpeakerActive = true, disableTextEnteredEvents = false, onStateChange, additionalInfo, customMediaRenderer, additionalSettings, userAvatar, useMathFormatting = false, }) => {
|
|
29
29
|
var _a, _b, _c;
|
|
30
30
|
const [memori, setMemori] = useState();
|
|
31
31
|
const [tenant, setTenant] = useState();
|
|
@@ -97,7 +97,7 @@ const Memori = ({ ownerUserName, ownerUserID, memoriName, memoriID, integrationI
|
|
|
97
97
|
: `https://${tenantID}`), apiURL: apiURL, engineURL: engineURL, memori: {
|
|
98
98
|
...memori,
|
|
99
99
|
secretToken,
|
|
100
|
-
}, ownerUserName: ownerUserName !== null && ownerUserName !== void 0 ? ownerUserName : memori.ownerUserName, ownerUserID: ownerUserID !== null && ownerUserID !== void 0 ? ownerUserID : memori.ownerUserID, tenantID: tenantID, memoriLang: spokenLang !== null && spokenLang !== void 0 ? spokenLang : (_b = (_a = memori.culture) === null || _a === void 0 ? void 0 : _a.split('-')) === null || _b === void 0 ? void 0 : _b[0], multilingual: multilingual, tenant: tenant, secret: secretToken, sessionID: sessionID, showShare: showShare, showCopyButton: showCopyButton, showTranslationOriginal: showTranslationOriginal, showSettings: showSettings, showInstruct: showInstruct, showTypingText: showTypingText, showClear: showClear, showOnlyLastMessages: showOnlyLastMessages, showInputs: showInputs, showDates: showDates, showContextPerLine: showContextPerLine, showLogin: showLogin !== null && showLogin !== void 0 ? showLogin : memori === null || memori === void 0 ? void 0 : memori.enableDeepThought, integration: (_c = memori === null || memori === void 0 ? void 0 : memori.integrations) === null || _c === void 0 ? void 0 : _c.find(i => integrationID
|
|
100
|
+
}, ownerUserName: ownerUserName !== null && ownerUserName !== void 0 ? ownerUserName : memori.ownerUserName, ownerUserID: ownerUserID !== null && ownerUserID !== void 0 ? ownerUserID : memori.ownerUserID, tenantID: tenantID, memoriLang: spokenLang !== null && spokenLang !== void 0 ? spokenLang : (_b = (_a = memori.culture) === null || _a === void 0 ? void 0 : _a.split('-')) === null || _b === void 0 ? void 0 : _b[0], multilingual: multilingual, tenant: tenant, secret: secretToken, sessionID: sessionID, showShare: showShare, showCopyButton: showCopyButton, showTranslationOriginal: showTranslationOriginal, showSettings: showSettings, showInstruct: showInstruct, showTypingText: showTypingText, showClear: showClear, showOnlyLastMessages: showOnlyLastMessages, showInputs: showInputs, showDates: showDates, showContextPerLine: showContextPerLine, showLogin: showLogin !== null && showLogin !== void 0 ? showLogin : memori === null || memori === void 0 ? void 0 : memori.enableDeepThought, showUpload: showUpload, integration: (_c = memori === null || memori === void 0 ? void 0 : memori.integrations) === null || _c === void 0 ? void 0 : _c.find(i => integrationID
|
|
101
101
|
? i.integrationID === integrationID
|
|
102
102
|
: !!i.publish && i.type === 'LANDING_EXPERIENCE'), initialContextVars: context, initialQuestion: initialQuestion, authToken: authToken, AZURE_COGNITIVE_SERVICES_TTS_KEY: speechKey || AZURE_COGNITIVE_SERVICES_TTS_KEY, enableAudio: enableAudio, defaultSpeakerActive: defaultSpeakerActive, disableTextEnteredEvents: disableTextEnteredEvents, onStateChange: onStateChange, additionalInfo: additionalInfo, customMediaRenderer: customMediaRenderer, additionalSettings: additionalSettings, userAvatar: userAvatar, useMathFormatting: useMathFormatting, ...(tag && pin ? { personification: { tag, pin } } : {}) })) : (_jsx("div", { style: {
|
|
103
103
|
display: 'flex',
|
|
@@ -140,6 +140,7 @@ Memori.propTypes = {
|
|
|
140
140
|
showOnlyLastMessages: PropTypes.bool,
|
|
141
141
|
showTypingText: PropTypes.bool,
|
|
142
142
|
showLogin: PropTypes.bool,
|
|
143
|
+
showUpload: PropTypes.bool,
|
|
143
144
|
height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
|
|
144
145
|
baseURL: PropTypes.string,
|
|
145
146
|
apiURL: PropTypes.string,
|
package/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,SAAS,MAAM,YAAY,CAAC;AAOnC,OAAO,eAAe,MAAM,8BAA8B,CAAC;AAE3D,OAAO,YAEN,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,WAAW,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"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"}
|
package/esm/styles.css
CHANGED
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
@import url('./components/ui/Details.css');
|
|
11
11
|
@import url('./components/ui/Expandable.css');
|
|
12
12
|
@import url('./components/ui/Slider.css');
|
|
13
|
+
@import url('./components/UploadButton/UploadButton.css');
|
|
14
|
+
@import url('./components/FilePreview/FilePreview.css');
|
|
13
15
|
|
|
14
16
|
@import url('./components/CompletionProviderStatus/CompletionProviderStatus.css');
|
|
15
17
|
@import url('./components/PoweredBy/PoweredBy.css');
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "7.
|
|
2
|
+
"version": "7.12.0",
|
|
3
3
|
"name": "@memori.ai/memori-react",
|
|
4
4
|
"author": "Memori Srl",
|
|
5
5
|
"main": "dist/index.js",
|
|
@@ -296,6 +296,7 @@
|
|
|
296
296
|
"@react-three/drei": "8.20.2",
|
|
297
297
|
"@react-three/fiber": "7.0.25",
|
|
298
298
|
"classnames": "2.5.1",
|
|
299
|
+
"convertapi-js": "^1.0.8",
|
|
299
300
|
"dompurify": "^3.2.1",
|
|
300
301
|
"ellipsed": "1.6.0",
|
|
301
302
|
"i18next": "22.0.6",
|
|
@@ -1,8 +1,15 @@
|
|
|
1
|
+
// Import required dependencies
|
|
1
2
|
import React, { useState, useEffect, useCallback } from 'react';
|
|
2
3
|
import AnimationControlPanel from './components/controls';
|
|
3
|
-
import { FullbodyAvatar } from './components/FullbodyAvatar/fullbodyAvatar'
|
|
4
|
+
import { FullbodyAvatar } from './components/FullbodyAvatar/fullbodyAvatar';
|
|
4
5
|
import HalfBodyAvatar from './components/halfbodyAvatar';
|
|
6
|
+
import {
|
|
7
|
+
BASE_ACTIONS,
|
|
8
|
+
MAPPING_BLEND_SHAPE_TO_EMOTION_CUSTOM_GLB,
|
|
9
|
+
MAPPING_BLEND_SHAPE_TO_EMOTION_RPM,
|
|
10
|
+
} from './constants';
|
|
5
11
|
|
|
12
|
+
// Props interface for AvatarView component
|
|
6
13
|
interface Props {
|
|
7
14
|
showControls: boolean;
|
|
8
15
|
animation?: string;
|
|
@@ -18,43 +25,14 @@ interface Props {
|
|
|
18
25
|
avatarDepth?: number;
|
|
19
26
|
stopProcessing: () => void;
|
|
20
27
|
resetVisemeQueue: () => void;
|
|
21
|
-
updateCurrentViseme: (
|
|
22
|
-
currentTime: number
|
|
23
|
-
) => { name: string; weight: number } | null;
|
|
28
|
+
updateCurrentViseme: (currentTime: number) => { name: string; weight: number } | null;
|
|
24
29
|
setCameraZ: (value: number) => void;
|
|
25
30
|
}
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const baseActions: Record<string, BaseAction> = {
|
|
33
|
-
Gioia1: { weight: 0 },
|
|
34
|
-
Gioia2: { weight: 0 },
|
|
35
|
-
Gioia3: { weight: 0 },
|
|
36
|
-
Idle1: { weight: 1 },
|
|
37
|
-
Idle2: { weight: 0 },
|
|
38
|
-
Idle3: { weight: 0 },
|
|
39
|
-
Idle4: { weight: 0 },
|
|
40
|
-
Idle5: { weight: 0 },
|
|
41
|
-
Rabbia1: { weight: 0 },
|
|
42
|
-
Rabbia2: { weight: 0 },
|
|
43
|
-
Rabbia3: { weight: 0 },
|
|
44
|
-
Sorpresa1: { weight: 0 },
|
|
45
|
-
Sorpresa2: { weight: 0 },
|
|
46
|
-
Sorpresa3: { weight: 0 },
|
|
47
|
-
Timore1: { weight: 0 },
|
|
48
|
-
Timore2: { weight: 0 },
|
|
49
|
-
Timore3: { weight: 0 },
|
|
50
|
-
Tristezza1: { weight: 0 },
|
|
51
|
-
Tristezza2: { weight: 0 },
|
|
52
|
-
Tristezza3: { weight: 0 },
|
|
53
|
-
Loading1: { weight: 0 },
|
|
54
|
-
Loading2: { weight: 0 },
|
|
55
|
-
Loading3: { weight: 0 },
|
|
56
|
-
};
|
|
57
|
-
|
|
32
|
+
/**
|
|
33
|
+
* AvatarView Component
|
|
34
|
+
* Renders either a full body or half body 3D avatar with animations and morphing capabilities
|
|
35
|
+
*/
|
|
58
36
|
export const AvatarView: React.FC<Props & { halfBody: boolean }> = ({
|
|
59
37
|
stopProcessing,
|
|
60
38
|
chatEmission,
|
|
@@ -64,138 +42,137 @@ export const AvatarView: React.FC<Props & { halfBody: boolean }> = ({
|
|
|
64
42
|
sex,
|
|
65
43
|
eyeBlink,
|
|
66
44
|
headMovement,
|
|
67
|
-
// speaking,
|
|
68
45
|
halfBody,
|
|
69
46
|
loading,
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
avatarDepth,
|
|
47
|
+
avatarHeight = 50,
|
|
48
|
+
avatarDepth = -50,
|
|
73
49
|
updateCurrentViseme,
|
|
74
50
|
resetVisemeQueue,
|
|
75
51
|
setCameraZ,
|
|
76
52
|
}) => {
|
|
53
|
+
// State management for avatar animations and morphing
|
|
77
54
|
const [currentBaseAction, setCurrentBaseAction] = useState({
|
|
78
55
|
action: animation || 'Idle1',
|
|
79
56
|
weight: 1,
|
|
80
57
|
});
|
|
81
|
-
|
|
82
|
-
const [
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
const [morphTargetDictionary, setMorphTargetDictionary] = useState<{
|
|
86
|
-
[key: string]: number;
|
|
87
|
-
}>({});
|
|
88
|
-
const [emotionMorphTargets, setEmotionMorphTargets] = useState<{
|
|
89
|
-
[key: string]: number;
|
|
90
|
-
}>({});
|
|
91
|
-
|
|
58
|
+
const [morphTargetInfluences, setMorphTargetInfluences] = useState<Record<string, number>>({});
|
|
59
|
+
const [morphTargetDictionary, setMorphTargetDictionary] = useState<Record<string, number>>({});
|
|
60
|
+
const [emotionMorphTargets, setEmotionMorphTargets] = useState<Record<string, number>>({});
|
|
61
|
+
const [isRPM, setIsRPM] = useState(false);
|
|
92
62
|
const [timeScale, setTimeScale] = useState(0.8);
|
|
93
63
|
|
|
94
|
-
//
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
64
|
+
// Map of basic emotions with their corresponding morph values
|
|
65
|
+
const emotionMap: Record<string, Record<string, number>> = {
|
|
66
|
+
Joy: { Joy: 1 },
|
|
67
|
+
Anger: { Anger: 1 },
|
|
68
|
+
Surprise: { Surprise: 1 },
|
|
69
|
+
Sadness: { Sadness: 1 },
|
|
70
|
+
Fear: { Fear: 1 },
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
// Helper function to get default emotion state (all set to 0)
|
|
74
|
+
const getDefaultEmotions = () =>
|
|
75
|
+
Object.keys(emotionMap).reduce((acc, key) => ({...acc, [key]: 0}), {});
|
|
76
|
+
|
|
77
|
+
// Handlers for different blend shape types
|
|
78
|
+
const handleRPMBlendShape = useCallback((outputContent: string) =>
|
|
79
|
+
MAPPING_BLEND_SHAPE_TO_EMOTION_RPM[outputContent as keyof typeof MAPPING_BLEND_SHAPE_TO_EMOTION_RPM],
|
|
80
|
+
[]);
|
|
81
|
+
|
|
82
|
+
const handleCustomGLBBlendShape = useCallback((outputContent: string) =>
|
|
83
|
+
MAPPING_BLEND_SHAPE_TO_EMOTION_CUSTOM_GLB[outputContent as keyof typeof MAPPING_BLEND_SHAPE_TO_EMOTION_CUSTOM_GLB],
|
|
84
|
+
[]);
|
|
85
|
+
|
|
86
|
+
// Handler for setting emotion morph target influences, used for RPM and GLB blend shapes
|
|
87
|
+
const setEmotionMorphTargetInfluences = useCallback((action: string, outputContent: string) => {
|
|
88
|
+
if (action.startsWith('Loading')) return;
|
|
89
|
+
|
|
90
|
+
const defaultEmotions = getDefaultEmotions();
|
|
91
|
+
|
|
92
|
+
// If output content is default, set default emotions
|
|
93
|
+
if (outputContent === 'default') {
|
|
94
|
+
setEmotionMorphTargets(defaultEmotions);
|
|
101
95
|
return;
|
|
102
96
|
}
|
|
103
97
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
const emotionValues =
|
|
124
|
-
emotion === 'default' ? defaultEmotions : emotionMap[emotion];
|
|
125
|
-
|
|
126
|
-
setEmotionMorphTargets(_ => ({
|
|
127
|
-
...defaultEmotions,
|
|
128
|
-
...emotionValues,
|
|
129
|
-
}));
|
|
130
|
-
}, []);
|
|
98
|
+
// If RPM, convert emotion to blend shape
|
|
99
|
+
/*from the chat output, we get the emotion and we convert it to the blend shapes
|
|
100
|
+
* we map the emotion to the blend shape, example:
|
|
101
|
+
* Anger -> {browDownLeft: 1, browDownRight: 0}
|
|
102
|
+
* Joy -> {browUpLeft: 1, browUpRight: 0}
|
|
103
|
+
* Surprise -> {browUpLeft: 1, browUpRight: 0}
|
|
104
|
+
* Sadness -> {browDownLeft: 1, browDownRight: 0}
|
|
105
|
+
* Fear -> {browDownLeft: 1, browDownRight: 0}
|
|
106
|
+
*/
|
|
107
|
+
if (isRPM) {
|
|
108
|
+
const emotion = handleRPMBlendShape(outputContent);
|
|
109
|
+
setEmotionMorphTargets((_) => ({...defaultEmotions, ...emotion}));
|
|
110
|
+
} else {
|
|
111
|
+
// If GLB, convert italian emotions to english ones
|
|
112
|
+
const emotion = handleCustomGLBBlendShape(outputContent);
|
|
113
|
+
const emotionValues = emotion === 'default' ? defaultEmotions : emotionMap[emotion];
|
|
114
|
+
setEmotionMorphTargets((_) => ({...defaultEmotions, ...emotionValues}));
|
|
115
|
+
}
|
|
116
|
+
}, [isRPM, handleRPMBlendShape, handleCustomGLBBlendShape]);
|
|
131
117
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
setCurrentBaseAction({
|
|
135
|
-
action,
|
|
136
|
-
weight: 1,
|
|
137
|
-
});
|
|
138
|
-
}, []);
|
|
118
|
+
// Callback handlers for various avatar state changes
|
|
119
|
+
const onBaseActionChange = useCallback((action: string, outputContent: string) => {
|
|
139
120
|
|
|
140
|
-
|
|
141
|
-
(
|
|
142
|
-
setMorphTargetInfluences(prevInfluences => ({
|
|
143
|
-
...prevInfluences,
|
|
144
|
-
...influences,
|
|
145
|
-
}));
|
|
146
|
-
},
|
|
147
|
-
[]
|
|
148
|
-
);
|
|
121
|
+
// Set emotion morph target influences
|
|
122
|
+
setEmotionMorphTargetInfluences(action, outputContent);
|
|
149
123
|
|
|
150
|
-
|
|
151
|
-
(
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
124
|
+
// Set current base action
|
|
125
|
+
setCurrentBaseAction({action, weight: 1});
|
|
126
|
+
}, [setEmotionMorphTargetInfluences]);
|
|
127
|
+
|
|
128
|
+
const onMorphTargetInfluencesChange = useCallback((influences: Record<string, number>) => {
|
|
129
|
+
// Set morph target influences
|
|
130
|
+
setMorphTargetInfluences(prev => ({...prev, ...influences}));
|
|
131
|
+
}, []);
|
|
156
132
|
|
|
157
|
-
const
|
|
158
|
-
|
|
133
|
+
const onMorphTargetDictionaryChange = useCallback((dictionary: Record<string, number>) => {
|
|
134
|
+
// Set morph target dictionary
|
|
135
|
+
setMorphTargetDictionary(dictionary);
|
|
159
136
|
}, []);
|
|
160
137
|
|
|
161
|
-
//
|
|
138
|
+
// Effect to handle animation changes based on loading state and chat emissions
|
|
162
139
|
useEffect(() => {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
140
|
+
|
|
141
|
+
// If loading, set a random loading animation
|
|
142
|
+
if (loading) {
|
|
143
|
+
const randomNumber = Math.floor(Math.random() * 3) + 1;
|
|
144
|
+
onBaseActionChange(`Loading${randomNumber}`, '');
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// If there's chat emission, set the corresponding emotion animation
|
|
149
|
+
const hasOutputTag = chatEmission?.includes('<output class="memori-emotion">');
|
|
167
150
|
const outputContent = hasOutputTag
|
|
168
|
-
? chatEmission
|
|
169
|
-
?.split('<output class="memori-emotion">')[1]
|
|
170
|
-
?.split('</output>')[0]
|
|
171
|
-
?.trim()
|
|
151
|
+
? chatEmission?.split('<output class="memori-emotion">')[1]?.split('</output>')[0]?.trim()
|
|
172
152
|
: null;
|
|
173
153
|
|
|
154
|
+
// If there's an emotion, set the corresponding animation
|
|
174
155
|
if (outputContent) {
|
|
175
|
-
//Based on the outputContent, set the emotion
|
|
176
|
-
//The outputContent could be: "Gioia", "Sorpresa", "Tristezza", "Rabbia", "Timore"
|
|
177
|
-
//Choose a random number between 1 and 3
|
|
178
156
|
const randomNumber = Math.floor(Math.random() * 3) + 1;
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
onBaseActionChange(emotion);
|
|
157
|
+
onBaseActionChange(`${outputContent}${randomNumber}`, outputContent);
|
|
182
158
|
} else {
|
|
183
|
-
//Set a random idle animation
|
|
184
159
|
const randomNumber = Math.floor(Math.random() * 5) + 1;
|
|
185
|
-
|
|
186
|
-
onBaseActionChange(animation);
|
|
160
|
+
onBaseActionChange(`Idle${randomNumber === 3 ? 4 : randomNumber}`, '');
|
|
187
161
|
}
|
|
188
|
-
}, [chatEmission]);
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
162
|
+
}, [chatEmission, loading, onBaseActionChange]);
|
|
163
|
+
|
|
164
|
+
// Common props shared between full body and half body avatars
|
|
165
|
+
const commonAvatarProps = {
|
|
166
|
+
url,
|
|
167
|
+
onCameraZChange: setCameraZ,
|
|
168
|
+
setMorphTargetInfluences,
|
|
169
|
+
setMorphTargetDictionary,
|
|
170
|
+
updateCurrentViseme,
|
|
171
|
+
avatarHeight,
|
|
172
|
+
avatarDepth,
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
// Render avatar with controls
|
|
199
176
|
return (
|
|
200
177
|
<>
|
|
201
178
|
{showControls && (
|
|
@@ -205,40 +182,30 @@ export const AvatarView: React.FC<Props & { halfBody: boolean }> = ({
|
|
|
205
182
|
onBaseActionChange={onBaseActionChange}
|
|
206
183
|
onMorphTargetInfluencesChange={onMorphTargetInfluencesChange}
|
|
207
184
|
onMorphTargetDictionaryChange={onMorphTargetDictionaryChange}
|
|
208
|
-
baseActions={
|
|
185
|
+
baseActions={BASE_ACTIONS}
|
|
209
186
|
currentBaseAction={currentBaseAction}
|
|
210
|
-
modifyTimeScale={
|
|
187
|
+
modifyTimeScale={setTimeScale}
|
|
211
188
|
/>
|
|
212
189
|
)}
|
|
190
|
+
|
|
213
191
|
{halfBody ? (
|
|
214
192
|
<HalfBodyAvatar
|
|
215
|
-
|
|
216
|
-
onCameraZChange={setCameraZ}
|
|
217
|
-
setMorphTargetInfluences={setMorphTargetInfluences}
|
|
218
|
-
setMorphTargetDictionary={setMorphTargetDictionary}
|
|
219
|
-
updateCurrentViseme={updateCurrentViseme}
|
|
220
|
-
avatarHeight={avatarHeight || 50}
|
|
221
|
-
avatarDepth={avatarDepth || -50}
|
|
193
|
+
{...commonAvatarProps}
|
|
222
194
|
headMovement={headMovement}
|
|
223
195
|
/>
|
|
224
196
|
) : (
|
|
225
197
|
<FullbodyAvatar
|
|
226
|
-
|
|
198
|
+
{...commonAvatarProps}
|
|
227
199
|
sex={sex}
|
|
200
|
+
setIsRpm={setIsRPM}
|
|
228
201
|
resetVisemeQueue={resetVisemeQueue}
|
|
229
202
|
eyeBlink={eyeBlink}
|
|
230
203
|
currentBaseAction={currentBaseAction}
|
|
231
204
|
timeScale={timeScale}
|
|
232
205
|
morphTargetInfluences={morphTargetInfluences}
|
|
233
|
-
updateCurrentViseme={updateCurrentViseme}
|
|
234
206
|
stopProcessing={stopProcessing}
|
|
235
|
-
setMorphTargetDictionary={setMorphTargetDictionary}
|
|
236
|
-
setMorphTargetInfluences={setMorphTargetInfluences}
|
|
237
207
|
emotionMorphTargets={emotionMorphTargets}
|
|
238
208
|
halfBody={halfBody}
|
|
239
|
-
onCameraZChange={setCameraZ}
|
|
240
|
-
avatarHeight={avatarHeight || 50}
|
|
241
|
-
avatarDepth={avatarDepth || -50}
|
|
242
209
|
/>
|
|
243
210
|
)}
|
|
244
211
|
</>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AnimationState, AnimationConfig } from './types';
|
|
2
2
|
import { AnimationAction, AnimationMixer, LoopOnce } from 'three';
|
|
3
|
-
import { DEFAULT_CONFIG } from '
|
|
3
|
+
import { DEFAULT_CONFIG, MAX_IDLE_LOOPS_DEFAULT } from '../../constants';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Controller class for managing avatar animations and transitions between states
|
|
@@ -23,7 +23,7 @@ export class AnimationController {
|
|
|
23
23
|
// Counter for number of times current idle has looped
|
|
24
24
|
private currentIdleLoopCount: number = 0;
|
|
25
25
|
// Maximum number of idle loops before forcing change
|
|
26
|
-
private readonly MAX_IDLE_LOOPS =
|
|
26
|
+
private readonly MAX_IDLE_LOOPS = MAX_IDLE_LOOPS_DEFAULT;
|
|
27
27
|
// Timestamp of last animation frame
|
|
28
28
|
private lastAnimationTime: number = 0;
|
|
29
29
|
// Flag to check if chat has already started
|
|
@@ -60,9 +60,6 @@ export class AnimationController {
|
|
|
60
60
|
|
|
61
61
|
// Force idle change after MAX_IDLE_LOOPS
|
|
62
62
|
if (this.currentIdleLoopCount >= this.MAX_IDLE_LOOPS) {
|
|
63
|
-
// console.log(
|
|
64
|
-
// '[AnimationController] Max loops reached, changing idle animation'
|
|
65
|
-
// );
|
|
66
63
|
this.forceIdleChange();
|
|
67
64
|
}
|
|
68
65
|
}
|
|
@@ -74,7 +71,6 @@ export class AnimationController {
|
|
|
74
71
|
* Forces transition to a new idle animation
|
|
75
72
|
*/
|
|
76
73
|
private forceIdleChange() {
|
|
77
|
-
// console.log('[AnimationController] Forcing idle change');
|
|
78
74
|
this.currentIdleLoopCount = 0;
|
|
79
75
|
this.lastAnimationTime = 0;
|
|
80
76
|
this.transitionTo(AnimationState.IDLE);
|
|
@@ -133,6 +129,7 @@ export class AnimationController {
|
|
|
133
129
|
try {
|
|
134
130
|
let nextAction: AnimationAction | null = null;
|
|
135
131
|
|
|
132
|
+
// Select the next action based on the current state
|
|
136
133
|
switch (state) {
|
|
137
134
|
case AnimationState.LOADING:
|
|
138
135
|
nextAction = this.actions[emotionName || 'Loading1'];
|
|
@@ -18,11 +18,12 @@ import {
|
|
|
18
18
|
ANIMATION_URLS,
|
|
19
19
|
DEFAULT_CONFIG,
|
|
20
20
|
SCALE_LERP_FACTOR,
|
|
21
|
-
} from '
|
|
21
|
+
} from '../../constants';
|
|
22
22
|
|
|
23
23
|
export function FullbodyAvatar({
|
|
24
24
|
url,
|
|
25
25
|
sex,
|
|
26
|
+
setIsRpm,
|
|
26
27
|
currentBaseAction,
|
|
27
28
|
timeScale,
|
|
28
29
|
eyeBlink,
|
|
@@ -65,12 +66,15 @@ export function FullbodyAvatar({
|
|
|
65
66
|
);
|
|
66
67
|
|
|
67
68
|
if (headMesh) {
|
|
69
|
+
// console.log('[FullbodyAvatar] Head mesh found:', headMesh.name);
|
|
68
70
|
morphTargetControllerRef.current = new MorphTargetController(headMesh);
|
|
69
71
|
|
|
70
72
|
if (headMesh.morphTargetDictionary && headMesh.morphTargetInfluences) {
|
|
73
|
+
// console.log('[FullbodyAvatar] Setting morph target dictionary and influences', headMesh.morphTargetDictionary, headMesh.morphTargetInfluences);
|
|
71
74
|
setMorphTargetDictionary(headMesh.morphTargetDictionary);
|
|
72
75
|
const initialInfluences = Object.keys(headMesh.morphTargetDictionary)
|
|
73
76
|
.reduce((acc, key) => ({ ...acc, [key]: 0 }), {});
|
|
77
|
+
// console.log('[FullbodyAvatar] Setting initial influences', initialInfluences);
|
|
74
78
|
setMorphTargetInfluences(initialInfluences);
|
|
75
79
|
}
|
|
76
80
|
}
|
|
@@ -96,6 +100,12 @@ export function FullbodyAvatar({
|
|
|
96
100
|
object instanceof SkinnedMesh &&
|
|
97
101
|
(object.name === 'GBNL__Head' || object.name === 'Wolf3D_Avatar')
|
|
98
102
|
) {
|
|
103
|
+
// console.log('[FullbodyAvatar] Found head mesh:', object.name);
|
|
104
|
+
if(object.name === 'GBNL__Head') {
|
|
105
|
+
setIsRpm(false);
|
|
106
|
+
} else {
|
|
107
|
+
setIsRpm(true);
|
|
108
|
+
}
|
|
99
109
|
foundMesh = object;
|
|
100
110
|
}
|
|
101
111
|
});
|