Fixed group collision check in native broadphase
This commit is contained in:
parent
7628b0f9e3
commit
ef626b0959
@ -40,6 +40,7 @@ jclass jmeClasses::PhysicsSpace;
|
|||||||
jmethodID jmeClasses::PhysicsSpace_preTick;
|
jmethodID jmeClasses::PhysicsSpace_preTick;
|
||||||
jmethodID jmeClasses::PhysicsSpace_postTick;
|
jmethodID jmeClasses::PhysicsSpace_postTick;
|
||||||
jmethodID jmeClasses::PhysicsSpace_addCollisionEvent;
|
jmethodID jmeClasses::PhysicsSpace_addCollisionEvent;
|
||||||
|
jmethodID jmeClasses::PhysicsSpace_notifyCollisionGroupListeners;
|
||||||
|
|
||||||
jclass jmeClasses::PhysicsGhostObject;
|
jclass jmeClasses::PhysicsGhostObject;
|
||||||
jmethodID jmeClasses::PhysicsGhostObject_addOverlappingObject;
|
jmethodID jmeClasses::PhysicsGhostObject_addOverlappingObject;
|
||||||
@ -137,6 +138,7 @@ void jmeClasses::initJavaClasses(JNIEnv* env) {
|
|||||||
PhysicsSpace_preTick = env->GetMethodID(PhysicsSpace, "preTick_native", "(F)V");
|
PhysicsSpace_preTick = env->GetMethodID(PhysicsSpace, "preTick_native", "(F)V");
|
||||||
PhysicsSpace_postTick = env->GetMethodID(PhysicsSpace, "postTick_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_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()) {
|
if (env->ExceptionCheck()) {
|
||||||
env->Throw(env->ExceptionOccurred());
|
env->Throw(env->ExceptionOccurred());
|
||||||
return;
|
return;
|
||||||
|
@ -46,6 +46,7 @@ public:
|
|||||||
static jmethodID PhysicsSpace_addCollisionEvent;
|
static jmethodID PhysicsSpace_addCollisionEvent;
|
||||||
static jclass PhysicsGhostObject;
|
static jclass PhysicsGhostObject;
|
||||||
static jmethodID PhysicsGhostObject_addOverlappingObject;
|
static jmethodID PhysicsGhostObject_addOverlappingObject;
|
||||||
|
static jmethodID PhysicsSpace_notifyCollisionGroupListeners;
|
||||||
|
|
||||||
static jclass Vector3f;
|
static jclass Vector3f;
|
||||||
static jmethodID Vector3f_set;
|
static jmethodID Vector3f_set;
|
||||||
|
@ -187,8 +187,28 @@ void jmePhysicsSpace::createPhysicsSpace(jfloat minX, jfloat minY, jfloat minZ,
|
|||||||
jmeUserPointer *up0 = (jmeUserPointer*) co0 -> getUserPointer();
|
jmeUserPointer *up0 = (jmeUserPointer*) co0 -> getUserPointer();
|
||||||
jmeUserPointer *up1 = (jmeUserPointer*) co1 -> getUserPointer();
|
jmeUserPointer *up1 = (jmeUserPointer*) co1 -> getUserPointer();
|
||||||
if (up0 != NULL && up1 != NULL) {
|
if (up0 != NULL && up1 != NULL) {
|
||||||
collides = (up0->group & up1->groups) != 0;
|
collides = (up0->group & up1->groups) != 0 || (up1->group & up0->groups) != 0;
|
||||||
collides = collides && (up1->group & up0->groups);
|
|
||||||
|
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'
|
//add some additional logic here that modified 'collides'
|
||||||
return collides;
|
return collides;
|
||||||
|
@ -334,19 +334,20 @@ public class PhysicsSpace {
|
|||||||
private void addCollisionEvent_native(PhysicsCollisionObject node, PhysicsCollisionObject node1, long manifoldPointObjectId) {
|
private void addCollisionEvent_native(PhysicsCollisionObject node, PhysicsCollisionObject node1, long manifoldPointObjectId) {
|
||||||
// System.out.println("addCollisionEvent:"+node.getObjectId()+" "+ node1.getObjectId());
|
// System.out.println("addCollisionEvent:"+node.getObjectId()+" "+ node1.getObjectId());
|
||||||
collisionEvents.add(eventFactory.getEvent(PhysicsCollisionEvent.TYPE_PROCESSED, node, node1, manifoldPointObjectId));
|
collisionEvents.add(eventFactory.getEvent(PhysicsCollisionEvent.TYPE_PROCESSED, node, node1, manifoldPointObjectId));
|
||||||
|
}
|
||||||
|
|
||||||
// Notify group listeners
|
private boolean notifyCollisionGroupListeners_native(PhysicsCollisionObject node, PhysicsCollisionObject node1){
|
||||||
if((node.getCollideWithGroups() & node1.getCollisionGroup()) > 0
|
|
||||||
|| (node1.getCollideWithGroups() & node.getCollisionGroup()) > 0){
|
|
||||||
PhysicsCollisionGroupListener listener = collisionGroupListeners.get(node.getCollisionGroup());
|
PhysicsCollisionGroupListener listener = collisionGroupListeners.get(node.getCollisionGroup());
|
||||||
PhysicsCollisionGroupListener listener1 = collisionGroupListeners.get(node1.getCollisionGroup());
|
PhysicsCollisionGroupListener listener1 = collisionGroupListeners.get(node1.getCollisionGroup());
|
||||||
if(listener != null){
|
if(listener != null){
|
||||||
listener.collide(node, node1);
|
if(!listener.collide(node, node1)){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(listener1 != null && node.getCollisionGroup() != node1.getCollisionGroup()){
|
if(listener1 != null && node.getCollisionGroup() != node1.getCollisionGroup()){
|
||||||
listener1.collide(node, node1);
|
return listener1.collide(node, node1);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user