Browse Source

Merge pull request #26111 from AndreaCatania/areaopti

Optimized area check
Rémi Verschelde 6 years ago
parent
commit
ced77db950
1 changed files with 26 additions and 41 deletions
  1. 26 41
      modules/bullet/space_bullet.cpp

+ 26 - 41
modules/bullet/space_bullet.cpp

@@ -650,7 +650,6 @@ 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);
 
@@ -704,10 +703,6 @@ 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
@@ -721,45 +716,35 @@ void SpaceBullet::check_ghost_overlaps() {
 					btTransform other_shape_transform(otherObject->get_bt_shape_transform(z));
 					other_shape_transform.getOrigin() *= other_body_scale;
 
-					gjk_input.m_transformB =
-							otherObject->get_transform__bullet() *
-							other_shape_transform;
-
-					if (other_body_shape->isConvex()) {
-
-						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);
-
-						if (0 >= result.m_distance) {
-							hasOverlap = true;
-							goto collision_found;
-						}
-
-					} else {
-
-						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;
+					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;
 
-						GodotDeepPenetrationContactResultCallback contactPointResult(&obA, &obB);
-						algorithm->processCollision(&obA, &obB, dynamicsWorld->getDispatchInfo(), &contactPointResult);
+					GodotDeepPenetrationContactResultCallback contactPointResult(&obA, &obB);
+					algorithm->processCollision(&obA, &obB, dynamicsWorld->getDispatchInfo(), &contactPointResult);
 
-						algorithm->~btCollisionAlgorithm();
-						dispatcher->freeCollisionAlgorithm(algorithm);
+					algorithm->~btCollisionAlgorithm();
+					dispatcher->freeCollisionAlgorithm(algorithm);
 
-						if (contactPointResult.hasHit()) {
-							hasOverlap = true;
-							goto collision_found;
-						}
+					if (contactPointResult.hasHit()) {
+						hasOverlap = true;
+						goto collision_found;
 					}
 
 				} // ~For each other object shape