33#include < Id/CubismIdManager.hpp>
44#include < Rendering/OpenGL/CubismRenderer_OpenGLES2.hpp>
55#include < Motion/CubismMotion.hpp>
6+ #include < Motion/CubismExpressionMotion.hpp>
67#include < vector>
78#include < string>
89#include < map>
@@ -26,6 +27,7 @@ class JniUserModel : public CubismUserModel {
2627 JNIEnv* env = getEnv ();
2728 if (env && _javaObj) env->DeleteGlobalRef (_javaObj);
2829 for (auto & it : _motionBuffers) CubismMotion::Delete (it.first );
30+ for (auto & it : _expressions) ACubismMotion::Delete (it.second );
2931 }
3032
3133 void loadModelCopy (const csmByte* buffer, csmSizeInt size) {
@@ -44,6 +46,21 @@ class JniUserModel : public CubismUserModel {
4446 LoadPose (_poseBuffer.data (), (csmSizeInt)_poseBuffer.size ());
4547 }
4648
49+ void loadExpressionCopy (const csmByte* buffer, csmSizeInt size, const std::string& name) {
50+ std::vector<csmByte> exprBuf (buffer, buffer + size);
51+ auto * expr = LoadExpression (exprBuf.data (), (csmSizeInt)exprBuf.size (), name.c_str ());
52+ if (expr) {
53+ _expressions[name] = expr;
54+ _expressionBuffers[name] = std::move (exprBuf);
55+ }
56+ }
57+
58+ void setExpression (const std::string& name) {
59+ if (_expressions.count (name)) {
60+ _expressionManager->StartMotionPriority (_expressions[name], false , 3 );
61+ }
62+ }
63+
4764 void startMotionCopy (const csmByte* buffer, csmSizeInt size, int priority, bool loop) {
4865 std::vector<csmByte> motionBuf (buffer, buffer + size);
4966 auto * motion = CubismMotion::Create (motionBuf.data (), (csmSizeInt)motionBuf.size ());
@@ -87,6 +104,10 @@ class JniUserModel : public CubismUserModel {
87104 _motionManager->UpdateMotion (_model, dt);
88105 _model->SaveParameters ();
89106
107+ if (_expressionManager) {
108+ _expressionManager->UpdateMotion (_model, dt);
109+ }
110+
90111 if (_pose) _pose->UpdateParameters (_model, dt);
91112
92113 if (_dragManager) {
@@ -130,6 +151,8 @@ class JniUserModel : public CubismUserModel {
130151 jobject _javaObj = nullptr ;
131152 std::vector<csmByte> _mocBuffer, _physicsBuffer, _poseBuffer;
132153 std::map<CubismMotion*, std::vector<csmByte>> _motionBuffers;
154+ std::map<std::string, std::vector<csmByte>> _expressionBuffers;
155+ std::map<std::string, ACubismMotion*> _expressions;
133156 std::vector<CubismMotion*> _pendingDeletion;
134157 std::mutex _pendingMutex;
135158};
@@ -176,11 +199,17 @@ JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_loadExpressionN
176199 const char * n = env->GetStringUTFChars (name, nullptr );
177200 jsize len = env->GetArrayLength (buffer);
178201 jbyte* data = env->GetByteArrayElements (buffer, nullptr );
179- ((JniUserModel*)ptr)->LoadExpression ((const csmByte*)data, len, n);
202+ ((JniUserModel*)ptr)->loadExpressionCopy ((const csmByte*)data, len, n);
180203 env->ReleaseByteArrayElements (buffer, data, JNI_ABORT);
181204 env->ReleaseStringUTFChars (name, n);
182205}
183206
207+ JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_setExpressionNative (JNIEnv* env, jclass, jlong ptr, jstring name) {
208+ const char * n = env->GetStringUTFChars (name, nullptr );
209+ ((JniUserModel*)ptr)->setExpression (n);
210+ env->ReleaseStringUTFChars (name, n);
211+ }
212+
184213JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_createRendererNative (JNIEnv*, jclass, jlong ptr) {
185214 ((JniUserModel*)ptr)->CreateRenderer ();
186215}
0 commit comments