diff options
-rw-r--r-- | modules/bullet/space_bullet.cpp | 67 |
1 files changed, 41 insertions, 26 deletions
diff --git a/modules/bullet/space_bullet.cpp b/modules/bullet/space_bullet.cpp index 74b0d10699..8fb8eba057 100644 --- a/modules/bullet/space_bullet.cpp +++ b/modules/bullet/space_bullet.cpp @@ -650,6 +650,7 @@ void SpaceBullet::check_ghost_overlaps() { /// Algorithm support variables btCollisionShape *other_body_shape; btConvexShape *area_shape; + btGjkPairDetector::ClosestPointInput gjk_input; AreaBullet *area; int x(-1), i(-1), y(-1), z(-1), indexOverlap(-1); @@ -703,6 +704,10 @@ void SpaceBullet::check_ghost_overlaps() { btTransform area_shape_treansform(area->get_bt_shape_transform(y)); area_shape_treansform.getOrigin() *= area_scale; + gjk_input.m_transformA = + area->get_transform__bullet() * + area_shape_treansform; + area_shape = static_cast<btConvexShape *>(area->get_bt_shape(y)); // For each other object shape @@ -716,35 +721,45 @@ void SpaceBullet::check_ghost_overlaps() { btTransform other_shape_transform(otherObject->get_bt_shape_transform(z)); other_shape_transform.getOrigin() *= other_body_scale; - btCollisionObjectWrapper obA( - NULL, - area_shape, - area->get_bt_ghost(), - area->get_transform__bullet() * area_shape_treansform, - -1, - y); - btCollisionObjectWrapper obB( - NULL, - other_body_shape, - otherObject->get_bt_collision_object(), - otherObject->get_transform__bullet() * other_shape_transform, - -1, - z); - - btCollisionAlgorithm *algorithm = dispatcher->findAlgorithm(&obA, &obB, NULL, BT_CONTACT_POINT_ALGORITHMS); - - if (!algorithm) - continue; + gjk_input.m_transformB = + otherObject->get_transform__bullet() * + other_shape_transform; + + if (other_body_shape->isConvex()) { - GodotDeepPenetrationContactResultCallback contactPointResult(&obA, &obB); - algorithm->processCollision(&obA, &obB, dynamicsWorld->getDispatchInfo(), &contactPointResult); + btPointCollector result; + btGjkPairDetector gjk_pair_detector( + area_shape, + static_cast<btConvexShape *>(other_body_shape), + gjk_simplex_solver, + gjk_epa_pen_solver); + gjk_pair_detector.getClosestPoints(gjk_input, result, 0); - algorithm->~btCollisionAlgorithm(); - dispatcher->freeCollisionAlgorithm(algorithm); + if (0 >= result.m_distance) { + hasOverlap = true; + goto collision_found; + } + + } else { - if (contactPointResult.hasHit()) { - hasOverlap = true; - goto collision_found; + btCollisionObjectWrapper obA(NULL, area_shape, area->get_bt_ghost(), gjk_input.m_transformA, -1, y); + btCollisionObjectWrapper obB(NULL, other_body_shape, otherObject->get_bt_collision_object(), gjk_input.m_transformB, -1, z); + + btCollisionAlgorithm *algorithm = dispatcher->findAlgorithm(&obA, &obB, NULL, BT_CONTACT_POINT_ALGORITHMS); + + if (!algorithm) + continue; + + GodotDeepPenetrationContactResultCallback contactPointResult(&obA, &obB); + algorithm->processCollision(&obA, &obB, dynamicsWorld->getDispatchInfo(), &contactPointResult); + + algorithm->~btCollisionAlgorithm(); + dispatcher->freeCollisionAlgorithm(algorithm); + + if (contactPointResult.hasHit()) { + hasOverlap = true; + goto collision_found; + } } } // ~For each other object shape |