1 #include "mathtypes.h"
2 #include <stdio.h>
3 #include <string.h>
4
5 ////////////////////////////////
6 //////// btVector3 ////////
7 ////////////////////////////////
8 static jfieldID vector3_x = NULL, vector3_y = NULL, vector3_z = NULL;
9
vector3_getFields(JNIEnv * const & jenv,jobject & v3)10 void vector3_getFields(JNIEnv * const &jenv, jobject &v3) {
11 jclass cls = jenv->GetObjectClass(v3);
12 vector3_x = jenv->GetFieldID(cls, "x", "F");
13 vector3_y = jenv->GetFieldID(cls, "y", "F");
14 vector3_z = jenv->GetFieldID(cls, "z", "F");
15 jenv->DeleteLocalRef(cls);
16 }
17
vector3_ensurefields(JNIEnv * const & jenv,jobject & v3)18 inline void vector3_ensurefields(JNIEnv * const &jenv, jobject &v3) {
19 if (!vector3_x) vector3_getFields(jenv, v3);
20 }
21
Vector3_to_btVector3(JNIEnv * const & jenv,btVector3 & target,jobject & source)22 void Vector3_to_btVector3(JNIEnv * const &jenv, btVector3 &target, jobject &source)
23 {
24 vector3_ensurefields(jenv, source);
25 target.setValue(jenv->GetFloatField(source, vector3_x), jenv->GetFloatField(source, vector3_y), jenv->GetFloatField(source, vector3_z));
26 }
27
btVector3_to_Vector3(JNIEnv * const & jenv,jobject & target,const btVector3 & source)28 void btVector3_to_Vector3(JNIEnv * const &jenv, jobject &target, const btVector3 &source)
29 {
30 vector3_ensurefields(jenv, target);
31 jenv->SetFloatField(target, vector3_x, source.getX());
32 jenv->SetFloatField(target, vector3_y, source.getY());
33 jenv->SetFloatField(target, vector3_z, source.getZ());
34 }
35
36
37
38 ////////////////////////////////
39 //////// btQuaternion ////////
40 ////////////////////////////////
41 static jfieldID quaternion_x = NULL, quaternion_y = NULL, quaternion_z = NULL, quaternion_w = NULL;
42
quaternion_getFields(JNIEnv * const & jenv,jobject & q)43 void quaternion_getFields(JNIEnv * const &jenv, jobject &q) {
44 jclass cls = jenv->GetObjectClass(q);
45 quaternion_x = jenv->GetFieldID(cls, "x", "F");
46 quaternion_y = jenv->GetFieldID(cls, "y", "F");
47 quaternion_z = jenv->GetFieldID(cls, "z", "F");
48 quaternion_w = jenv->GetFieldID(cls, "w", "F");
49 jenv->DeleteLocalRef(cls);
50 }
51
quaternion_ensurefields(JNIEnv * const & jenv,jobject & q)52 inline void quaternion_ensurefields(JNIEnv * const &jenv, jobject &q) {
53 if (!quaternion_x) quaternion_getFields(jenv, q);
54 }
55
Quaternion_to_btQuaternion(JNIEnv * const & jenv,btQuaternion & target,jobject & source)56 void Quaternion_to_btQuaternion(JNIEnv * const &jenv, btQuaternion &target, jobject &source)
57 {
58 quaternion_ensurefields(jenv, source);
59 target.setValue(
60 jenv->GetFloatField(source, quaternion_x),
61 jenv->GetFloatField(source, quaternion_y),
62 jenv->GetFloatField(source, quaternion_z),
63 jenv->GetFloatField(source, quaternion_w));
64 }
65
btQuaternion_to_Quaternion(JNIEnv * const & jenv,jobject & target,const btQuaternion & source)66 void btQuaternion_to_Quaternion(JNIEnv * const &jenv, jobject &target, const btQuaternion & source)
67 {
68 quaternion_ensurefields(jenv, target);
69 jenv->SetFloatField(target, quaternion_x, source.getX());
70 jenv->SetFloatField(target, quaternion_y, source.getY());
71 jenv->SetFloatField(target, quaternion_z, source.getZ());
72 jenv->SetFloatField(target, quaternion_w, source.getW());
73 }
74
75 ////////////////////////////////
76 //////// btMatrix3x3 ////////
77 ////////////////////////////////
78 static jfieldID matrix3_val = NULL;
79
matrix3_getFields(JNIEnv * const & jenv,jobject & m3)80 void matrix3_getFields(JNIEnv * const &jenv, jobject &m3) {
81 jclass cls = jenv->GetObjectClass(m3);
82 matrix3_val = jenv->GetFieldID(cls, "val", "[F");
83 jenv->DeleteLocalRef(cls);
84 }
85
matrix3_ensurefields(JNIEnv * const & jenv,jobject & m3)86 inline void matrix3_ensurefields(JNIEnv * const &jenv, jobject &m3) {
87 if (!matrix3_val) matrix3_getFields(jenv, m3);
88 }
89
Matrix3_to_btMatrix3(JNIEnv * const & jenv,btMatrix3x3 & target,jobject & source)90 void Matrix3_to_btMatrix3(JNIEnv * const &jenv, btMatrix3x3 &target, jobject &source)
91 {
92 matrix3_ensurefields(jenv, source);
93
94 jfloatArray valArray = (jfloatArray) jenv->GetObjectField(source, matrix3_val);
95 jfloat * elements = jenv->GetFloatArrayElements(valArray, NULL);
96
97 // Convert to column-major
98 target.setValue(
99 elements[0], elements[3], elements[6],
100 elements[1], elements[4], elements[7],
101 elements[2], elements[5], elements[8]);
102
103 jenv->ReleaseFloatArrayElements(valArray, elements, JNI_ABORT);
104 jenv->DeleteLocalRef(valArray);
105 }
106
btMatrix3_to_Matrix3(JNIEnv * const & jenv,jobject & target,const btMatrix3x3 & source)107 void btMatrix3_to_Matrix3(JNIEnv * const &jenv, jobject &target, const btMatrix3x3 &source)
108 {
109 matrix3_ensurefields(jenv, target);
110
111 jfloatArray valArray = (jfloatArray) jenv->GetObjectField(target, matrix3_val);
112 jfloat * elements = jenv->GetFloatArrayElements(valArray, NULL);
113
114 // Convert to column-major
115 elements[0] = (jfloat) source.getColumn(0).getX();
116 elements[1] = (jfloat) source.getColumn(0).getY();
117 elements[2] = (jfloat) source.getColumn(0).getZ();
118 elements[3] = (jfloat) source.getColumn(1).getX();
119 elements[4] = (jfloat) source.getColumn(1).getY();
120 elements[5] = (jfloat) source.getColumn(1).getZ();
121 elements[6] = (jfloat) source.getColumn(2).getX();
122 elements[7] = (jfloat) source.getColumn(2).getY();
123 elements[8] = (jfloat) source.getColumn(2).getZ();
124
125 jenv->ReleaseFloatArrayElements(valArray, elements, 0);
126 jenv->DeleteLocalRef(valArray);
127 }
128
129 ////////////////////////////////
130 //////// btTransform ////////
131 ////////////////////////////////
132 static jfieldID matrix4_val = NULL;
133
matrix4_getFields(JNIEnv * const & jenv,jobject & m4)134 void matrix4_getFields(JNIEnv * const &jenv, jobject &m4) {
135 jclass cls = jenv->GetObjectClass(m4);
136 matrix4_val = jenv->GetFieldID(cls, "val", "[F");
137 jenv->DeleteLocalRef(cls);
138 }
139
matrix4_ensurefields(JNIEnv * const & jenv,jobject & m4)140 inline void matrix4_ensurefields(JNIEnv * const &jenv, jobject &m4) {
141 if (!matrix4_val) matrix4_getFields(jenv, m4);
142 }
143
Matrix4_to_btTransform(JNIEnv * const & jenv,btTransform & target,jobject & source)144 void Matrix4_to_btTransform(JNIEnv * const &jenv, btTransform &target, jobject &source)
145 {
146 matrix4_ensurefields(jenv, source);
147
148 jfloatArray valArray = (jfloatArray) jenv->GetObjectField(source, matrix4_val);
149 jfloat * elements = jenv->GetFloatArrayElements(valArray, NULL);
150
151 target.setFromOpenGLMatrix(elements);
152
153 jenv->ReleaseFloatArrayElements(valArray, elements, JNI_ABORT);
154 jenv->DeleteLocalRef(valArray);
155 }
156
btTransform_to_Matrix4(JNIEnv * const & jenv,jobject & target,const btTransform & source)157 void btTransform_to_Matrix4(JNIEnv * const &jenv, jobject &target, const btTransform &source)
158 {
159 matrix4_ensurefields(jenv, target);
160
161 jfloatArray valArray = (jfloatArray) jenv->GetObjectField(target, matrix4_val);
162 jfloat * elements = jenv->GetFloatArrayElements(valArray, NULL);
163
164 ATTRIBUTE_ALIGNED16(btScalar dst[16]);
165 source.getOpenGLMatrix(dst);
166
167 memcpy(elements, dst, sizeof(btScalar)*16);
168
169 jenv->ReleaseFloatArrayElements(valArray, elements, 0);
170 jenv->DeleteLocalRef(valArray);
171 }