From de6a4365e5dbd6879c2e69e78693c310347e5b10 Mon Sep 17 00:00:00 2001
From: Joseph Mirabel <jmirabel@laas.fr>
Date: Tue, 28 Jan 2020 13:29:13 +0100
Subject: [PATCH] Fix ShapeShapeCollide.

---
 src/collision_func_matrix.cpp    | 21 ++++++++++++---------
 src/distance_capsule_capsule.cpp | 29 -----------------------------
 test/capsule_capsule.cpp         |  6 +++++-
 3 files changed, 17 insertions(+), 39 deletions(-)

diff --git a/src/collision_func_matrix.cpp b/src/collision_func_matrix.cpp
index d4b08ab8..dab1eb9c 100644
--- a/src/collision_func_matrix.cpp
+++ b/src/collision_func_matrix.cpp
@@ -84,24 +84,27 @@ std::size_t ShapeShapeCollide(const CollisionGeometry* o1, const Transform3f& tf
 
   if (distance <= 0) {
     if (result.numContacts () < request.num_max_contacts) {
-      Contact contact (o1, o2, distanceResult.b1, distanceResult.b2);
       const Vec3f& p1 = distanceResult.nearest_points [0];
-      assert (p1 == distanceResult.nearest_points [1]);
-      contact.pos = p1;
-      contact.normal = distanceResult.normal;
-      contact.penetration_depth = -distance;
+      assert (!request.enable_contact || p1 == distanceResult.nearest_points [1]);
+
+      Contact contact (o1, o2, distanceResult.b1, distanceResult.b2,
+          p1,
+          distanceResult.normal,
+          -distance+request.security_margin);
+
       result.addContact (contact);
     }
     return 1;
   }
   if (distance <= request.security_margin) {
     if (result.numContacts () < request.num_max_contacts) {
-      Contact contact (o1, o2, distanceResult.b1, distanceResult.b2);
       const Vec3f& p1 = distanceResult.nearest_points [0];
       const Vec3f& p2 = distanceResult.nearest_points [1];
-      contact.pos = .5 * (p1 + p2);
-      contact.normal = (p2-p1).normalized ();
-      contact.penetration_depth = -distance;
+
+      Contact contact (o1, o2, distanceResult.b1, distanceResult.b2,
+          .5 * (p1 + p2),
+          (p2-p1).normalized (),
+          -distance+request.security_margin);
       result.addContact (contact);
     }
     return 1;
diff --git a/src/distance_capsule_capsule.cpp b/src/distance_capsule_capsule.cpp
index 2822bf67..22a6b1f1 100644
--- a/src/distance_capsule_capsule.cpp
+++ b/src/distance_capsule_capsule.cpp
@@ -158,35 +158,6 @@ namespace fcl {
     return distance;
   }
 
-  template <>
-  std::size_t ShapeShapeCollide <Capsule, Capsule>
-  (const CollisionGeometry* o1, const Transform3f& tf1,
-   const CollisionGeometry* o2, const Transform3f& tf2,
-   const GJKSolver*, const CollisionRequest& request,
-   CollisionResult& result)
-  {
-    GJKSolver* unused = 0x0;
-    DistanceResult distanceResult;
-    DistanceRequest distanceRequest (request.enable_contact);
-
-    FCL_REAL distance = ShapeShapeDistance <Capsule, Capsule>
-      (o1, tf1, o2, tf2, unused, distanceRequest, distanceResult);
-
-    if (distance > 0)
-    {
-      return 0;
-    }
-    else
-    {
-      const Vec3f& p1 = distanceResult.nearest_points [0];
-      const Vec3f& p2 = distanceResult.nearest_points [1];
-      Contact contact (o1, o2, -1, -1, (p1+p2)/2, distanceResult.normal,
-          -distanceResult.min_distance);
-      result.addContact (contact);
-      return 1;
-    }
-  }
-
 } // namespace fcl
 
 } // namespace hpp
diff --git a/test/capsule_capsule.cpp b/test/capsule_capsule.cpp
index ef1effd3..ce492d2a 100644
--- a/test/capsule_capsule.cpp
+++ b/test/capsule_capsule.cpp
@@ -99,7 +99,11 @@ BOOST_AUTO_TEST_CASE(collision_capsule_capsule_trivial)
     size_t sphere_num_collisions = collide(&sphere_o1, &sphere_o2, collisionRequest, sphere_collisionResult);
     size_t capsule_num_collisions = collide(&capsule_o1, &capsule_o2, collisionRequest, capsule_collisionResult);
     
-    BOOST_CHECK(sphere_num_collisions == capsule_num_collisions);
+    BOOST_CHECK_EQUAL(sphere_num_collisions, capsule_num_collisions);
+    if (sphere_num_collisions == 0 && capsule_num_collisions == 0)
+      BOOST_CHECK_CLOSE(sphere_collisionResult.distance_lower_bound,
+                        capsule_collisionResult.distance_lower_bound,
+                        1e-6);
   }
 }
 
-- 
GitLab