From be1c5699ae5113f6e358b2f4af13503440243bd8 Mon Sep 17 00:00:00 2001
From: Mansard <nmansard@laas.fr>
Date: Tue, 6 Sep 2016 17:20:13 +0200
Subject: [PATCH] [C++] Geom: Removed DistanceResult from GeomData. Issue
 281.1.

---
 src/algorithm/geometry.hxx |  6 ++---
 src/multibody/fcl.hpp      | 52 +-------------------------------------
 src/multibody/fcl.hxx      | 16 ------------
 src/multibody/geometry.hpp | 22 +++++++++++-----
 src/multibody/geometry.hxx | 28 ++++++++++----------
 5 files changed, 35 insertions(+), 89 deletions(-)

diff --git a/src/algorithm/geometry.hxx b/src/algorithm/geometry.hxx
index 0edbadbc0..83853400d 100644
--- a/src/algorithm/geometry.hxx
+++ b/src/algorithm/geometry.hxx
@@ -102,11 +102,11 @@ namespace se3
     {
       if(data_geom.activeCollisionPairs[cpt])
         {
-          data_geom.distance_results[cpt] = data_geom.computeDistance(geomModel.collisionPairs[cpt]);
-          if (COMPUTE_SHORTEST && data_geom.distance_results[cpt].distance() < min_dist)
+          data_geom.computeDistance(cpt);
+          if (COMPUTE_SHORTEST && data_geom.distance_results[cpt].min_distance < min_dist)
             {
               min_index = cpt;
-              min_dist = data_geom.distance_results[cpt].distance();
+              min_dist = data_geom.distance_results[cpt].min_distance;
             }
         }
     }
diff --git a/src/multibody/fcl.hpp b/src/multibody/fcl.hpp
index a211492d6..986286227 100644
--- a/src/multibody/fcl.hpp
+++ b/src/multibody/fcl.hpp
@@ -68,55 +68,7 @@ namespace se3
   }; // struct CollisionPair
   typedef std::vector<CollisionPair> CollisionPairsVector_t;
 
-#ifdef WITH_HPP_FCL  
-  /**
-   * @brief      Result of distance computation between two CollisionObjects
-   */
-  struct DistanceResult
-  {
-
-    DistanceResult() : fcl_distance_result(), object1(0), object2(0) {}
-    DistanceResult(fcl::DistanceResult dist_fcl, const GeomIndex co1, const GeomIndex co2)
-    : fcl_distance_result(dist_fcl), object1(co1), object2(co2)
-    {}
-
-
-    ///
-    /// @brief Return the minimal distance between two geometry objects
-    ///
-    double distance () const;
-
-    ///
-    /// \brief Return the witness point on the inner object expressed in global frame.
-    ///
-    Eigen::Vector3d closestPointInner () const;
-    
-    ///
-    /// \brief Return the witness point on the outer object expressed in global frame.
-    ///
-    Eigen::Vector3d closestPointOuter () const;
-    
-    bool operator == (const DistanceResult & other) const
-    {
-      return (distance() == other.distance()
-        && closestPointInner() == other.closestPointInner()
-        && closestPointOuter() == other.closestPointOuter()
-        && object1 == other.object1
-        && object2 == other.object2);
-    }
-    
-    /// \brief The FCL result of the distance computation
-    fcl::DistanceResult fcl_distance_result;
-    
-    /// \brief Index of the first colision object
-    GeomIndex object1;
-
-    /// \brief Index of the second colision object
-    GeomIndex object2;
-    
-  }; // struct DistanceResult 
-  
-#else
+#ifndef WITH_HPP_FCL  
 
   namespace fcl
   {
@@ -196,8 +148,6 @@ struct GeometryObject
 };
   
 
-
-
 } // namespace se3
 
 /* --- Details -------------------------------------------------------------- */
diff --git a/src/multibody/fcl.hxx b/src/multibody/fcl.hxx
index ba078f3e1..7451bd073 100644
--- a/src/multibody/fcl.hxx
+++ b/src/multibody/fcl.hxx
@@ -33,22 +33,6 @@ namespace se3
 
 #ifdef WITH_HPP_FCL  
 
