diff --git a/engine/src/bullet/com/jme3/bullet/objects/PhysicsVehicle.java b/engine/src/bullet/com/jme3/bullet/objects/PhysicsVehicle.java index a85a081ea..1f0176364 100644 --- a/engine/src/bullet/com/jme3/bullet/objects/PhysicsVehicle.java +++ b/engine/src/bullet/com/jme3/bullet/objects/PhysicsVehicle.java @@ -67,7 +67,7 @@ public class PhysicsVehicle extends PhysicsRigidBody { protected long vehicleId = 0; protected long rayCasterId = 0; - protected VehicleTuning tuning; + protected VehicleTuning tuning = new VehicleTuning(); protected ArrayList wheels = new ArrayList(); protected PhysicsSpace physicsSpace; @@ -110,9 +110,6 @@ public class PhysicsVehicle extends PhysicsRigidBody { @Override protected void postRebuild() { super.postRebuild(); - if (tuning == null) { - tuning = new VehicleTuning(); - } motionState.setVehicle(this); createVehicle(physicsSpace); } @@ -139,7 +136,7 @@ public class PhysicsVehicle extends PhysicsRigidBody { Logger.getLogger(this.getClass().getName()).log(Level.INFO, "Created Vehicle {0}", Long.toHexString(vehicleId)); setCoordinateSystem(vehicleId, 0, 1, 2); for (VehicleWheel wheel : wheels) { - wheel.setWheelId(addWheel(vehicleId, wheel.getLocation(), wheel.getDirection(), wheel.getAxle(), wheel.getRestLength(), wheel.getRadius(), tuning, wheel.isFrontWheel())); + wheel.setVehicleId(vehicleId, addWheel(vehicleId, wheel.getLocation(), wheel.getDirection(), wheel.getAxle(), wheel.getRestLength(), wheel.getRadius(), tuning, wheel.isFrontWheel())); } } @@ -149,7 +146,7 @@ public class PhysicsVehicle extends PhysicsRigidBody { private native void setCoordinateSystem(long objectId, int a, int b, int c); - private native long addWheel(long objectId, Vector3f location, Vector3f direction, Vector3f axle, float restLength, float radius, VehicleTuning tuning, boolean frontWheel); + private native int addWheel(long objectId, Vector3f location, Vector3f direction, Vector3f axle, float restLength, float radius, VehicleTuning tuning, boolean frontWheel); /** * Add a wheel to this vehicle @@ -191,7 +188,7 @@ public class PhysicsVehicle extends PhysicsRigidBody { wheel.setMaxSuspensionForce(tuning.maxSuspensionForce); wheels.add(wheel); if (vehicleId != 0) { - wheel.setWheelId(addWheel(vehicleId, wheel.getLocation(), wheel.getDirection(), wheel.getAxle(), wheel.getRestLength(), wheel.getRadius(), tuning, wheel.isFrontWheel())); + wheel.setVehicleId(vehicleId, addWheel(vehicleId, wheel.getLocation(), wheel.getDirection(), wheel.getAxle(), wheel.getRestLength(), wheel.getRadius(), tuning, wheel.isFrontWheel())); } if (debugShape != null) { updateDebugShape(); diff --git a/engine/src/bullet/com/jme3/bullet/objects/VehicleWheel.java b/engine/src/bullet/com/jme3/bullet/objects/VehicleWheel.java index 5c1252b08..cab8cd559 100644 --- a/engine/src/bullet/com/jme3/bullet/objects/VehicleWheel.java +++ b/engine/src/bullet/com/jme3/bullet/objects/VehicleWheel.java @@ -52,6 +52,7 @@ import java.util.logging.Logger; public class VehicleWheel implements Savable { protected long wheelId = 0; + protected int wheelIndex = 0; protected boolean frontWheel; protected Vector3f location = new Vector3f(); protected Vector3f direction = new Vector3f(); @@ -92,15 +93,15 @@ public class VehicleWheel implements Savable { } public synchronized void updatePhysicsState() { - getWheelLocation(wheelId, wheelWorldLocation); - getWheelRotation(wheelId, tmp_Matrix); + getWheelLocation(wheelId, wheelIndex, wheelWorldLocation); + getWheelRotation(wheelId, wheelIndex, tmp_Matrix); wheelWorldRotation.fromRotationMatrix(tmp_Matrix); } - - private native void getWheelLocation(long wheelId, Vector3f location); - private native void getWheelRotation(long wheelId, Matrix3f location); - + private native void getWheelLocation(long vehicleId, int wheelId, Vector3f location); + + private native void getWheelRotation(long vehicleId, int wheelId, Matrix3f location); + public synchronized void applyWheelTransform() { if (wheelSpatial == null) { return; @@ -127,8 +128,9 @@ public class VehicleWheel implements Savable { return wheelId; } - public void setWheelId(long wheelInfo) { - this.wheelId = wheelInfo; + public void setVehicleId(long vehicleId, int wheelIndex) { + this.wheelId = vehicleId; + this.wheelIndex = wheelIndex; applyInfo(); } @@ -258,10 +260,10 @@ public class VehicleWheel implements Savable { if (wheelId == 0) { return; } - applyInfo(wheelId, suspensionStiffness, wheelsDampingRelaxation, wheelsDampingCompression, frictionSlip, rollInfluence, maxSuspensionTravelCm, maxSuspensionForce, radius, frontWheel, restLength); + applyInfo(wheelId, wheelIndex, suspensionStiffness, wheelsDampingRelaxation, wheelsDampingCompression, frictionSlip, rollInfluence, maxSuspensionTravelCm, maxSuspensionForce, radius, frontWheel, restLength); } - - private native void applyInfo(long wheelId, + + private native void applyInfo(long wheelId, int wheelIndex, float suspensionStiffness, float wheelsDampingRelaxation, float wheelsDampingCompression, @@ -302,7 +304,7 @@ public class VehicleWheel implements Savable { // System.out.println("RigidBody"); // return (PhysicsRigidBody) ((RigidBody) wheelInfo.raycastInfo.groundObject).getUserPointer(); // } else { - return null; + return null; // } } @@ -310,18 +312,18 @@ public class VehicleWheel implements Savable { * returns the location where the wheel collides with the ground (world space) */ public Vector3f getCollisionLocation(Vector3f vec) { - getCollisionLocation(wheelId, vec); + getCollisionLocation(wheelId, wheelIndex, vec); return vec; } - - private native void getCollisionLocation(long wheelId, Vector3f vec); + + private native void getCollisionLocation(long wheelId, int wheelIndex, Vector3f vec); /** * returns the location where the wheel collides with the ground (world space) */ public Vector3f getCollisionLocation() { Vector3f vec = new Vector3f(); - getCollisionLocation(wheelId, vec); + getCollisionLocation(wheelId, wheelIndex, vec); return vec; } @@ -329,18 +331,18 @@ public class VehicleWheel implements Savable { * returns the normal where the wheel collides with the ground (world space) */ public Vector3f getCollisionNormal(Vector3f vec) { - getCollisionNormal(wheelId, vec); + getCollisionNormal(wheelId, wheelIndex, vec); return vec; } - private native void getCollisionNormal(long wheelId, Vector3f vec); + private native void getCollisionNormal(long wheelId, int wheelIndex, Vector3f vec); /** * returns the normal where the wheel collides with the ground (world space) */ public Vector3f getCollisionNormal() { Vector3f vec = new Vector3f(); - getCollisionNormal(wheelId, vec); + getCollisionNormal(wheelId, wheelIndex, vec); return vec; } @@ -349,10 +351,10 @@ public class VehicleWheel implements Savable { * 0.0 = wheels are sliding, 1.0 = wheels have traction. */ public float getSkidInfo() { - return getSkidInfo(wheelId); + return getSkidInfo(wheelId, wheelIndex); } - - public native float getSkidInfo(long wheelId); + + public native float getSkidInfo(long wheelId, int wheelIndex); @Override public void read(JmeImporter im) throws IOException { @@ -413,7 +415,7 @@ public class VehicleWheel implements Savable { public void setApplyLocal(boolean applyLocal) { this.applyLocal = applyLocal; } - + @Override protected void finalize() throws Throwable { super.finalize(); @@ -421,5 +423,5 @@ public class VehicleWheel implements Savable { // finalizeNative(wheelId); } - private native void finalizeNative(long wheelId); + private native void finalizeNative(long wheelId, int wheelIndex); } diff --git a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsVehicle.cpp b/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsVehicle.cpp index d7f51f7c1..4cb38c19d 100644 --- a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsVehicle.cpp +++ b/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsVehicle.cpp @@ -126,7 +126,7 @@ extern "C" { * Method: addWheel * Signature: (JLcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;FFLcom/jme3/bullet/objects/infos/VehicleTuning;Z)J */ - JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_addWheel + JNIEXPORT jint JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_addWheel (JNIEnv *env, jobject object, jlong vehicleId, jobject location, jobject direction, jobject axle, jfloat restLength, jfloat radius, jobject tuning, jboolean frontWheel) { btRaycastVehicle* vehicle = (btRaycastVehicle*) vehicleId; if (vehicle == NULL) { @@ -142,7 +142,8 @@ extern "C" { jmeBulletUtil::convert(env, axle, &vec3); btRaycastVehicle::btVehicleTuning tune; btWheelInfo* info = &vehicle->addWheel(vec1, vec2, vec3, restLength, radius, tune, frontWheel); - return (long) info; + int idx = vehicle->getNumWheels(); + return idx-1; } /* diff --git a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsVehicle.h b/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsVehicle.h index 288caab6c..821e384cc 100644 --- a/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsVehicle.h +++ b/engine/src/bullet/native/com_jme3_bullet_objects_PhysicsVehicle.h @@ -76,9 +76,9 @@ JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_setCoordinate /* * Class: com_jme3_bullet_objects_PhysicsVehicle * Method: addWheel - * Signature: (JLcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;FFLcom/jme3/bullet/objects/infos/VehicleTuning;Z)J + * Signature: (JLcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;Lcom/jme3/math/Vector3f;FFLcom/jme3/bullet/objects/infos/VehicleTuning;Z)I */ -JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_addWheel +JNIEXPORT jint JNICALL Java_com_jme3_bullet_objects_PhysicsVehicle_addWheel (JNIEnv *, jobject, jlong, jobject, jobject, jobject, jfloat, jfloat, jobject, jboolean); /* diff --git a/engine/src/bullet/native/com_jme3_bullet_objects_VehicleWheel.cpp b/engine/src/bullet/native/com_jme3_bullet_objects_VehicleWheel.cpp index 7224bff01..fb55d5ac5 100644 --- a/engine/src/bullet/native/com_jme3_bullet_objects_VehicleWheel.cpp +++ b/engine/src/bullet/native/com_jme3_bullet_objects_VehicleWheel.cpp @@ -47,14 +47,14 @@ extern "C" { * Signature: (JLcom/jme3/math/Vector3f;)V */ JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getWheelLocation - (JNIEnv *env, jobject object, jlong wheelId, jobject out) { - btWheelInfo* wheel = (btWheelInfo*) wheelId; - if (wheel == NULL) { + (JNIEnv *env, jobject object, jlong vehicleId, jint wheelIndex, jobject out) { + btRaycastVehicle* vehicle = (btRaycastVehicle*) vehicleId; + if (vehicle == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The native object does not exist."); return; } - jmeBulletUtil::convert(env, &wheel->m_worldTransform.getOrigin(), out); + jmeBulletUtil::convert(env, &vehicle->getWheelInfo(wheelIndex).m_worldTransform.getOrigin(), out); } /* @@ -63,14 +63,14 @@ extern "C" { * Signature: (JLcom/jme3/math/Matrix3f;)V */ JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getWheelRotation - (JNIEnv *env, jobject object, jlong wheelId, jobject out) { - btWheelInfo* wheel = (btWheelInfo*) wheelId; - if (wheel == NULL) { + (JNIEnv *env, jobject object, jlong vehicleId, jint wheelIndex, jobject out) { + btRaycastVehicle* vehicle = (btRaycastVehicle*) vehicleId; + if (vehicle == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The native object does not exist."); return; } - jmeBulletUtil::convert(env, &wheel->m_worldTransform.getBasis(), out); + jmeBulletUtil::convert(env, &vehicle->getWheelInfo(wheelIndex).m_worldTransform.getBasis(), out); } /* @@ -79,18 +79,18 @@ extern "C" { * Signature: (JFFFFFFFFZF)V */ JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_applyInfo - (JNIEnv *env, jobject object, jlong wheelId, jfloat suspensionStiffness, jfloat wheelsDampingRelaxation, jfloat wheelsDampingCompression, jfloat frictionSlip, jfloat rollInfluence, jfloat maxSuspensionTravelCm, jfloat maxSuspensionForce, jfloat radius, jboolean frontWheel, jfloat restLength) { - btWheelInfo* wheelInfo = (btWheelInfo*) wheelId; - wheelInfo->m_suspensionStiffness = suspensionStiffness; - wheelInfo->m_wheelsDampingRelaxation = wheelsDampingRelaxation; - wheelInfo->m_wheelsDampingCompression = wheelsDampingCompression; - wheelInfo->m_frictionSlip = frictionSlip; - wheelInfo->m_rollInfluence = rollInfluence; - wheelInfo->m_maxSuspensionTravelCm = maxSuspensionTravelCm; - wheelInfo->m_maxSuspensionForce = maxSuspensionForce; - wheelInfo->m_wheelsRadius = radius; - wheelInfo->m_bIsFrontWheel = frontWheel; - wheelInfo->m_suspensionRestLength1 = restLength; + (JNIEnv *env, jobject object, jlong vehicleId, jint wheelIndex, jfloat suspensionStiffness, jfloat wheelsDampingRelaxation, jfloat wheelsDampingCompression, jfloat frictionSlip, jfloat rollInfluence, jfloat maxSuspensionTravelCm, jfloat maxSuspensionForce, jfloat radius, jboolean frontWheel, jfloat restLength) { + btRaycastVehicle* vehicle = (btRaycastVehicle*) vehicleId; + vehicle->getWheelInfo(wheelIndex).m_suspensionStiffness = suspensionStiffness; + vehicle->getWheelInfo(wheelIndex).m_wheelsDampingRelaxation = wheelsDampingRelaxation; + vehicle->getWheelInfo(wheelIndex).m_wheelsDampingCompression = wheelsDampingCompression; + vehicle->getWheelInfo(wheelIndex).m_frictionSlip = frictionSlip; + vehicle->getWheelInfo(wheelIndex).m_rollInfluence = rollInfluence; + vehicle->getWheelInfo(wheelIndex).m_maxSuspensionTravelCm = maxSuspensionTravelCm; + vehicle->getWheelInfo(wheelIndex).m_maxSuspensionForce = maxSuspensionForce; + vehicle->getWheelInfo(wheelIndex).m_wheelsRadius = radius; + vehicle->getWheelInfo(wheelIndex).m_bIsFrontWheel = frontWheel; + vehicle->getWheelInfo(wheelIndex).m_suspensionRestLength1 = restLength; } @@ -100,14 +100,14 @@ extern "C" { * Signature: (JLcom/jme3/math/Vector3f;)V */ JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getCollisionLocation - (JNIEnv *env, jobject object, jlong wheelId, jobject out) { - btWheelInfo* wheel = (btWheelInfo*) wheelId; - if (wheel == NULL) { + (JNIEnv *env, jobject object, jlong vehicleId, jint wheelIndex, jobject out) { + btRaycastVehicle* vehicle = (btRaycastVehicle*) vehicleId; + if (vehicle == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The native object does not exist."); return; } - jmeBulletUtil::convert(env, &wheel->m_raycastInfo.m_contactPointWS, out); + jmeBulletUtil::convert(env, &vehicle->getWheelInfo(wheelIndex).m_raycastInfo.m_contactPointWS, out); } /* @@ -116,14 +116,14 @@ extern "C" { * Signature: (JLcom/jme3/math/Vector3f;)V */ JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getCollisionNormal - (JNIEnv *env, jobject object, jlong wheelId, jobject out) { - btWheelInfo* wheel = (btWheelInfo*) wheelId; - if (wheel == NULL) { + (JNIEnv *env, jobject object, jlong vehicleId, jint wheelIndex, jobject out) { + btRaycastVehicle* vehicle = (btRaycastVehicle*) vehicleId; + if (vehicle == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The native object does not exist."); return; } - jmeBulletUtil::convert(env, &wheel->m_raycastInfo.m_contactNormalWS, out); + jmeBulletUtil::convert(env, &vehicle->getWheelInfo(wheelIndex).m_raycastInfo.m_contactNormalWS, out); } /* @@ -132,25 +132,25 @@ extern "C" { * Signature: (J)F */ JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getSkidInfo - (JNIEnv *env, jobject object, jlong wheelId) { - btWheelInfo* wheel = (btWheelInfo*) wheelId; - if (wheel == NULL) { + (JNIEnv *env, jobject object, jlong vehicleId, jint wheelIndex) { + btRaycastVehicle* vehicle = (btRaycastVehicle*) vehicleId; + if (vehicle == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The native object does not exist."); return 0; } - return wheel->m_skidInfo; + return vehicle->getWheelInfo(wheelIndex).m_skidInfo; } JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_finalizeNative - (JNIEnv *env, jobject object, jlong wheelId) { - btWheelInfo* wheel = (btWheelInfo*) wheelId; - if (wheel == NULL) { + (JNIEnv *env, jobject object, jlong vehicleId, jint wheelIndex) { + btRaycastVehicle* vehicle = (btRaycastVehicle*) vehicleId; + if (vehicle == NULL) { jclass newExc = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExc, "The native object does not exist."); return; } - delete(wheel); + delete(&vehicle->getWheelInfo(wheelIndex)); } #ifdef __cplusplus } diff --git a/engine/src/bullet/native/com_jme3_bullet_objects_VehicleWheel.h b/engine/src/bullet/native/com_jme3_bullet_objects_VehicleWheel.h index 6f136a829..edf26a42c 100644 --- a/engine/src/bullet/native/com_jme3_bullet_objects_VehicleWheel.h +++ b/engine/src/bullet/native/com_jme3_bullet_objects_VehicleWheel.h @@ -10,58 +10,58 @@ extern "C" { /* * Class: com_jme3_bullet_objects_VehicleWheel * Method: getWheelLocation - * Signature: (JLcom/jme3/math/Vector3f;)V + * Signature: (JILcom/jme3/math/Vector3f;)V */ JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getWheelLocation - (JNIEnv *, jobject, jlong, jobject); + (JNIEnv *, jobject, jlong, jint, jobject); /* * Class: com_jme3_bullet_objects_VehicleWheel * Method: getWheelRotation - * Signature: (JLcom/jme3/math/Matrix3f;)V + * Signature: (JILcom/jme3/math/Matrix3f;)V */ JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getWheelRotation - (JNIEnv *, jobject, jlong, jobject); + (JNIEnv *, jobject, jlong, jint, jobject); /* * Class: com_jme3_bullet_objects_VehicleWheel * Method: applyInfo - * Signature: (JFFFFFFFFZF)V + * Signature: (JIFFFFFFFFZF)V */ JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_applyInfo - (JNIEnv *, jobject, jlong, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jboolean, jfloat); + (JNIEnv *, jobject, jlong, jint, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jboolean, jfloat); /* * Class: com_jme3_bullet_objects_VehicleWheel * Method: getCollisionLocation - * Signature: (JLcom/jme3/math/Vector3f;)V + * Signature: (JILcom/jme3/math/Vector3f;)V */ JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getCollisionLocation - (JNIEnv *, jobject, jlong, jobject); + (JNIEnv *, jobject, jlong, jint, jobject); /* * Class: com_jme3_bullet_objects_VehicleWheel * Method: getCollisionNormal - * Signature: (JLcom/jme3/math/Vector3f;)V + * Signature: (JILcom/jme3/math/Vector3f;)V */ JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getCollisionNormal - (JNIEnv *, jobject, jlong, jobject); + (JNIEnv *, jobject, jlong, jint, jobject); /* * Class: com_jme3_bullet_objects_VehicleWheel * Method: getSkidInfo - * Signature: (J)F + * Signature: (JI)F */ JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_VehicleWheel_getSkidInfo - (JNIEnv *, jobject, jlong); + (JNIEnv *, jobject, jlong, jint); /* * Class: com_jme3_bullet_objects_VehicleWheel * Method: finalizeNative - * Signature: (J)V + * Signature: (JI)V */ JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_VehicleWheel_finalizeNative - (JNIEnv *, jobject, jlong); + (JNIEnv *, jobject, jlong, jint); #ifdef __cplusplus }