Ver código fonte

Revert "Optimized area check"

Rémi Verschelde 6 anos atrás
pai
commit
e22f6e9ace
1 arquivos alterados com 41 adições e 26 exclusões
  1. 41 26
      modules/bullet/space_bullet.cpp

+ 41 - 26
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