OSDN Git Service

- native bullet: fix PhysicsVehicle wheel handling, using wheelIndex to select wheels now
authornormen667 <normen667@75d07b2b-3a1a-0410-a2c5-0572b91ccdca>
Fri, 21 Oct 2011 22:58:23 +0000 (22:58 +0000)
committernormen667 <normen667@75d07b2b-3a1a-0410-a2c5-0572b91ccdca>
Fri, 21 Oct 2011 22:58:23 +0000 (22:58 +0000)
git-svn-id: http://jmonkeyengine.googlecode.com/svn/trunk@8480 75d07b2b-3a1a-0410-a2c5-0572b91ccdca

engine/src/bullet/com/jme3/bullet/objects/PhysicsVehicle.java
engine/src/bullet/com/jme3/bullet/objects/VehicleWheel.java
engine/src/bullet/native/com_jme3_bullet_objects_PhysicsVehicle.cpp
engine/src/bullet/native/com_jme3_bullet_objects_PhysicsVehicle.h
engine/src/bullet/native/com_jme3_bullet_objects_VehicleWheel.cpp
engine/src/bullet/native/com_jme3_bullet_objects_VehicleWheel.h

index a85a081..1f01763 100644 (file)
@@ -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<VehicleWheel> wheels = new ArrayList<VehicleWheel>();
     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();
index 5c1252b..cab8cd5 100644 (file)
@@ -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);
 }
index d7f51f7..4cb38c1 100644 (file)
@@ -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;
     }
 
     /*
index 288caab..821e384 100644 (file)
@@ -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);
 
 /*
index 7224bff..fb55d5a 100644 (file)
@@ -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
 }
index 6f136a8..edf26a4 100644 (file)
@@ -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
 }