55#include < Motion/CubismMotion.hpp>
66#include < vector>
77#include < string>
8- #include < iostream >
8+ #include < map >
99
1010using namespace Live2D ::Cubism::Framework;
1111using namespace Live2D ::Cubism::Framework::Rendering;
@@ -20,6 +20,7 @@ class JniUserModel : public CubismUserModel {
2020 ~JniUserModel () {
2121 JNIEnv* env = getEnv ();
2222 if (env) env->DeleteGlobalRef (_javaObj);
23+ for (auto & pair : _expressionData) pair.second .clear ();
2324 }
2425
2526 void loadModelCopy (const csmByte* buffer, csmSizeInt size) {
@@ -34,19 +35,23 @@ class JniUserModel : public CubismUserModel {
3435
3536 void loadPoseCopy (const csmByte* buffer, csmSizeInt size) {
3637 _poseData.assign (buffer, buffer + size);
37- LoadPose (_poseData.data (), (csmSizeInt)_physicsData.size ());
38+ LoadPose (_poseData.data (), (csmSizeInt)_poseData.size ());
39+ }
40+
41+ void loadExpressionCopy (const csmByte* buffer, csmSizeInt size, const std::string& name) {
42+ auto & vec = _expressionData[name];
43+ vec.assign (buffer, buffer + size);
44+ LoadExpression (vec.data (), (csmSizeInt)vec.size (), name.c_str ());
3845 }
3946
4047 void startMotion (const csmByte* buffer, csmSizeInt size, int priority) {
4148 auto * motion = CubismMotion::Create (buffer, size);
4249 if (!motion) return ;
43-
4450 motion->SetFinishedMotionHandlerAndMotionCustomData ([](ACubismMotion* self) {
45- auto * model = static_cast <JniUserModel*>(self->GetFinishedMotionCustomData ());
46- model ->notifyFinished ();
51+ auto * m = static_cast <JniUserModel*>(self->GetFinishedMotionCustomData ());
52+ m ->notifyFinished ();
4753 CubismMotion::Delete (static_cast <CubismMotion*>(self));
4854 }, this );
49-
5055 _motionManager->StartMotionPriority (motion, true , priority);
5156 }
5257
@@ -60,13 +65,18 @@ class JniUserModel : public CubismUserModel {
6065 env->DeleteLocalRef (name);
6166 }
6267
68+ bool isHitTransformed (const char * id, float x, float y) {
69+ if (!_model) return false ;
70+ float mx = _modelMatrix->InvertTransformX (x);
71+ float my = _modelMatrix->InvertTransformY (y);
72+ return IsHit (CubismFramework::GetIdManager ()->GetId (id), mx, my);
73+ }
74+
6375 void update (float dt) {
6476 if (!_model) return ;
6577
6678 _model->LoadParameters ();
67- if (!_motionManager->IsFinished ()) {
68- _motionManager->UpdateMotion (_model, dt);
69- }
79+ if (!_motionManager->IsFinished ()) _motionManager->UpdateMotion (_model, dt);
7080 _model->SaveParameters ();
7181
7282 if (_pose) _pose->UpdateParameters (_model, dt);
@@ -76,7 +86,6 @@ class JniUserModel : public CubismUserModel {
7686 auto * idm = CubismFramework::GetIdManager ();
7787 _model->AddParameterValue (idm->GetId (" ParamAngleX" ), _dragManager->GetX () * 30 .0f );
7888 _model->AddParameterValue (idm->GetId (" ParamAngleY" ), _dragManager->GetY () * 30 .0f );
79- _model->AddParameterValue (idm->GetId (" ParamBodyAngleX" ), _dragManager->GetX () * 10 .0f );
8089 _model->AddParameterValue (idm->GetId (" ParamEyeBallX" ), _dragManager->GetX ());
8190 _model->AddParameterValue (idm->GetId (" ParamEyeBallY" ), _dragManager->GetY ());
8291 }
@@ -88,17 +97,14 @@ class JniUserModel : public CubismUserModel {
8897private:
8998 JNIEnv* getEnv () {
9099 JNIEnv* env;
91- if (_jvm->GetEnv ((void **)&env, JNI_VERSION_1_6) == JNI_EDETACHED) {
92- _jvm->AttachCurrentThread ((void **)&env, nullptr );
93- }
100+ if (_jvm->GetEnv ((void **)&env, JNI_VERSION_1_6) == JNI_EDETACHED) _jvm->AttachCurrentThread ((void **)&env, nullptr );
94101 return env;
95102 }
96103
97104 JavaVM* _jvm;
98105 jobject _javaObj;
99- std::vector<csmByte> _mocData;
100- std::vector<csmByte> _physicsData;
101- std::vector<csmByte> _poseData;
106+ std::vector<csmByte> _mocData, _physicsData, _poseData;
107+ std::map<std::string, std::vector<csmByte>> _expressionData;
102108};
103109
104110extern " C" {
@@ -133,21 +139,21 @@ JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_loadPoseNative(
133139}
134140
135141JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_loadExpressionNative (JNIEnv* env, jclass, jlong ptr, jbyteArray buffer, jstring name) {
142+ const char * n = env->GetStringUTFChars (name, nullptr );
136143 jsize len = env->GetArrayLength (buffer);
137144 jbyte* data = env->GetByteArrayElements (buffer, nullptr );
138- const char * n = env->GetStringUTFChars (name, nullptr );
139- ((JniUserModel*)ptr)->LoadExpression ((const csmByte*)data, len, n);
140- env->ReleaseStringUTFChars (name, n);
145+ ((JniUserModel*)ptr)->loadExpressionCopy ((const csmByte*)data, len, n);
141146 env->ReleaseByteArrayElements (buffer, data, JNI_ABORT);
147+ env->ReleaseStringUTFChars (name, n);
142148}
143149
144150JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_createRendererNative (JNIEnv*, jclass, jlong ptr) {
145151 ((JniUserModel*)ptr)->CreateRenderer ();
146152}
147153
148154JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_registerTextureNative (JNIEnv*, jclass, jlong ptr, jint index, jint textureId) {
149- auto * renderer = ((JniUserModel*)ptr)->GetRenderer <CubismRenderer_OpenGLES2>();
150- if (renderer) renderer ->BindTexture (index, (GLuint)textureId);
155+ auto * r = ((JniUserModel*)ptr)->GetRenderer <CubismRenderer_OpenGLES2>();
156+ if (r) r ->BindTexture (index, (GLuint)textureId);
151157}
152158
153159JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_setDraggingNative (JNIEnv*, jclass, jlong ptr, jfloat x, jfloat y) {
@@ -156,7 +162,7 @@ JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_setDraggingNati
156162
157163JNIEXPORT jboolean JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_isHitNative (JNIEnv* env, jclass, jlong ptr, jstring id, jfloat x, jfloat y) {
158164 const char * s = env->GetStringUTFChars (id, nullptr );
159- bool hit = ((JniUserModel*)ptr)->IsHit ( CubismFramework::GetIdManager ()-> GetId (s) , x, y);
165+ bool hit = ((JniUserModel*)ptr)->isHitTransformed (s , x, y);
160166 env->ReleaseStringUTFChars (id, s);
161167 return hit;
162168}
@@ -189,24 +195,21 @@ JNIEXPORT jfloat JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_getCanvasHeig
189195JNIEXPORT jobjectArray JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_getDrawableIdsNative (JNIEnv* env, jclass, jlong ptr) {
190196 auto * model = ((JniUserModel*)ptr)->GetModel ();
191197 int count = model->GetDrawableCount ();
192- jclass strCls = env->FindClass (" java/lang/String" );
193- jobjectArray res = env->NewObjectArray (count, strCls, nullptr );
198+ jobjectArray res = env->NewObjectArray (count, env->FindClass (" java/lang/String" ), nullptr );
194199 for (int i = 0 ; i < count; i++) {
195- env->SetObjectArrayElement (res, i, env->NewStringUTF (model->GetDrawableId (i)->GetString ().GetRawString ()));
200+ jstring s = env->NewStringUTF (model->GetDrawableId (i)->GetString ().GetRawString ());
201+ env->SetObjectArrayElement (res, i, s);
202+ env->DeleteLocalRef (s);
196203 }
197204 return res;
198205}
199206
200207JNIEXPORT void JNICALL Java_dev_eatgrapes_live2d_CubismUserModel_drawNative (JNIEnv* env, jclass, jlong ptr, jfloatArray matrix) {
201208 jfloat* m_ptr = env->GetFloatArrayElements (matrix, nullptr );
202- CubismMatrix44 m;
203- m.SetMatrix (m_ptr);
204- auto * renderer = ((JniUserModel*)ptr)->GetRenderer <CubismRenderer_OpenGLES2>();
205- if (renderer) {
206- renderer->SetMvpMatrix (&m);
207- renderer->DrawModel ();
208- }
209+ CubismMatrix44 m; m.SetMatrix (m_ptr);
210+ auto * r = ((JniUserModel*)ptr)->GetRenderer <CubismRenderer_OpenGLES2>();
211+ if (r) { r->SetMvpMatrix (&m); r->DrawModel (); }
209212 env->ReleaseFloatArrayElements (matrix, m_ptr, JNI_ABORT);
210213}
211214
212- }
215+ }
0 commit comments