-
-  inline double DistanceResult::distance () const
-  {
-    return fcl_distance_result.min_distance;
-  }
-
-  inline Eigen::Vector3d DistanceResult::closestPointInner () const
-  {
-    return toVector3d(fcl_distance_result.nearest_points [0]);
-  }
-
-  inline Eigen::Vector3d DistanceResult::closestPointOuter () const
-  {
-    return toVector3d(fcl_distance_result.nearest_points [1]);
-  }
-    
   inline bool operator == (const fcl::CollisionObject & lhs, const fcl::CollisionObject & rhs)
   {
     return lhs.collisionGeometry() == rhs.collisionGeometry()
diff --git a/src/multibody/geometry.hpp b/src/multibody/geometry.hpp
index 045fba2a9..ecd5816f4 100644
--- a/src/multibody/geometry.hpp
+++ b/src/multibody/geometry.hpp
@@ -226,10 +226,15 @@ namespace se3
     ///
     std::vector<bool> activeCollisionPairs;
 
+    ///
+    /// \brief Defines what information should be computed by distance computation.
+    ///
+    fcl::DistanceRequest distanceRequest;
+
     ///
     /// \brief Vector gathering the result of the distance computation for all the collision pairs.
     ///
-    std::vector <DistanceResult> distance_results;
+    std::vector <fcl::DistanceResult> distance_results;
     
     ///
     /// \brief Defines what information should be computed by collision test.
@@ -259,6 +264,7 @@ namespace se3
         : model_geom(modelGeom)
         , oMg(model_geom.ngeoms)
         , activeCollisionPairs(modelGeom.collisionPairs.size(), true)
+        , distanceRequest (true, 0, 0, fcl::GST_INDEP)
         , distance_results(modelGeom.collisionPairs.size())
         , collisionRequest (1, false, false, 1, false, true, fcl::GST_INDEP)
         , collision_results(modelGeom.collisionPairs.size())
@@ -311,18 +317,22 @@ namespace se3
     ///
     /// \brief Compute the minimal distance between collision objects of a collison pair
     ///
-    /// \param[in] pair The collsion pair.
+    /// \param[in] pairId The index of the collision pair in geom model.
     ///
-    /// \return An fcl struct containing the distance result.
+    /// \return A reference on fcl struct containing the distance result, referring an element
+    /// of vector geomData::distance_results.
     ///
-    DistanceResult computeDistance(const CollisionPair & pair) const;
+    fcl::DistanceResult & computeDistance(const Index & pairId);
     
     ///
     /// \brief Compute the distance result for all collision pairs according to
     ///        the current placements of the geometries stored in GeometryData::oMg.
-    ///        The results are stored in the vector GeometryData::distance_results.
     ///
-    void computeAllDistances();
+    /// The method indeed calls computeDistance for each collision
+    /// pair. Consequently the results are stored in the vector
+    /// GeometryData::distance_results.
+    ///
+    void computeAllDistances() PINOCCHIO_DEPRECATED;
     
     void resetDistances();
 #endif //WITH_HPP_FCL
diff --git a/src/multibody/geometry.hxx b/src/multibody/geometry.hxx
index 7048c9439..b42615045 100644
--- a/src/multibody/geometry.hxx
+++ b/src/multibody/geometry.hxx
@@ -179,7 +179,7 @@ namespace se3
                                                           collisionPairs.end(),
                                                           pair);
     
-    return (Index) distance(collisionPairs.begin(), it);
+    return (Index) std::distance(collisionPairs.begin(), it);
   }
 
   inline void GeometryModel::displayCollisionPairs() const
@@ -242,31 +242,33 @@ namespace se3
     return false;
   }
 
-  inline DistanceResult GeometryData::computeDistance(const CollisionPair & pair) const
+  inline fcl::DistanceResult & GeometryData::computeDistance(const Index & pairId )
   {
-    const Index & co1 = pair.first;     assert(co1<collisionObjects.size());
-    const Index & co2 = pair.second;    assert(co2<collisionObjects.size());
-    
-    fcl::DistanceRequest distanceRequest (true, 0, 0, fcl::GST_INDEP);
-    fcl::DistanceResult result;
-    fcl::distance ( &collisionObjects[co1],&collisionObjects[co2],
-                    distanceRequest, result);
+    assert( pairId < model_geom.collisionPairs.size() );
+    const CollisionPair & pair = model_geom.collisionPairs[pairId];
+
+    assert( pair < distance_results.size() );
+    assert( pair.first  < collisionObjects.size() );
+    assert( pair.second < collisionObjects.size() );
     
-    return DistanceResult (result, co1, co2);
+    fcl::distance ( &collisionObjects[pair.first],&collisionObjects[pair.second],
+                    distanceRequest, distance_results[pairId]);
+
+    return distance_results[pairId];
   }
   
   inline void GeometryData::computeAllDistances ()
   {
+    assert( activeCollisionPairs.size() == model_geom.collisionPairs.size() );
     for(size_t i = 0; i<activeCollisionPairs.size(); ++i)
     {
-      if (activeCollisionPairs[i])
-        distance_results[i] = computeDistance(model_geom.collisionPairs[i]);
+      if (activeCollisionPairs[i]) computeDistance(i);
     }
   }
 
   inline void GeometryData::resetDistances()
   {
-    std::fill(distance_results.begin(), distance_results.end(), DistanceResult( fcl::DistanceResult(), 0, 0) );
+    std::fill(distance_results.begin(), distance_results.end(), fcl::DistanceResult() );
   }
 #endif //WITH_HPP_FCL
 } // namespace se3
-- 
GitLab