Skip to content

Commit d8f91b6

Browse files
committed
Character: refactor 5 methods to use direct buffers
1 parent aaf031a commit d8f91b6

4 files changed

Lines changed: 51 additions & 59 deletions

File tree

src/main/java/com/github/stephengold/joltjni/Character.java

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ of this software and associated documentation files (the "Software"), to deal
2828
import com.github.stephengold.joltjni.readonly.QuatArg;
2929
import com.github.stephengold.joltjni.readonly.RVec3Arg;
3030
import com.github.stephengold.joltjni.readonly.Vec3Arg;
31+
import java.nio.DoubleBuffer;
32+
import java.nio.FloatBuffer;
3133

3234
/**
3335
* A character implemented using a kinematic rigid body.
@@ -568,7 +570,7 @@ public RVec3 getCenterOfMassPosition() {
568570
@Override
569571
public RVec3 getCenterOfMassPosition(boolean lockBodies) {
570572
long characterVa = va();
571-
double[] storeDoubles = new double[3];
573+
DoubleBuffer storeDoubles = Temporaries.doubleBuffer1.get();
572574
getCenterOfMassPosition(characterVa, storeDoubles, lockBodies);
573575
RVec3 result = new RVec3(storeDoubles);
574576

@@ -652,7 +654,7 @@ public Vec3 getLinearVelocity() {
652654
@Override
653655
public Vec3 getLinearVelocity(boolean lockBodies) {
654656
long characterVa = va();
655-
float[] storeFloats = new float[3];
657+
FloatBuffer storeFloats = Temporaries.floatBuffer1.get();
656658
getLinearVelocity(characterVa, storeFloats, lockBodies);
657659
Vec3 result = new Vec3(storeFloats);
658660

@@ -691,7 +693,7 @@ public RVec3 getPosition() {
691693
@Override
692694
public RVec3 getPosition(boolean lockBodies) {
693695
long characterVa = va();
694-
double[] storeDoubles = new double[3];
696+
DoubleBuffer storeDoubles = Temporaries.doubleBuffer1.get();
695697
getPosition(characterVa, storeDoubles, lockBodies);
696698
RVec3 result = new RVec3(storeDoubles);
697699

@@ -727,8 +729,8 @@ public void getPositionAndRotation(
727729
public void getPositionAndRotation(
728730
RVec3 storeLocation, Quat storeOrientation, boolean lockBodies) {
729731
long characterVa = va();
730-
double[] storeDoubles = new double[3];
731-
float[] storeFloats = new float[4];
732+
DoubleBuffer storeDoubles = Temporaries.doubleBuffer1.get();
733+
FloatBuffer storeFloats = Temporaries.floatBuffer1.get();
732734
getPositionAndRotation(
733735
characterVa, storeDoubles, storeFloats, lockBodies);
734736
storeLocation.set(storeDoubles);
@@ -757,7 +759,7 @@ public Quat getRotation() {
757759
@Override
758760
public Quat getRotation(boolean lockBodies) {
759761
long characterVa = va();
760-
float[] storeFloats = new float[4];
762+
FloatBuffer storeFloats = Temporaries.floatBuffer1.get();
761763
getRotation(characterVa, storeFloats, lockBodies);
762764
Quat result = new Quat(storeFloats);
763765

@@ -856,24 +858,25 @@ native private static long createCharacter(
856858
native static int getBodyId(long characterVa);
857859

858860
native static void getCenterOfMassPosition(
859-
long characterVa, double[] storeDoubles, boolean lockBodies);
861+
long characterVa, DoubleBuffer storeDoubles, boolean lockBodies);
860862

861863
native static long getCharacterSettings(
862864
long characterVa, boolean lockBodies);
863865

864866
native static int getLayer(long characterVa);
865867

866868
native static void getLinearVelocity(
867-
long characterVa, float[] storeFloats, boolean lockBodies);
869+
long characterVa, FloatBuffer storeFloats, boolean lockBodies);
868870

869871
native static void getPosition(
870-
long characterVa, double[] storeDoubles, boolean lockBodies);
872+
long characterVa, DoubleBuffer storeDoubles, boolean lockBodies);
871873

872-
native static void getPositionAndRotation(long characterVa,
873-
double[] storeDoubles, float[] storeFloats, boolean lockBodies);
874+
native static void getPositionAndRotation(
875+
long characterVa, DoubleBuffer storeDoubles,
876+
FloatBuffer storeFloats, boolean lockBodies);
874877

875878
native static void getRotation(
876-
long characterVa, float[] toreFloats, boolean lockBodies);
879+
long characterVa, FloatBuffer storeFloats, boolean lockBodies);
877880

878881
native static long getTransformedShape(
879882
long characterVa, boolean lockBodies);

src/main/java/com/github/stephengold/joltjni/CharacterRef.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ public RVec3 getCenterOfMassPosition() {
293293
@Override
294294
public RVec3 getCenterOfMassPosition(boolean lockBodies) {
295295
long characterVa = targetVa();
296-
double[] storeDoubles = new double[3];
296+
DoubleBuffer storeDoubles = Temporaries.doubleBuffer1.get();
297297
com.github.stephengold.joltjni.Character.getCenterOfMassPosition(
298298
characterVa, storeDoubles, lockBodies);
299299
RVec3 result = new RVec3(storeDoubles);
@@ -520,7 +520,7 @@ public Vec3 getLinearVelocity() {
520520
@Override
521521
public Vec3 getLinearVelocity(boolean lockBodies) {
522522
long characterVa = targetVa();
523-
float[] storeFloats = new float[3];
523+
FloatBuffer storeFloats = Temporaries.floatBuffer1.get();
524524
com.github.stephengold.joltjni.Character.getLinearVelocity(
525525
characterVa, storeFloats, lockBodies);
526526
Vec3 result = new Vec3(storeFloats);
@@ -562,7 +562,7 @@ public RVec3 getPosition() {
562562
@Override
563563
public RVec3 getPosition(boolean lockBodies) {
564564
long characterVa = targetVa();
565-
double[] storeDoubles = new double[3];
565+
DoubleBuffer storeDoubles = Temporaries.doubleBuffer1.get();
566566
com.github.stephengold.joltjni.Character.getPosition(
567567
characterVa, storeDoubles, lockBodies);
568568
RVec3 result = new RVec3(storeDoubles);
@@ -599,8 +599,8 @@ public void getPositionAndRotation(
599599
public void getPositionAndRotation(
600600
RVec3 storeLocation, Quat storeOrientation, boolean lockBodies) {
601601
long characterVa = targetVa();
602-
double[] storeDoubles = new double[3];
603-
float[] storeFloats = new float[4];
602+
DoubleBuffer storeDoubles = Temporaries.doubleBuffer1.get();
603+
FloatBuffer storeFloats = Temporaries.floatBuffer1.get();
604604
com.github.stephengold.joltjni.Character.getPositionAndRotation(
605605
characterVa, storeDoubles, storeFloats, lockBodies);
606606
storeLocation.set(storeDoubles);
@@ -643,7 +643,7 @@ public Quat getRotation() {
643643
@Override
644644
public Quat getRotation(boolean lockBodies) {
645645
long characterVa = targetVa();
646-
float[] storeFloats = new float[4];
646+
FloatBuffer storeFloats = Temporaries.floatBuffer1.get();
647647
com.github.stephengold.joltjni.Character.getRotation(
648648
characterVa, storeFloats, lockBodies);
649649
Quat result = new Quat(storeFloats);

src/main/java/com/github/stephengold/joltjni/CharacterRefC.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ public RVec3 getCenterOfMassPosition() {
119119
@Override
120120
public RVec3 getCenterOfMassPosition(boolean lockBodies) {
121121
long characterVa = targetVa();
122-
double[] storeDoubles = new double[3];
122+
DoubleBuffer storeDoubles = Temporaries.doubleBuffer1.get();
123123
com.github.stephengold.joltjni.Character.getCenterOfMassPosition(
124124
characterVa, storeDoubles, lockBodies);
125125
RVec3 result = new RVec3(storeDoubles);
@@ -346,7 +346,7 @@ public Vec3 getLinearVelocity() {
346346
@Override
347347
public Vec3 getLinearVelocity(boolean lockBodies) {
348348
long characterVa = targetVa();
349-
float[] storeFloats = new float[3];
349+
FloatBuffer storeFloats = Temporaries.floatBuffer1.get();
350350
com.github.stephengold.joltjni.Character.getLinearVelocity(
351351
characterVa, storeFloats, lockBodies);
352352
Vec3 result = new Vec3(storeFloats);
@@ -387,7 +387,7 @@ public RVec3 getPosition() {
387387
@Override
388388
public RVec3 getPosition(boolean lockBodies) {
389389
long characterVa = targetVa();
390-
double[] storeDoubles = new double[3];
390+
DoubleBuffer storeDoubles = Temporaries.doubleBuffer1.get();
391391
com.github.stephengold.joltjni.Character.getPosition(
392392
characterVa, storeDoubles, lockBodies);
393393
RVec3 result = new RVec3(storeDoubles);
@@ -424,8 +424,8 @@ public void getPositionAndRotation(
424424
public void getPositionAndRotation(
425425
RVec3 storeLocation, Quat storeOrientation, boolean lockBodies) {
426426
long characterVa = targetVa();
427-
double[] storeDoubles = new double[3];
428-
float[] storeFloats = new float[4];
427+
DoubleBuffer storeDoubles = Temporaries.doubleBuffer1.get();
428+
FloatBuffer storeFloats = Temporaries.floatBuffer1.get();
429429
com.github.stephengold.joltjni.Character.getPositionAndRotation(
430430
characterVa, storeDoubles, storeFloats, lockBodies);
431431
storeLocation.set(storeDoubles);
@@ -468,7 +468,7 @@ public Quat getRotation() {
468468
@Override
469469
public Quat getRotation(boolean lockBodies) {
470470
long characterVa = targetVa();
471-
float[] storeFloats = new float[4];
471+
FloatBuffer storeFloats = Temporaries.floatBuffer1.get();
472472
com.github.stephengold.joltjni.Character.getRotation(
473473
characterVa, storeFloats, lockBodies);
474474
Quat result = new Quat(storeFloats);

src/main/native/glue/ch/Character.cpp

Lines changed: 24 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright (c) 2024-2025 Stephen Gold
2+
Copyright (c) 2024-2026 Stephen Gold
33
44
Permission is hereby granted, free of charge, to any person obtaining a copy
55
of this software and associated documentation files (the "Software"), to deal
@@ -132,20 +132,18 @@ JNIEXPORT jint JNICALL Java_com_github_stephengold_joltjni_Character_getBodyId
132132
/*
133133
* Class: com_github_stephengold_joltjni_Character
134134
* Method: getCenterOfMassPosition
135-
* Signature: (J[DZ)V
135+
* Signature: (JLjava/nio/DoubleBuffer;Z)V
136136
*/
137137
JNIEXPORT void JNICALL Java_com_github_stephengold_joltjni_Character_getCenterOfMassPosition
138-
(JNIEnv *pEnv, jclass, jlong characterVa, jdoubleArray storeDoubles, jboolean lockBodies) {
138+
(JNIEnv *pEnv, jclass, jlong characterVa, jobject storeDoubles, jboolean lockBodies) {
139139
const Character * const pCharacter
140140
= reinterpret_cast<Character *> (characterVa);
141141
const RVec3 location = pCharacter->GetCenterOfMassPosition(lockBodies);
142-
jboolean isCopy;
143-
jdouble * const pStoreDoubles
144-
= pEnv->GetDoubleArrayElements(storeDoubles, &isCopy);
142+
DIRECT_DOUBLE_BUFFER(pEnv, storeDoubles, pStoreDoubles, capacityDoubles);
143+
JPH_ASSERT(capacityDoubles >= 3);
145144
pStoreDoubles[0] = location.GetX();
146145
pStoreDoubles[1] = location.GetY();
147146
pStoreDoubles[2] = location.GetZ();
148-
pEnv->ReleaseDoubleArrayElements(storeDoubles, pStoreDoubles, 0);
149147
}
150148

151149
/*
@@ -179,88 +177,79 @@ JNIEXPORT jint JNICALL Java_com_github_stephengold_joltjni_Character_getLayer
179177
/*
180178
* Class: com_github_stephengold_joltjni_Character
181179
* Method: getLinearVelocity
182-
* Signature: (J[FZ)V
180+
* Signature: (JLjava/nio/FloatBuffer;Z)V
183181
*/
184182
JNIEXPORT void JNICALL Java_com_github_stephengold_joltjni_Character_getLinearVelocity
185-
(JNIEnv *pEnv, jclass, jlong characterVa, jfloatArray storeFloats, jboolean lockBodies) {
183+
(JNIEnv *pEnv, jclass, jlong characterVa, jobject storeFloats, jboolean lockBodies) {
186184
const Character * const pCharacter
187185
= reinterpret_cast<Character *> (characterVa);
188186
const Vec3 velocity = pCharacter->GetLinearVelocity(lockBodies);
189-
jboolean isCopy;
190-
jfloat * const pStoreFloats
191-
= pEnv->GetFloatArrayElements(storeFloats, &isCopy);
187+
DIRECT_FLOAT_BUFFER(pEnv, storeFloats, pStoreFloats, capacityFloats);
188+
JPH_ASSERT(capacityFloats >= 3);
192189
pStoreFloats[0] = velocity.GetX();
193190
pStoreFloats[1] = velocity.GetY();
194191
pStoreFloats[2] = velocity.GetZ();
195-
pEnv->ReleaseFloatArrayElements(storeFloats, pStoreFloats, 0);
196192
}
197193

198194
/*
199195
* Class: com_github_stephengold_joltjni_Character
200196
* Method: getPosition
201-
* Signature: (J[DZ)V
197+
* Signature: (JLjava/nio/DoubleBuffer;Z)V
202198
*/
203199
JNIEXPORT void JNICALL Java_com_github_stephengold_joltjni_Character_getPosition
204-
(JNIEnv *pEnv, jclass, jlong characterVa, jdoubleArray storeDoubles, jboolean lockBodies) {
200+
(JNIEnv *pEnv, jclass, jlong characterVa, jobject storeDoubles, jboolean lockBodies) {
205201
const Character * const pCharacter
206202
= reinterpret_cast<Character *> (characterVa);
207203
const RVec3 location = pCharacter->GetPosition(lockBodies);
208-
jboolean isCopy;
209-
jdouble * const pStoreDoubles
210-
= pEnv->GetDoubleArrayElements(storeDoubles, &isCopy);
204+
DIRECT_DOUBLE_BUFFER(pEnv, storeDoubles, pStoreDoubles, capacityDoubles);
205+
JPH_ASSERT(capacityDoubles >= 3);
211206
pStoreDoubles[0] = location.GetX();
212207
pStoreDoubles[1] = location.GetY();
213208
pStoreDoubles[2] = location.GetZ();
214-
pEnv->ReleaseDoubleArrayElements(storeDoubles, pStoreDoubles, 0);
215209
}
216210

217211
/*
218212
* Class: com_github_stephengold_joltjni_Character
219213
* Method: getPositionAndRotation
220-
* Signature: (J[D[FZ)V
214+
* Signature: (JLjava/nio/DoubleBuffer;Ljava/nio/FloatBuffer;Z)V
221215
*/
222216
JNIEXPORT void JNICALL Java_com_github_stephengold_joltjni_Character_getPositionAndRotation
223-
(JNIEnv *pEnv, jclass, jlong characterVa, jdoubleArray storeDoubles,
224-
jfloatArray storeFloats, jboolean lockBodies) {
217+
(JNIEnv *pEnv, jclass, jlong characterVa, jobject storeDoubles,
218+
jobject storeFloats, jboolean lockBodies) {
225219
const Character * const pCharacter
226220
= reinterpret_cast<Character *> (characterVa);
227221
RVec3 location;
228222
Quat orientation;
229223
pCharacter->GetPositionAndRotation(location, orientation, lockBodies);
230-
jboolean isCopy;
231-
jdouble * const pStoreDoubles
232-
= pEnv->GetDoubleArrayElements(storeDoubles, &isCopy);
224+
DIRECT_DOUBLE_BUFFER(pEnv, storeDoubles, pStoreDoubles, capacityDoubles);
225+
JPH_ASSERT(capacityDoubles >= 3);
233226
pStoreDoubles[0] = location.GetX();
234227
pStoreDoubles[1] = location.GetY();
235228
pStoreDoubles[2] = location.GetZ();
236-
pEnv->ReleaseDoubleArrayElements(storeDoubles, pStoreDoubles, 0);
237-
jfloat * const pStoreFloats
238-
= pEnv->GetFloatArrayElements(storeFloats, &isCopy);
229+
DIRECT_FLOAT_BUFFER(pEnv, storeFloats, pStoreFloats, capacityFloats);
230+
JPH_ASSERT(capacityFloats >= 4);
239231
pStoreFloats[0] = orientation.GetX();
240232
pStoreFloats[1] = orientation.GetY();
241233
pStoreFloats[2] = orientation.GetZ();
242234
pStoreFloats[3] = orientation.GetW();
243-
pEnv->ReleaseFloatArrayElements(storeFloats, pStoreFloats, 0);
244235
}
245236

246237
/*
247238
* Class: com_github_stephengold_joltjni_Character
248239
* Method: getRotation
249-
* Signature: (J[FZ)V
240+
* Signature: (JLjava/nio/FloatBuffer;Z)V
250241
*/
251242
JNIEXPORT void JNICALL Java_com_github_stephengold_joltjni_Character_getRotation
252-
(JNIEnv *pEnv, jclass, jlong characterVa, jfloatArray storeFloats, jboolean lockBodies) {
243+
(JNIEnv *pEnv, jclass, jlong characterVa, jobject storeFloats, jboolean lockBodies) {
253244
const Character * const pCharacter
254245
= reinterpret_cast<Character *> (characterVa);
255246
const Quat orientation = pCharacter->GetRotation(lockBodies);
256-
jboolean isCopy;
257-
jfloat * const pStoreFloats
258-
= pEnv->GetFloatArrayElements(storeFloats, &isCopy);
247+
DIRECT_FLOAT_BUFFER(pEnv, storeFloats, pStoreFloats, capacityFloats);
248+
JPH_ASSERT(capacityFloats >= 4);
259249
pStoreFloats[0] = orientation.GetX();
260250
pStoreFloats[1] = orientation.GetY();
261251
pStoreFloats[2] = orientation.GetZ();
262252
pStoreFloats[3] = orientation.GetW();
263-
pEnv->ReleaseFloatArrayElements(storeFloats, pStoreFloats, 0);
264253
}
265254

266255
/*

0 commit comments

Comments
 (0)