Переглянути джерело

Fixed group collision check in native broadphase

Fadorico 9 роки тому
батько
коміт
ef626b0959

+ 2 - 0
jme3-bullet-native/src/native/cpp/jmeClasses.cpp

@@ -40,6 +40,7 @@ jclass jmeClasses::PhysicsSpace;
 jmethodID jmeClasses::PhysicsSpace_preTick;
 jmethodID jmeClasses::PhysicsSpace_postTick;
 jmethodID jmeClasses::PhysicsSpace_addCollisionEvent;
+jmethodID jmeClasses::PhysicsSpace_notifyCollisionGroupListeners;
 
 jclass jmeClasses::PhysicsGhostObject;
 jmethodID jmeClasses::PhysicsGhostObject_addOverlappingObject;
@@ -137,6 +138,7 @@ void jmeClasses::initJavaClasses(JNIEnv* env) {
     PhysicsSpace_preTick = env->GetMethodID(PhysicsSpace, "preTick_native", "(F)V");
     PhysicsSpace_postTick = env->GetMethodID(PhysicsSpace, "postTick_native", "(F)V");
     PhysicsSpace_addCollisionEvent = env->GetMethodID(PhysicsSpace, "addCollisionEvent_native","(Lcom/jme3/bullet/collision/PhysicsCollisionObject;Lcom/jme3/bullet/collision/PhysicsCollisionObject;J)V");
+    PhysicsSpace_notifyCollisionGroupListeners = env->GetMethodID(PhysicsSpace, "notifyCollisionGroupListeners_native","(Lcom/jme3/bullet/collision/PhysicsCollisionObject;Lcom/jme3/bullet/collision/PhysicsCollisionObject;)Z");
     if (env->ExceptionCheck()) {
         env->Throw(env->ExceptionOccurred());
         return;

+ 1 - 0
jme3-bullet-native/src/native/cpp/jmeClasses.h

@@ -46,6 +46,7 @@ public:
     static jmethodID PhysicsSpace_addCollisionEvent;
     static jclass PhysicsGhostObject;
     static jmethodID PhysicsGhostObject_addOverlappingObject;
+    static jmethodID PhysicsSpace_notifyCollisionGroupListeners;
 
     static jclass Vector3f;
     static jmethodID Vector3f_set;

+ 22 - 2
jme3-bullet-native/src/native/cpp/jmePhysicsSpace.cpp

@@ -187,8 +187,28 @@ void jmePhysicsSpace::createPhysicsSpace(jfloat minX, jfloat minY, jfloat minZ,
                 jmeUserPointer *up0 = (jmeUserPointer*) co0 -> getUserPointer();
                 jmeUserPointer *up1 = (jmeUserPointer*) co1 -> getUserPointer();
                 if (up0 != NULL && up1 != NULL) {
-                    collides = (up0->group & up1->groups) != 0;
-                    collides = collides && (up1->group & up0->groups);
+                    collides = (up0->group & up1->groups) != 0 || (up1->group & up0->groups) != 0;
+                    
+                    if(collides){
+                        jmePhysicsSpace *dynamicsWorld = (jmePhysicsSpace *)up0->space;
+                        JNIEnv* env = dynamicsWorld->getEnv();
+                        jobject javaPhysicsSpace = env->NewLocalRef(dynamicsWorld->getJavaPhysicsSpace());
+                        jobject javaCollisionObject0 = env->NewLocalRef(up0->javaCollisionObject);
+                        jobject javaCollisionObject1 = env->NewLocalRef(up1->javaCollisionObject);
+                        
+                        jboolean notifyResult = env->CallBooleanMethod(javaPhysicsSpace, jmeClasses::PhysicsSpace_notifyCollisionGroupListeners, javaCollisionObject0, javaCollisionObject1);
+                        
+                        env->DeleteLocalRef(javaPhysicsSpace);
+                        env->DeleteLocalRef(javaCollisionObject0);
+                        env->DeleteLocalRef(javaCollisionObject1);
+
+                        if (env->ExceptionCheck()) {
+                            env->Throw(env->ExceptionOccurred());
+                            return collides;
+                        }
+                        
+                        collides = (bool) notifyResult;
+                    }
 
                     //add some additional logic here that modified 'collides'
                     return collides;

+ 12 - 11
jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java

@@ -334,19 +334,20 @@ public class PhysicsSpace {
     private void addCollisionEvent_native(PhysicsCollisionObject node, PhysicsCollisionObject node1, long manifoldPointObjectId) {
 //        System.out.println("addCollisionEvent:"+node.getObjectId()+" "+ node1.getObjectId());
         collisionEvents.add(eventFactory.getEvent(PhysicsCollisionEvent.TYPE_PROCESSED, node, node1, manifoldPointObjectId));
-
-        // Notify group listeners
-        if((node.getCollideWithGroups() & node1.getCollisionGroup()) > 0
-                || (node1.getCollideWithGroups() & node.getCollisionGroup()) > 0){
-            PhysicsCollisionGroupListener listener = collisionGroupListeners.get(node.getCollisionGroup());
-            PhysicsCollisionGroupListener listener1 = collisionGroupListeners.get(node1.getCollisionGroup());
-            if(listener != null){
-                listener.collide(node, node1);
-            }
-            if(listener1 != null && node.getCollisionGroup() != node1.getCollisionGroup()){
-                listener1.collide(node, node1);
+    }
+    
+    private boolean notifyCollisionGroupListeners_native(PhysicsCollisionObject node, PhysicsCollisionObject node1){
+        PhysicsCollisionGroupListener listener = collisionGroupListeners.get(node.getCollisionGroup());
+        PhysicsCollisionGroupListener listener1 = collisionGroupListeners.get(node1.getCollisionGroup());
+        if(listener != null){
+            if(!listener.collide(node, node1)){
+                return false;
             }
         }
+        if(listener1 != null && node.getCollisionGroup() != node1.getCollisionGroup()){
+            return listener1.collide(node, node1);
+        }
+        return true;
     }
 
     /**