protected long vehicleId = 0;
protected long rayCasterId = 0;
- protected VehicleTuning tuning;
+ protected VehicleTuning tuning = new VehicleTuning();
protected ArrayList<VehicleWheel> wheels = new ArrayList<VehicleWheel>();
protected PhysicsSpace physicsSpace;
@Override
protected void postRebuild() {
super.postRebuild();
- if (tuning == null) {
- tuning = new VehicleTuning();
- }
motionState.setVehicle(this);
createVehicle(physicsSpace);
}
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()));
}
}
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
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();
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();
}
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;
return wheelId;
}
- public void setWheelId(long wheelInfo) {
- this.wheelId = wheelInfo;
+ public void setVehicleId(long vehicleId, int wheelIndex) {
+ this.wheelId = vehicleId;
+ this.wheelIndex = wheelIndex;
applyInfo();
}
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,
// System.out.println("RigidBody");
// return (PhysicsRigidBody) ((RigidBody) wheelInfo.raycastInfo.groundObject).getUserPointer();
// } else {
- return null;
+ return null;
// }
}
* 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;
}
* 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;
}
* 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 {
public void setApplyLocal(boolean applyLocal) {
this.applyLocal = applyLocal;
}
-
+
@Override
protected void finalize() throws Throwable {
super.finalize();
// finalizeNative(wheelId);
}
- private native void finalizeNative(long wheelId);
+ private native void finalizeNative(long wheelId, int wheelIndex);
}
* 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) {
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;
}
/*
/*
* 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);
/*
* 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);
}
/*
* 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);
}
/*
* 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;
}
* 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);
}
/*
* 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);
}
/*
* 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
}
/*
* 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
}