@gui-chat-plugin/avatar 0.0.3 → 0.0.4
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/README.md +2 -1
- package/dist/core.cjs +1 -1
- package/dist/core.js +2 -72
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -9
- package/dist/plugin-Cezk5ZnX.js +74 -0
- package/dist/plugin-DbprBh0b.cjs +1 -0
- package/dist/react.cjs +2 -2
- package/dist/react.js +327 -376
- package/dist/style.css +3 -1
- package/dist/three-vrm.module-BlO9zbj_.js +15640 -0
- package/dist/three-vrm.module-FrURzSOB.cjs +4752 -0
- package/dist/vue.cjs +1 -1
- package/dist/vue.js +166 -192
- package/package.json +14 -13
- package/dist/three-vrm.module-DJ7DURJm.js +0 -27282
- package/dist/three-vrm.module-FTOSkzpf.cjs +0 -4752
package/dist/vue.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require(`./plugin-DbprBh0b.cjs`),t=require(`./three-vrm.module-FrURzSOB.cjs`);require(`./react.cjs`);let n=require(`vue`);var r={class:`size-full bg-gradient-to-b from-slate-800 to-slate-900 relative`},i={key:0,class:`absolute inset-0 flex items-center justify-center bg-slate-900/80`},a={key:1,class:`absolute inset-0 flex items-center justify-center bg-slate-900/80`},o={class:`text-red-400 text-lg text-center p-4`},s={key:2,class:`absolute top-4 right-4 px-3 py-1 bg-green-600 text-white text-sm rounded-full`},c=(0,n.defineComponent)({__name:`View`,props:{selectedResult:{},sendTextMessage:{type:Function},isAudioPlaying:{type:Boolean}},setup(e){let c=e,l=(0,n.ref)(null),u=(0,n.ref)(!1),d=(0,n.ref)(null),f=null,p=null,m=null,h=null,g=null,_=null,v=0,y=`neutral`,b=`none`,x=0,S=0,C=``,w={neutral:null,happy:t.t.Happy,sad:t.t.Sad,angry:t.t.Angry,surprised:t.t.Surprised};function T(){if(!l.value)return;let e=l.value,n=e.clientWidth,r=e.clientHeight;f=new t.u,p=new t.c(30,n/r,.1,100),p.position.set(0,1.3,1.5),p.lookAt(0,1.2,0),m=new t.i({antialias:!0,alpha:!0}),m.setSize(n,r),m.setPixelRatio(window.devicePixelRatio),m.outputColorSpace=t.l,e.appendChild(m.domElement);let i=new t.a(16777215,.6);f.add(i);let a=new t.s(16777215,.8);a.position.set(1,1,1),f.add(a),g=new t.o,window.addEventListener(`resize`,E),O()}function E(){if(!l.value||!p||!m)return;let e=l.value.clientWidth,t=l.value.clientHeight;p.aspect=e/t,p.updateProjectionMatrix(),m.setSize(e,t)}async function D(e){if(f){u.value=!0,d.value=null,h&&=(f.remove(h.scene),null);try{let n=new t.r;n.register(e=>new t.n(e));let r=(await n.loadAsync(e)).userData.vrm;if(!r)throw Error(`Failed to load VRM data`);f.add(r.scene),h=r,u.value=!1}catch(e){console.error(`Failed to load VRM:`,e),d.value=`Failed to load avatar: ${e instanceof Error?e.message:`Unknown error`}`,u.value=!1}}}function O(){if(_=requestAnimationFrame(O),!g||!m||!f||!p)return;let e=g.getDelta(),n=g.getElapsedTime();if(h){if(h.update(e),c.isAudioPlaying){v+=e*10;let r=(Math.sin(v)+1)*.3;h.expressionManager?.setValue(t.t.Aa,r);let i=h.humanoid?.getNormalizedBoneNode(`head`),a=h.humanoid?.getNormalizedBoneNode(`neck`),o=h.humanoid?.getNormalizedBoneNode(`spine`);i&&(i.rotation.x=Math.sin(n*2)*.08,i.rotation.z=Math.sin(n*1.5)*.05),a&&(a.rotation.y=Math.sin(n*.8)*.05),o&&(o.rotation.z=Math.sin(n*.5)*.03);let s=h.humanoid?.getNormalizedBoneNode(`leftShoulder`),c=h.humanoid?.getNormalizedBoneNode(`rightShoulder`),l=h.humanoid?.getNormalizedBoneNode(`leftUpperArm`),u=h.humanoid?.getNormalizedBoneNode(`rightUpperArm`),d=h.humanoid?.getNormalizedBoneNode(`leftLowerArm`),f=h.humanoid?.getNormalizedBoneNode(`rightLowerArm`);s&&(s.rotation.z=.1),c&&(c.rotation.z=-.1),l&&(l.rotation.z=-.8+Math.sin(n*1.2)*.1,l.rotation.x=.4+Math.sin(n*.9)*.15,l.rotation.y=Math.sin(n*.7)*.1),u&&(u.rotation.z=.8+Math.sin(n*1.3)*.1,u.rotation.x=.4+Math.sin(n*1)*.15,u.rotation.y=Math.sin(n*.8)*.1),d&&(d.rotation.y=-1-Math.sin(n*1.5)*.2,d.rotation.z=Math.sin(n*1.1)*.1),f&&(f.rotation.y=1+Math.sin(n*1.4)*.2,f.rotation.z=Math.sin(n*1.2)*.1)}else{v=0,h.expressionManager?.setValue(t.t.Aa,0);let e=h.humanoid?.getNormalizedBoneNode(`spine`),r=h.humanoid?.getNormalizedBoneNode(`head`);e&&(e.rotation.x=Math.sin(n*.8)*.02),r&&(r.rotation.x=Math.sin(n*.3)*.03,r.rotation.z=Math.sin(n*.2)*.02);let i=h.humanoid?.getNormalizedBoneNode(`leftShoulder`),a=h.humanoid?.getNormalizedBoneNode(`rightShoulder`),o=h.humanoid?.getNormalizedBoneNode(`leftUpperArm`),s=h.humanoid?.getNormalizedBoneNode(`rightUpperArm`),c=h.humanoid?.getNormalizedBoneNode(`leftLowerArm`),l=h.humanoid?.getNormalizedBoneNode(`rightLowerArm`);i&&(i.rotation.z=.1),a&&(a.rotation.z=-.1),o&&(o.rotation.z=-.9,o.rotation.x=.2,o.rotation.y=0),s&&(s.rotation.z=.9,s.rotation.x=.2,s.rotation.y=0),c&&(c.rotation.y=-.8),l&&(l.rotation.y=.8)}n%4<.1?h.expressionManager?.setValue(t.t.Blink,1):h.expressionManager?.setValue(t.t.Blink,0);let r=w[y];if(h.expressionManager?.setValue(t.t.Happy,0),h.expressionManager?.setValue(t.t.Sad,0),h.expressionManager?.setValue(t.t.Angry,0),h.expressionManager?.setValue(t.t.Surprised,0),r&&h.expressionManager?.setValue(r,.8),b!==`none`){let e=n-x,t=1.5;if(e<t){let n=e/t,r=h.humanoid?.getNormalizedBoneNode(`head`),i=h.humanoid?.getNormalizedBoneNode(`rightUpperArm`),a=h.humanoid?.getNormalizedBoneNode(`rightLowerArm`),o=h.humanoid?.getNormalizedBoneNode(`spine`),s=(e=>e<.5?2*e*e:1-(-2*e+2)**2/2)(n<.5?n*2:(1-n)*2);switch(b){case`nod`:r&&(r.rotation.x=Math.sin(n*Math.PI*3)*.2);break;case`shake`:r&&(r.rotation.y=Math.sin(n*Math.PI*4)*.3);break;case`wave`:i&&(i.rotation.z=1.5*s,i.rotation.x=-.3*s),a&&(a.rotation.y=.5+Math.sin(n*Math.PI*6)*.3);break;case`think`:r&&(r.rotation.x=.1*s,r.rotation.z=.1*s),i&&(i.rotation.z=.3*s,i.rotation.x=.8*s),a&&(a.rotation.y=1.5*s);break;case`bow`:o&&(o.rotation.x=.4*s),r&&(r.rotation.x=.2*s);break}}else b=`none`}}m.render(f,p)}function k(){_!==null&&(cancelAnimationFrame(_),_=null),window.removeEventListener(`resize`,E),m&&l.value&&(l.value.removeChild(m.domElement),m.dispose(),m=null),h&&=null,f=null,p=null,g=null}return(0,n.watch)(()=>c.selectedResult,e=>{if(e?.toolName===`receptron_avatar`&&e.data){let t=e.data;if(t.avatarUrl&&t.avatarUrl!==C&&(C=t.avatarUrl,D(t.avatarUrl)),t.emotion&&t.emotion!==y&&(console.log(`[Avatar Debug] Emotion changed to:`,t.emotion),y=t.emotion),t.action&&t.action!==`none`){let e=t.actionTimestamp||0;e>S&&(console.log(`[Avatar Debug] Action triggered:`,t.action),b=t.action,x=g?.getElapsedTime()||0,S=e)}}},{deep:!0}),(0,n.onMounted)(()=>{if(T(),c.selectedResult?.toolName===`receptron_avatar`&&c.selectedResult.data){let e=c.selectedResult.data;e.avatarUrl&&(C=e.avatarUrl,D(e.avatarUrl)),e.emotion&&(y=e.emotion)}}),(0,n.onUnmounted)(()=>{k()}),(t,c)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,r,[(0,n.createElementVNode)(`div`,{ref_key:`containerRef`,ref:l,class:`size-full`},null,512),u.value?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,i,[...c[0]||=[(0,n.createElementVNode)(`div`,{class:`text-white text-lg`},`Loading Avatar...`,-1)]])):(0,n.createCommentVNode)(``,!0),d.value?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,a,[(0,n.createElementVNode)(`div`,o,(0,n.toDisplayString)(d.value),1)])):(0,n.createCommentVNode)(``,!0),e.isAudioPlaying?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,s,` Speaking... `)):(0,n.createCommentVNode)(``,!0)]))}}),l={class:`p-3 bg-gradient-to-br from-slate-700 to-slate-800 rounded-md`},u={class:`flex flex-col items-center gap-2`},d={key:0,class:`text-xs px-2 py-0.5 bg-blue-500 text-white rounded-full`},f=(0,n.defineComponent)({__name:`Preview`,props:{result:{}},setup(e){let t=e,r=(0,n.computed)(()=>t.result.data),i=(0,n.computed)(()=>r.value?.emotion||`neutral`);return(e,t)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,l,[(0,n.createElementVNode)(`div`,u,[t[0]||=(0,n.createElementVNode)(`div`,{class:`size-12 bg-slate-600 rounded-full flex items-center justify-center`},[(0,n.createElementVNode)(`svg`,{class:`size-8 text-slate-300`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[(0,n.createElementVNode)(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z`})])],-1),t[1]||=(0,n.createElementVNode)(`div`,{class:`text-sm font-semibold text-white text-center`},` 3D Avatar `,-1),i.value&&i.value!==`neutral`?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,d,(0,n.toDisplayString)(i.value),1)):(0,n.createCommentVNode)(``,!0)])]))}}),p={...e.n,viewComponent:c,previewComponent:f},m={plugin:p};exports.Preview=f,exports.SAMPLES=e.r,exports.TOOL_DEFINITION=e.i,exports.TOOL_NAME=e.a,exports.View=c,exports.default=m,exports.executeAvatar=e.t,exports.plugin=p,exports.pluginCore=e.n;
|
package/dist/vue.js
CHANGED
|
@@ -1,192 +1,166 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
},
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
},
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
},
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
"stroke-width": "2",
|
|
168
|
-
d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"
|
|
169
|
-
})
|
|
170
|
-
])
|
|
171
|
-
], -1)),
|
|
172
|
-
a[1] || (a[1] = z("div", { class: "text-sm font-semibold text-white text-center" }, " 3D Avatar ", -1)),
|
|
173
|
-
g.value && g.value !== "neutral" ? (y(), B("div", pe, $(g.value), 1)) : U("", !0)
|
|
174
|
-
])
|
|
175
|
-
]));
|
|
176
|
-
}
|
|
177
|
-
}), ge = {
|
|
178
|
-
...oe,
|
|
179
|
-
viewComponent: ue,
|
|
180
|
-
previewComponent: fe
|
|
181
|
-
}, ze = { plugin: ge };
|
|
182
|
-
export {
|
|
183
|
-
fe as Preview,
|
|
184
|
-
Ae as SAMPLES,
|
|
185
|
-
ye as TOOL_DEFINITION,
|
|
186
|
-
I as TOOL_NAME,
|
|
187
|
-
ue as View,
|
|
188
|
-
ze as default,
|
|
189
|
-
Be as executeAvatar,
|
|
190
|
-
ge as plugin,
|
|
191
|
-
oe as pluginCore
|
|
192
|
-
};
|
|
1
|
+
import { a as e, i as t, n, r, t as i } from "./plugin-Cezk5ZnX.js";
|
|
2
|
+
import { a, c as o, i as s, l as c, n as l, o as u, r as d, s as f, t as p, u as m } from "./three-vrm.module-BlO9zbj_.js";
|
|
3
|
+
import { computed as h, createCommentVNode as g, createElementBlock as _, createElementVNode as v, defineComponent as y, onMounted as b, onUnmounted as x, openBlock as S, ref as C, toDisplayString as w, watch as T } from "vue";
|
|
4
|
+
//#region src/vue/View.vue?vue&type=script&setup=true&lang.ts
|
|
5
|
+
var E = { class: "size-full bg-gradient-to-b from-slate-800 to-slate-900 relative" }, D = {
|
|
6
|
+
key: 0,
|
|
7
|
+
class: "absolute inset-0 flex items-center justify-center bg-slate-900/80"
|
|
8
|
+
}, O = {
|
|
9
|
+
key: 1,
|
|
10
|
+
class: "absolute inset-0 flex items-center justify-center bg-slate-900/80"
|
|
11
|
+
}, k = { class: "text-red-400 text-lg text-center p-4" }, A = {
|
|
12
|
+
key: 2,
|
|
13
|
+
class: "absolute top-4 right-4 px-3 py-1 bg-green-600 text-white text-sm rounded-full"
|
|
14
|
+
}, j = /* @__PURE__ */ y({
|
|
15
|
+
__name: "View",
|
|
16
|
+
props: {
|
|
17
|
+
selectedResult: {},
|
|
18
|
+
sendTextMessage: { type: Function },
|
|
19
|
+
isAudioPlaying: { type: Boolean }
|
|
20
|
+
},
|
|
21
|
+
setup(e) {
|
|
22
|
+
let t = e, n = C(null), r = C(!1), i = C(null), h = null, y = null, j = null, M = null, N = null, P = null, F = 0, I = "neutral", L = "none", R = 0, z = 0, B = "", V = {
|
|
23
|
+
neutral: null,
|
|
24
|
+
happy: p.Happy,
|
|
25
|
+
sad: p.Sad,
|
|
26
|
+
angry: p.Angry,
|
|
27
|
+
surprised: p.Surprised
|
|
28
|
+
};
|
|
29
|
+
function H() {
|
|
30
|
+
if (!n.value) return;
|
|
31
|
+
let e = n.value, t = e.clientWidth, r = e.clientHeight;
|
|
32
|
+
h = new m(), y = new o(30, t / r, .1, 100), y.position.set(0, 1.3, 1.5), y.lookAt(0, 1.2, 0), j = new s({
|
|
33
|
+
antialias: !0,
|
|
34
|
+
alpha: !0
|
|
35
|
+
}), j.setSize(t, r), j.setPixelRatio(window.devicePixelRatio), j.outputColorSpace = c, e.appendChild(j.domElement);
|
|
36
|
+
let i = new a(16777215, .6);
|
|
37
|
+
h.add(i);
|
|
38
|
+
let l = new f(16777215, .8);
|
|
39
|
+
l.position.set(1, 1, 1), h.add(l), N = new u(), window.addEventListener("resize", U), G();
|
|
40
|
+
}
|
|
41
|
+
function U() {
|
|
42
|
+
if (!n.value || !y || !j) return;
|
|
43
|
+
let e = n.value.clientWidth, t = n.value.clientHeight;
|
|
44
|
+
y.aspect = e / t, y.updateProjectionMatrix(), j.setSize(e, t);
|
|
45
|
+
}
|
|
46
|
+
async function W(e) {
|
|
47
|
+
if (h) {
|
|
48
|
+
r.value = !0, i.value = null, M &&= (h.remove(M.scene), null);
|
|
49
|
+
try {
|
|
50
|
+
let t = new d();
|
|
51
|
+
t.register((e) => new l(e));
|
|
52
|
+
let n = (await t.loadAsync(e)).userData.vrm;
|
|
53
|
+
if (!n) throw Error("Failed to load VRM data");
|
|
54
|
+
h.add(n.scene), M = n, r.value = !1;
|
|
55
|
+
} catch (e) {
|
|
56
|
+
console.error("Failed to load VRM:", e), i.value = `Failed to load avatar: ${e instanceof Error ? e.message : "Unknown error"}`, r.value = !1;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function G() {
|
|
61
|
+
if (P = requestAnimationFrame(G), !N || !j || !h || !y) return;
|
|
62
|
+
let e = N.getDelta(), n = N.getElapsedTime();
|
|
63
|
+
if (M) {
|
|
64
|
+
if (M.update(e), t.isAudioPlaying) {
|
|
65
|
+
F += e * 10;
|
|
66
|
+
let t = (Math.sin(F) + 1) * .3;
|
|
67
|
+
M.expressionManager?.setValue(p.Aa, t);
|
|
68
|
+
let r = M.humanoid?.getNormalizedBoneNode("head"), i = M.humanoid?.getNormalizedBoneNode("neck"), a = M.humanoid?.getNormalizedBoneNode("spine");
|
|
69
|
+
r && (r.rotation.x = Math.sin(n * 2) * .08, r.rotation.z = Math.sin(n * 1.5) * .05), i && (i.rotation.y = Math.sin(n * .8) * .05), a && (a.rotation.z = Math.sin(n * .5) * .03);
|
|
70
|
+
let o = M.humanoid?.getNormalizedBoneNode("leftShoulder"), s = M.humanoid?.getNormalizedBoneNode("rightShoulder"), c = M.humanoid?.getNormalizedBoneNode("leftUpperArm"), l = M.humanoid?.getNormalizedBoneNode("rightUpperArm"), u = M.humanoid?.getNormalizedBoneNode("leftLowerArm"), d = M.humanoid?.getNormalizedBoneNode("rightLowerArm");
|
|
71
|
+
o && (o.rotation.z = .1), s && (s.rotation.z = -.1), c && (c.rotation.z = -.8 + Math.sin(n * 1.2) * .1, c.rotation.x = .4 + Math.sin(n * .9) * .15, c.rotation.y = Math.sin(n * .7) * .1), l && (l.rotation.z = .8 + Math.sin(n * 1.3) * .1, l.rotation.x = .4 + Math.sin(n * 1) * .15, l.rotation.y = Math.sin(n * .8) * .1), u && (u.rotation.y = -1 - Math.sin(n * 1.5) * .2, u.rotation.z = Math.sin(n * 1.1) * .1), d && (d.rotation.y = 1 + Math.sin(n * 1.4) * .2, d.rotation.z = Math.sin(n * 1.2) * .1);
|
|
72
|
+
} else {
|
|
73
|
+
F = 0, M.expressionManager?.setValue(p.Aa, 0);
|
|
74
|
+
let e = M.humanoid?.getNormalizedBoneNode("spine"), t = M.humanoid?.getNormalizedBoneNode("head");
|
|
75
|
+
e && (e.rotation.x = Math.sin(n * .8) * .02), t && (t.rotation.x = Math.sin(n * .3) * .03, t.rotation.z = Math.sin(n * .2) * .02);
|
|
76
|
+
let r = M.humanoid?.getNormalizedBoneNode("leftShoulder"), i = M.humanoid?.getNormalizedBoneNode("rightShoulder"), a = M.humanoid?.getNormalizedBoneNode("leftUpperArm"), o = M.humanoid?.getNormalizedBoneNode("rightUpperArm"), s = M.humanoid?.getNormalizedBoneNode("leftLowerArm"), c = M.humanoid?.getNormalizedBoneNode("rightLowerArm");
|
|
77
|
+
r && (r.rotation.z = .1), i && (i.rotation.z = -.1), a && (a.rotation.z = -.9, a.rotation.x = .2, a.rotation.y = 0), o && (o.rotation.z = .9, o.rotation.x = .2, o.rotation.y = 0), s && (s.rotation.y = -.8), c && (c.rotation.y = .8);
|
|
78
|
+
}
|
|
79
|
+
n % 4 < .1 ? M.expressionManager?.setValue(p.Blink, 1) : M.expressionManager?.setValue(p.Blink, 0);
|
|
80
|
+
let r = V[I];
|
|
81
|
+
if (M.expressionManager?.setValue(p.Happy, 0), M.expressionManager?.setValue(p.Sad, 0), M.expressionManager?.setValue(p.Angry, 0), M.expressionManager?.setValue(p.Surprised, 0), r && M.expressionManager?.setValue(r, .8), L !== "none") {
|
|
82
|
+
let e = n - R, t = 1.5;
|
|
83
|
+
if (e < t) {
|
|
84
|
+
let n = e / t, r = M.humanoid?.getNormalizedBoneNode("head"), i = M.humanoid?.getNormalizedBoneNode("rightUpperArm"), a = M.humanoid?.getNormalizedBoneNode("rightLowerArm"), o = M.humanoid?.getNormalizedBoneNode("spine"), s = ((e) => e < .5 ? 2 * e * e : 1 - (-2 * e + 2) ** 2 / 2)(n < .5 ? n * 2 : (1 - n) * 2);
|
|
85
|
+
switch (L) {
|
|
86
|
+
case "nod":
|
|
87
|
+
r && (r.rotation.x = Math.sin(n * Math.PI * 3) * .2);
|
|
88
|
+
break;
|
|
89
|
+
case "shake":
|
|
90
|
+
r && (r.rotation.y = Math.sin(n * Math.PI * 4) * .3);
|
|
91
|
+
break;
|
|
92
|
+
case "wave":
|
|
93
|
+
i && (i.rotation.z = 1.5 * s, i.rotation.x = -.3 * s), a && (a.rotation.y = .5 + Math.sin(n * Math.PI * 6) * .3);
|
|
94
|
+
break;
|
|
95
|
+
case "think":
|
|
96
|
+
r && (r.rotation.x = .1 * s, r.rotation.z = .1 * s), i && (i.rotation.z = .3 * s, i.rotation.x = .8 * s), a && (a.rotation.y = 1.5 * s);
|
|
97
|
+
break;
|
|
98
|
+
case "bow":
|
|
99
|
+
o && (o.rotation.x = .4 * s), r && (r.rotation.x = .2 * s);
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
} else L = "none";
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
j.render(h, y);
|
|
106
|
+
}
|
|
107
|
+
function K() {
|
|
108
|
+
P !== null && (cancelAnimationFrame(P), P = null), window.removeEventListener("resize", U), j && n.value && (n.value.removeChild(j.domElement), j.dispose(), j = null), M &&= null, h = null, y = null, N = null;
|
|
109
|
+
}
|
|
110
|
+
return T(() => t.selectedResult, (e) => {
|
|
111
|
+
if (e?.toolName === "receptron_avatar" && e.data) {
|
|
112
|
+
let t = e.data;
|
|
113
|
+
if (t.avatarUrl && t.avatarUrl !== B && (B = t.avatarUrl, W(t.avatarUrl)), t.emotion && t.emotion !== I && (console.log("[Avatar Debug] Emotion changed to:", t.emotion), I = t.emotion), t.action && t.action !== "none") {
|
|
114
|
+
let e = t.actionTimestamp || 0;
|
|
115
|
+
e > z && (console.log("[Avatar Debug] Action triggered:", t.action), L = t.action, R = N?.getElapsedTime() || 0, z = e);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}, { deep: !0 }), b(() => {
|
|
119
|
+
if (H(), t.selectedResult?.toolName === "receptron_avatar" && t.selectedResult.data) {
|
|
120
|
+
let e = t.selectedResult.data;
|
|
121
|
+
e.avatarUrl && (B = e.avatarUrl, W(e.avatarUrl)), e.emotion && (I = e.emotion);
|
|
122
|
+
}
|
|
123
|
+
}), x(() => {
|
|
124
|
+
K();
|
|
125
|
+
}), (t, a) => (S(), _("div", E, [
|
|
126
|
+
v("div", {
|
|
127
|
+
ref_key: "containerRef",
|
|
128
|
+
ref: n,
|
|
129
|
+
class: "size-full"
|
|
130
|
+
}, null, 512),
|
|
131
|
+
r.value ? (S(), _("div", D, [...a[0] ||= [v("div", { class: "text-white text-lg" }, "Loading Avatar...", -1)]])) : g("", !0),
|
|
132
|
+
i.value ? (S(), _("div", O, [v("div", k, w(i.value), 1)])) : g("", !0),
|
|
133
|
+
e.isAudioPlaying ? (S(), _("div", A, " Speaking... ")) : g("", !0)
|
|
134
|
+
]));
|
|
135
|
+
}
|
|
136
|
+
}), M = { class: "p-3 bg-gradient-to-br from-slate-700 to-slate-800 rounded-md" }, N = { class: "flex flex-col items-center gap-2" }, P = {
|
|
137
|
+
key: 0,
|
|
138
|
+
class: "text-xs px-2 py-0.5 bg-blue-500 text-white rounded-full"
|
|
139
|
+
}, F = /* @__PURE__ */ y({
|
|
140
|
+
__name: "Preview",
|
|
141
|
+
props: { result: {} },
|
|
142
|
+
setup(e) {
|
|
143
|
+
let t = e, n = h(() => t.result.data), r = h(() => n.value?.emotion || "neutral");
|
|
144
|
+
return (e, t) => (S(), _("div", M, [v("div", N, [
|
|
145
|
+
t[0] ||= v("div", { class: "size-12 bg-slate-600 rounded-full flex items-center justify-center" }, [v("svg", {
|
|
146
|
+
class: "size-8 text-slate-300",
|
|
147
|
+
fill: "none",
|
|
148
|
+
stroke: "currentColor",
|
|
149
|
+
viewBox: "0 0 24 24"
|
|
150
|
+
}, [v("path", {
|
|
151
|
+
"stroke-linecap": "round",
|
|
152
|
+
"stroke-linejoin": "round",
|
|
153
|
+
"stroke-width": "2",
|
|
154
|
+
d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"
|
|
155
|
+
})])], -1),
|
|
156
|
+
t[1] ||= v("div", { class: "text-sm font-semibold text-white text-center" }, " 3D Avatar ", -1),
|
|
157
|
+
r.value && r.value !== "neutral" ? (S(), _("div", P, w(r.value), 1)) : g("", !0)
|
|
158
|
+
])]));
|
|
159
|
+
}
|
|
160
|
+
}), I = {
|
|
161
|
+
...n,
|
|
162
|
+
viewComponent: j,
|
|
163
|
+
previewComponent: F
|
|
164
|
+
}, L = { plugin: I };
|
|
165
|
+
//#endregion
|
|
166
|
+
export { F as Preview, r as SAMPLES, t as TOOL_DEFINITION, e as TOOL_NAME, j as View, L as default, i as executeAvatar, I as plugin, n as pluginCore };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gui-chat-plugin/avatar",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"description": "3D Avatar Plugin for GUIChat - VRM avatar with lip-sync",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -56,26 +56,27 @@
|
|
|
56
56
|
}
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
|
-
"@
|
|
59
|
+
"@eslint/js": "^10.0.1",
|
|
60
|
+
"@tailwindcss/vite": "^4.2.2",
|
|
60
61
|
"@types/react": "^19.0.0",
|
|
61
62
|
"@types/react-dom": "^19.0.0",
|
|
62
63
|
"@types/three": "^0.174.0",
|
|
63
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
64
|
-
"@typescript-eslint/parser": "^8.
|
|
64
|
+
"@typescript-eslint/eslint-plugin": "^8.58.0",
|
|
65
|
+
"@typescript-eslint/parser": "^8.58.0",
|
|
65
66
|
"@vitejs/plugin-react": "^4.5.0",
|
|
66
|
-
"@vitejs/plugin-vue": "^6.0.
|
|
67
|
-
"eslint": "^
|
|
68
|
-
"eslint-plugin-vue": "^10.
|
|
69
|
-
"globals": "^17.
|
|
67
|
+
"@vitejs/plugin-vue": "^6.0.5",
|
|
68
|
+
"eslint": "^10.1.0",
|
|
69
|
+
"eslint-plugin-vue": "^10.8.0",
|
|
70
|
+
"globals": "^17.4.0",
|
|
70
71
|
"openai": "^6.16.0",
|
|
71
72
|
"react": "^19.0.0",
|
|
72
73
|
"react-dom": "^19.0.0",
|
|
73
|
-
"tailwindcss": "^4.
|
|
74
|
+
"tailwindcss": "^4.2.2",
|
|
74
75
|
"typescript": "~5.9.3",
|
|
75
|
-
"vite": "^
|
|
76
|
-
"vue": "^3.5.
|
|
77
|
-
"vue-eslint-parser": "^10.
|
|
78
|
-
"vue-tsc": "^3.2.
|
|
76
|
+
"vite": "^8.0.3",
|
|
77
|
+
"vue": "^3.5.31",
|
|
78
|
+
"vue-eslint-parser": "^10.4.0",
|
|
79
|
+
"vue-tsc": "^3.2.6"
|
|
79
80
|
},
|
|
80
81
|
"keywords": [
|
|
81
82
|
"guichat",
|