OSDN Git Service

merge from MikuMikuStudio nativebullet.
[mikumikustudio/libgdx-mikumikustudio.git] / extensions / gdx-bullet / jni / src / mikumikustudio / projectkyoto_jme3_mmd_nativelib_SkinUtil.cpp
1 #include "projectkyoto_jme3_mmd_nativelib_SkinUtil.h"
2 #include <memory.h>
3 #include <string.h>
4 #include <math.h>
5 /*
6  * Class:     projectkyoto_jme3_mmd_SkinUtil
7  * Method:    copy
8  * Signature: (Ljava/nio/Buffer;Ljava/nio/Buffer;I)V
9  */
10 JNIEXPORT void JNICALL Java_projectkyoto_jme3_mmd_nativelib_SkinUtil_copy
11   (JNIEnv *env, jclass clazz, jobject src, jobject dist, jint size) {
12     memcpy(env->GetDirectBufferAddress(dist), env->GetDirectBufferAddress(src), size);
13 }
14
15 /*
16  * Class:     projectkyoto_jme3_mmd_nativelib_SkinUtil
17  * Method:    setSkin
18  * Signature: (Ljava/nio/FloatBuffer;Ljava/nio/ShortBuffer;Ljava/nio/FloatBuffer;F)V
19  */
20 JNIEXPORT void JNICALL Java_projectkyoto_jme3_mmd_nativelib_SkinUtil_setSkin
21   (JNIEnv *env, jclass clazz, jobject buf, jobject indexBuf, jobject skinBuf, jfloat weight) {
22     jfloat *dist = (jfloat *)env->GetDirectBufferAddress(buf);
23     jshort *ip = (jshort *)env->GetDirectBufferAddress(indexBuf);
24     jfloat *skin = (jfloat *)env->GetDirectBufferAddress(skinBuf);
25     jlong size = env->GetDirectBufferCapacity(indexBuf);
26     for(int i=0;i<size;i++) {
27         int index = ip[i];
28         jfloat *p1 = &dist[index * 3];
29         jfloat *p2 = &skin[i * 3];
30         *p1 = *p1 + *p2 * weight;
31         p1++;
32         p2++;
33         *p1 = *p1 + *p2 * weight;
34         p1++;
35         p2++;
36         *p1 = *p1 + *p2 * weight;
37     }
38 }
39 JNIEXPORT void JNICALL Java_projectkyoto_jme3_mmd_nativelib_SkinUtil_copyBoneMatrix
40   (JNIEnv *env, jclass clazz, jobject srcBuf, jobject distBuf, jobject indexBuf) {
41     jfloat *src = (jfloat *)env->GetDirectBufferAddress(srcBuf);
42     jfloat *dist = (jfloat *)env->GetDirectBufferAddress(distBuf);
43     jshort *index = (jshort *)env->GetDirectBufferAddress(indexBuf);
44     jlong size = env->GetDirectBufferCapacity(indexBuf);
45     jfloat *p = dist;
46     for(int i=0;i<size;i++) {
47         memcpy(p, src + index[i] * 16, sizeof(jfloat) * 16);
48         p += 16;
49     }
50 }
51 /*
52  * Class:     projectkyoto_jme3_mmd_nativelib_SkinUtil
53  * Method:    clear
54  * Signature: (Ljava/nio/Buffer;)V
55  */
56 JNIEXPORT void JNICALL Java_projectkyoto_jme3_mmd_nativelib_SkinUtil_clear
57   (JNIEnv *env, jclass clazz, jobject buf) {
58     jfloat *src = (jfloat *)env->GetDirectBufferAddress(buf);
59     jlong size = env->GetDirectBufferCapacity(buf);
60     memset(src, 0, size);
61 }
62