From 8add7f84944b208de41bafc7b172088ea8c91aa1 Mon Sep 17 00:00:00 2001 From: jpan <jpan@253336fb-580f-4252-a368-f3cef5a2a82b> Date: Wed, 11 Jul 2012 00:47:18 +0000 Subject: [PATCH] change to new libccd distance. need to use the new version of libccd. git-svn-id: https://kforge.ros.org/fcl/fcl_ros@125 253336fb-580f-4252-a368-f3cef5a2a82b --- trunk/fcl/include/fcl/broad_phase_collision.h | 26 ++++++-- trunk/fcl/include/fcl/hierarchy_tree.h | 15 +++++ .../fcl/include/fcl/narrowphase/narrowphase.h | 8 +-- trunk/fcl/src/broad_phase_collision.cpp | 62 ++++++++++++++----- trunk/fcl/src/gjk_libccd.cpp | 61 ++++++++++++------ 5 files changed, 129 insertions(+), 43 deletions(-) diff --git a/trunk/fcl/include/fcl/broad_phase_collision.h b/trunk/fcl/include/fcl/broad_phase_collision.h index d07c2b45..e1e05634 100644 --- a/trunk/fcl/include/fcl/broad_phase_collision.h +++ b/trunk/fcl/include/fcl/broad_phase_collision.h @@ -490,12 +490,14 @@ void SpatialHashingCollisionManager<HashTable>::getObjects(std::vector<Collision template<typename HashTable> void SpatialHashingCollisionManager<HashTable>::collide(CollisionObject* obj, void* cdata, CollisionCallBack callback) const { + if(size() == 0) return; collide_(obj, cdata, callback); } template<typename HashTable> void SpatialHashingCollisionManager<HashTable>::distance(CollisionObject* obj, void* cdata, DistanceCallBack callback) const { + if(size() == 0) return; FCL_REAL min_dist = std::numeric_limits<FCL_REAL>::max(); distance_(obj, cdata, callback, min_dist); } @@ -503,8 +505,6 @@ void SpatialHashingCollisionManager<HashTable>::distance(CollisionObject* obj, v template<typename HashTable> bool SpatialHashingCollisionManager<HashTable>::collide_(CollisionObject* obj, void* cdata, CollisionCallBack callback) const { - if(size() == 0) return false; - const AABB& obj_aabb = obj->getAABB(); AABB overlap_aabb; @@ -543,8 +543,6 @@ bool SpatialHashingCollisionManager<HashTable>::collide_(CollisionObject* obj, v template<typename HashTable> bool SpatialHashingCollisionManager<HashTable>::distance_(CollisionObject* obj, void* cdata, DistanceCallBack callback, FCL_REAL& min_dist) const { - if(size() == 0) return false; - Vec3f delta = (obj->getAABB().max_ - obj->getAABB().min_) * 0.5; AABB aabb = obj->getAABB(); if(min_dist < std::numeric_limits<FCL_REAL>::max()) @@ -700,6 +698,8 @@ void SpatialHashingCollisionManager<HashTable>::collide(void* cdata, CollisionCa template<typename HashTable> void SpatialHashingCollisionManager<HashTable>::distance(void* cdata, DistanceCallBack callback) const { + if(size() == 0) return; + enable_tested_set_ = true; tested_set.clear(); @@ -716,6 +716,9 @@ template<typename HashTable> void SpatialHashingCollisionManager<HashTable>::collide(BroadPhaseCollisionManager* other_manager_, void* cdata, CollisionCallBack callback) const { SpatialHashingCollisionManager<HashTable>* other_manager = static_cast<SpatialHashingCollisionManager<HashTable>* >(other_manager_); + + if((size() == 0) || (other_manager->size() == 0)) return; + if(this == other_manager) { collide(cdata, callback); @@ -738,6 +741,9 @@ template<typename HashTable> void SpatialHashingCollisionManager<HashTable>::distance(BroadPhaseCollisionManager* other_manager_, void* cdata, DistanceCallBack callback) const { SpatialHashingCollisionManager<HashTable>* other_manager = static_cast<SpatialHashingCollisionManager<HashTable>* >(other_manager_); + + if((size() == 0) || (other_manager->size() == 0)) return; + if(this == other_manager) { distance(cdata, callback); @@ -1328,12 +1334,14 @@ public: /** \brief perform collision test between one object and all the objects belonging to the manager */ void collide(CollisionObject* obj, void* cdata, CollisionCallBack callback) const { + if(size() == 0) return; collisionRecurse(dtree.getRoot(), obj, cdata, callback); } /** \brief perform distance computation between one object and all the objects belonging to the manager */ void distance(CollisionObject* obj, void* cdata, DistanceCallBack callback) const { + if(size() == 0) return; FCL_REAL min_dist = std::numeric_limits<FCL_REAL>::max(); distanceRecurse(dtree.getRoot(), obj, cdata, callback, min_dist); } @@ -1341,12 +1349,14 @@ public: /** \brief perform collision test for the objects belonging to the manager (i.e., N^2 self collision) */ void collide(void* cdata, CollisionCallBack callback) const { + if(size() == 0) return; selfCollisionRecurse(dtree.getRoot(), cdata, callback); } /** \brief perform distance test for the objects belonging to the manager (i.e., N^2 self distance) */ void distance(void* cdata, DistanceCallBack callback) const { + if(size() == 0) return; FCL_REAL min_dist = std::numeric_limits<FCL_REAL>::max(); selfDistanceRecurse(dtree.getRoot(), cdata, callback, min_dist); } @@ -1355,6 +1365,7 @@ public: void collide(BroadPhaseCollisionManager* other_manager_, void* cdata, CollisionCallBack callback) const { DynamicAABBTreeCollisionManager* other_manager = static_cast<DynamicAABBTreeCollisionManager*>(other_manager_); + if((size() == 0) || (other_manager->size() == 0)) return; collisionRecurse(dtree.getRoot(), other_manager->dtree.getRoot(), cdata, callback); } @@ -1362,6 +1373,7 @@ public: void distance(BroadPhaseCollisionManager* other_manager_, void* cdata, DistanceCallBack callback) const { DynamicAABBTreeCollisionManager* other_manager = static_cast<DynamicAABBTreeCollisionManager*>(other_manager_); + if((size() == 0) || (other_manager->size() == 0)) return; FCL_REAL min_dist = std::numeric_limits<FCL_REAL>::max(); distanceRecurse(dtree.getRoot(), other_manager->dtree.getRoot(), cdata, callback, min_dist); } @@ -1464,12 +1476,14 @@ public: /** \brief perform collision test between one object and all the objects belonging to the manager */ void collide(CollisionObject* obj, void* cdata, CollisionCallBack callback) const { + if(size() == 0) return; collisionRecurse(dtree.getNodes(), dtree.getRoot(), obj, cdata, callback); } /** \brief perform distance computation between one object and all the objects belonging to the manager */ void distance(CollisionObject* obj, void* cdata, DistanceCallBack callback) const { + if(size() == 0) return; FCL_REAL min_dist = std::numeric_limits<FCL_REAL>::max(); distanceRecurse(dtree.getNodes(), dtree.getRoot(), obj, cdata, callback, min_dist); } @@ -1477,12 +1491,14 @@ public: /** \brief perform collision test for the objects belonging to the manager (i.e., N^2 self collision) */ void collide(void* cdata, CollisionCallBack callback) const { + if(size() == 0) return; selfCollisionRecurse(dtree.getNodes(), dtree.getRoot(), cdata, callback); } /** \brief perform distance test for the objects belonging to the manager (i.e., N^2 self distance) */ void distance(void* cdata, DistanceCallBack callback) const { + if(size() == 0) return; FCL_REAL min_dist = std::numeric_limits<FCL_REAL>::max(); selfDistanceRecurse(dtree.getNodes(), dtree.getRoot(), cdata, callback, min_dist); } @@ -1491,6 +1507,7 @@ public: void collide(BroadPhaseCollisionManager* other_manager_, void* cdata, CollisionCallBack callback) const { DynamicAABBTreeCollisionManager2* other_manager = static_cast<DynamicAABBTreeCollisionManager2*>(other_manager_); + if((size() == 0) || (other_manager->size() == 0)) return; collisionRecurse(dtree.getNodes(), dtree.getRoot(), other_manager->dtree.getNodes(), other_manager->dtree.getRoot(), cdata, callback); } @@ -1498,6 +1515,7 @@ public: void distance(BroadPhaseCollisionManager* other_manager_, void* cdata, DistanceCallBack callback) const { DynamicAABBTreeCollisionManager2* other_manager = static_cast<DynamicAABBTreeCollisionManager2*>(other_manager_); + if((size() == 0) || (other_manager->size() == 0)) return; FCL_REAL min_dist = std::numeric_limits<FCL_REAL>::max(); distanceRecurse(dtree.getNodes(), dtree.getRoot(), other_manager->dtree.getNodes(), other_manager->dtree.getRoot(), cdata, callback, min_dist); } diff --git a/trunk/fcl/include/fcl/hierarchy_tree.h b/trunk/fcl/include/fcl/hierarchy_tree.h index 49df8dda..254ed180 100644 --- a/trunk/fcl/include/fcl/hierarchy_tree.h +++ b/trunk/fcl/include/fcl/hierarchy_tree.h @@ -63,6 +63,13 @@ struct NodeBase }; FCL_UINT32 code; + + NodeBase() + { + parent = NULL; + childs[0] = NULL; + childs[1] = NULL; + } }; template<typename BV> @@ -223,11 +230,15 @@ public: size_t getMaxHeight() const { + if(!root_node) + return 0; return getMaxHeight(root_node); } size_t getMaxDepth() const { + if(!root_node) return 0; + size_t max_depth; getMaxDepth(root_node, 0, max_depth); return max_depth; @@ -1366,11 +1377,15 @@ public: size_t getMaxHeight() const { + if(root_node == NULL_NODE) return 0; + return getMaxHeight(root_node); } size_t getMaxDepth() const { + if(root_node == NULL_NODE) return 0; + size_t max_depth; getMaxDepth(root_node, 0, max_depth); return max_depth; diff --git a/trunk/fcl/include/fcl/narrowphase/narrowphase.h b/trunk/fcl/include/fcl/narrowphase/narrowphase.h index 6091684a..7582b0c6 100644 --- a/trunk/fcl/include/fcl/narrowphase/narrowphase.h +++ b/trunk/fcl/include/fcl/narrowphase/narrowphase.h @@ -121,8 +121,6 @@ struct GJKSolver_libccd max_distance_iterations, distance_tolerance, dist); - if(*dist > 0) *dist = std::sqrt(*dist); - details::GJKInitializer<S1>::deleteGJKObject(o1); details::GJKInitializer<S2>::deleteGJKObject(o2); @@ -143,8 +141,6 @@ struct GJKSolver_libccd o2, details::triGetSupportFunction(), max_distance_iterations, distance_tolerance, dist); - - if(*dist > 0) *dist = std::sqrt(*dist); details::GJKInitializer<S>::deleteGJKObject(o1); details::triDeleteGJKObject(o2); @@ -165,8 +161,6 @@ struct GJKSolver_libccd o2, details::triGetSupportFunction(), max_distance_iterations, distance_tolerance, dist); - - if(*dist > 0) *dist = std::sqrt(*dist); details::GJKInitializer<S>::deleteGJKObject(o1); details::triDeleteGJKObject(o2); @@ -178,7 +172,7 @@ struct GJKSolver_libccd GJKSolver_libccd() { max_collision_iterations = 500; - max_distance_iterations = 500; + max_distance_iterations = 1000; collision_tolerance = 1e-6; distance_tolerance = 1e-6; } diff --git a/trunk/fcl/src/broad_phase_collision.cpp b/trunk/fcl/src/broad_phase_collision.cpp index 2eeffb1d..5e8fbb8a 100644 --- a/trunk/fcl/src/broad_phase_collision.cpp +++ b/trunk/fcl/src/broad_phase_collision.cpp @@ -191,6 +191,8 @@ void NaiveCollisionManager::collide(BroadPhaseCollisionManager* other_manager_, { NaiveCollisionManager* other_manager = static_cast<NaiveCollisionManager*>(other_manager_); + if((size() == 0) || (other_manager->size() == 0)) return; + if(this == other_manager) { collide(cdata, callback); @@ -214,6 +216,8 @@ void NaiveCollisionManager::distance(BroadPhaseCollisionManager* other_manager_, { NaiveCollisionManager* other_manager = static_cast<NaiveCollisionManager*>(other_manager_); + if((size() == 0) || (other_manager->size() == 0)) return; + if(this == other_manager) { distance(cdata, callback); @@ -414,13 +418,13 @@ bool SSaPCollisionManager::checkDis(std::vector<CollisionObject*>::const_iterato void SSaPCollisionManager::collide(CollisionObject* obj, void* cdata, CollisionCallBack callback) const { + if(size() == 0) return; + collide_(obj, cdata, callback); } bool SSaPCollisionManager::collide_(CollisionObject* obj, void* cdata, CollisionCallBack callback) const { - if(size() == 0) return false; - static const unsigned int CUTOFF = 100; DummyCollisionObject dummyHigh(AABB(obj->getAABB().max_)); @@ -469,14 +473,14 @@ bool SSaPCollisionManager::collide_(CollisionObject* obj, void* cdata, Collision void SSaPCollisionManager::distance(CollisionObject* obj, void* cdata, DistanceCallBack callback) const { + if(size() == 0) return; + FCL_REAL min_dist = std::numeric_limits<FCL_REAL>::max(); distance_(obj, cdata, callback, min_dist); } bool SSaPCollisionManager::distance_(CollisionObject* obj, void* cdata, DistanceCallBack callback, FCL_REAL& min_dist) const { - if(size() == 0) return false; - static const unsigned int CUTOFF = 100; Vec3f delta = (obj->getAABB().max_ - obj->getAABB().min_) * 0.5; Vec3f dummy_vector = obj->getAABB().max_; @@ -574,8 +578,7 @@ bool SSaPCollisionManager::distance_(CollisionObject* obj, void* cdata, Distance void SSaPCollisionManager::collide(void* cdata, CollisionCallBack callback) const { - if(size() == 0) - return; + if(size() == 0) return; std::vector<CollisionObject*>::const_iterator pos, run_pos, pos_end; size_t axis = selectOptimalAxis(objs_x, objs_y, objs_z, @@ -631,8 +634,7 @@ void SSaPCollisionManager::collide(void* cdata, CollisionCallBack callback) cons void SSaPCollisionManager::distance(void* cdata, DistanceCallBack callback) const { - if(size() == 0) - return; + if(size() == 0) return; std::vector<CollisionObject*>::const_iterator it, it_end; size_t axis = selectOptimalAxis(objs_x, objs_y, objs_z, it, it_end); @@ -648,6 +650,9 @@ void SSaPCollisionManager::distance(void* cdata, DistanceCallBack callback) cons void SSaPCollisionManager::collide(BroadPhaseCollisionManager* other_manager_, void* cdata, CollisionCallBack callback) const { SSaPCollisionManager* other_manager = static_cast<SSaPCollisionManager*>(other_manager_); + + if((size() == 0) || (other_manager->size() == 0)) return; + if(this == other_manager) { collide(cdata, callback); @@ -671,6 +676,9 @@ void SSaPCollisionManager::collide(BroadPhaseCollisionManager* other_manager_, v void SSaPCollisionManager::distance(BroadPhaseCollisionManager* other_manager_, void* cdata, DistanceCallBack callback) const { SSaPCollisionManager* other_manager = static_cast<SSaPCollisionManager*>(other_manager_); + + if((size() == 0) || (other_manager->size() == 0)) return; + if(this == other_manager) { distance(cdata, callback); @@ -1348,6 +1356,9 @@ void SaPCollisionManager::distance(void* cdata, DistanceCallBack callback) const void SaPCollisionManager::collide(BroadPhaseCollisionManager* other_manager_, void* cdata, CollisionCallBack callback) const { SaPCollisionManager* other_manager = static_cast<SaPCollisionManager*>(other_manager_); + + if((size() == 0) || (other_manager->size() == 0)) return; + if(this == other_manager) { collide(cdata, callback); @@ -1375,6 +1386,9 @@ void SaPCollisionManager::collide(BroadPhaseCollisionManager* other_manager_, vo void SaPCollisionManager::distance(BroadPhaseCollisionManager* other_manager_, void* cdata, DistanceCallBack callback) const { SaPCollisionManager* other_manager = static_cast<SaPCollisionManager*>(other_manager_); + + if((size() == 0) || (other_manager->size() == 0)) return; + if(this == other_manager) { distance(cdata, callback); @@ -1701,13 +1715,12 @@ void IntervalTreeCollisionManager::getObjects(std::vector<CollisionObject*>& obj void IntervalTreeCollisionManager::collide(CollisionObject* obj, void* cdata, CollisionCallBack callback) const { + if(size() == 0) return; collide_(obj, cdata, callback); } bool IntervalTreeCollisionManager::collide_(CollisionObject* obj, void* cdata, CollisionCallBack callback) const { - if(size() == 0) return false; - static const unsigned int CUTOFF = 100; std::deque<SimpleInterval*> results0, results1, results2; @@ -1744,14 +1757,13 @@ bool IntervalTreeCollisionManager::collide_(CollisionObject* obj, void* cdata, C void IntervalTreeCollisionManager::distance(CollisionObject* obj, void* cdata, DistanceCallBack callback) const { + if(size() == 0) return; FCL_REAL min_dist = std::numeric_limits<FCL_REAL>::max(); distance_(obj, cdata, callback, min_dist); } bool IntervalTreeCollisionManager::distance_(CollisionObject* obj, void* cdata, DistanceCallBack callback, FCL_REAL& min_dist) const { - if(size() == 0) return false; - static const unsigned int CUTOFF = 100; Vec3f delta = (obj->getAABB().max_ - obj->getAABB().min_) * 0.5; @@ -1895,6 +1907,8 @@ void IntervalTreeCollisionManager::collide(void* cdata, CollisionCallBack callba void IntervalTreeCollisionManager::distance(void* cdata, DistanceCallBack callback) const { + if(size() == 0) return; + enable_tested_set_ = true; tested_set.clear(); FCL_REAL min_dist = std::numeric_limits<FCL_REAL>::max(); @@ -1909,6 +1923,9 @@ void IntervalTreeCollisionManager::distance(void* cdata, DistanceCallBack callba void IntervalTreeCollisionManager::collide(BroadPhaseCollisionManager* other_manager_, void* cdata, CollisionCallBack callback) const { IntervalTreeCollisionManager* other_manager = static_cast<IntervalTreeCollisionManager*>(other_manager_); + + if((size() == 0) || (other_manager->size() == 0)) return; + if(this == other_manager) { collide(cdata, callback); @@ -1930,6 +1947,9 @@ void IntervalTreeCollisionManager::collide(BroadPhaseCollisionManager* other_man void IntervalTreeCollisionManager::distance(BroadPhaseCollisionManager* other_manager_, void* cdata, DistanceCallBack callback) const { IntervalTreeCollisionManager* other_manager = static_cast<IntervalTreeCollisionManager*>(other_manager_); + + if((size() == 0) || (other_manager->size() == 0)) return; + if(this == other_manager) { distance(cdata, callback); @@ -2055,8 +2075,15 @@ void DynamicAABBTreeCollisionManager::setup() { if(!setup_) { - int height = dtree.getMaxHeight(); int num = dtree.size(); + if(num == 0) + { + setup_ = true; + return; + } + + int height = dtree.getMaxHeight(); + if(height - std::log((FCL_REAL)num) / std::log(2.0) < max_tree_nonbalanced_level) dtree.balanceIncremental(tree_incremental_balance_pass); @@ -2365,8 +2392,15 @@ void DynamicAABBTreeCollisionManager2::setup() { if(!setup_) { - int height = dtree.getMaxHeight(); int num = dtree.size(); + if(num == 0) + { + setup_ = true; + return; + } + + int height = dtree.getMaxHeight(); + if(height - std::log((FCL_REAL)num) / std::log(2.0) < max_tree_nonbalanced_level) dtree.balanceIncremental(tree_incremental_balance_pass); diff --git a/trunk/fcl/src/gjk_libccd.cpp b/trunk/fcl/src/gjk_libccd.cpp index c445f592..a3bfaa30 100644 --- a/trunk/fcl/src/gjk_libccd.cpp +++ b/trunk/fcl/src/gjk_libccd.cpp @@ -491,7 +491,7 @@ static void convexToGJK(const Convex& s, const SimpleTransform& tf, ccd_convex_t /** Support functions */ static void supportBox(const void* obj, const ccd_vec3_t* dir_, ccd_vec3_t* v) { - const ccd_box_t* o = (const ccd_box_t*)obj; + const ccd_box_t* o = static_cast<const ccd_box_t*>(obj); ccd_vec3_t dir; ccdVec3Copy(&dir, dir_); ccdQuatRotVec(&dir, &o->rot_inv); @@ -504,7 +504,7 @@ static void supportBox(const void* obj, const ccd_vec3_t* dir_, ccd_vec3_t* v) static void supportCap(const void* obj, const ccd_vec3_t* dir_, ccd_vec3_t* v) { - const ccd_cap_t* o = (const ccd_cap_t*)obj; + const ccd_cap_t* o = static_cast<const ccd_cap_t*>(obj); ccd_vec3_t dir, pos1, pos2; ccdVec3Copy(&dir, dir_); @@ -530,7 +530,7 @@ static void supportCap(const void* obj, const ccd_vec3_t* dir_, ccd_vec3_t* v) static void supportCyl(const void* obj, const ccd_vec3_t* dir_, ccd_vec3_t* v) { - const ccd_cyl_t* cyl = (const ccd_cyl_t*)obj; + const ccd_cyl_t* cyl = static_cast<const ccd_cyl_t*>(obj); ccd_vec3_t dir; double zdist, rad; @@ -557,7 +557,7 @@ static void supportCyl(const void* obj, const ccd_vec3_t* dir_, ccd_vec3_t* v) static void supportCone(const void* obj, const ccd_vec3_t* dir_, ccd_vec3_t* v) { - const ccd_cone_t* cone = (const ccd_cone_t*)obj; + const ccd_cone_t* cone = static_cast<const ccd_cone_t*>(obj); ccd_vec3_t dir; ccdVec3Copy(&dir, dir_); @@ -588,7 +588,7 @@ static void supportCone(const void* obj, const ccd_vec3_t* dir_, ccd_vec3_t* v) static void supportSphere(const void* obj, const ccd_vec3_t* dir_, ccd_vec3_t* v) { - const ccd_sphere_t* s = (const ccd_sphere_t*)obj; + const ccd_sphere_t* s = static_cast<const ccd_sphere_t*>(obj); ccd_vec3_t dir; ccdVec3Copy(&dir, dir_); @@ -636,7 +636,7 @@ static void supportConvex(const void* obj, const ccd_vec3_t* dir_, ccd_vec3_t* v static void supportTriangle(const void* obj, const ccd_vec3_t* dir_, ccd_vec3_t* v) { - const ccd_triangle_t* tri = (const ccd_triangle_t*)obj; + const ccd_triangle_t* tri = static_cast<const ccd_triangle_t*>(obj); ccd_vec3_t dir, p; ccd_real_t maxdot, dot; int i; @@ -664,13 +664,13 @@ static void supportTriangle(const void* obj, const ccd_vec3_t* dir_, ccd_vec3_t* static void centerShape(const void* obj, ccd_vec3_t* c) { - const ccd_obj_t *o = (const ccd_obj_t*)obj; + const ccd_obj_t *o = static_cast<const ccd_obj_t*>(obj); ccdVec3Copy(c, &o->pos); } static void centerConvex(const void* obj, ccd_vec3_t* c) { - const ccd_convex_t *o = (const ccd_convex_t*)obj; + const ccd_convex_t *o = static_cast<const ccd_convex_t*>(obj); ccdVec3Set(c, o->convex->center[0], o->convex->center[1], o->convex->center[2]); ccdQuatRotVec(c, &o->rot); ccdVec3Add(c, &o->pos); @@ -678,7 +678,7 @@ static void centerConvex(const void* obj, ccd_vec3_t* c) static void centerTriangle(const void* obj, ccd_vec3_t* c) { - const ccd_triangle_t *o = (const ccd_triangle_t*)obj; + const ccd_triangle_t *o = static_cast<const ccd_triangle_t*>(obj); ccdVec3Copy(c, &o->c); ccdQuatRotVec(c, &o->rot); ccdVec3Add(c, &o->pos); @@ -722,6 +722,7 @@ bool GJKCollide(void* obj1, ccd_support_fn supp1, ccd_center_fn cen1, return false; } +/* bool GJKDistance(void* obj1, ccd_support_fn supp1, void* obj2, ccd_support_fn supp2, unsigned int max_iterations, FCL_REAL tolerance_, @@ -729,7 +730,6 @@ bool GJKDistance(void* obj1, ccd_support_fn supp1, { ccd_t ccd; ccd_real_t dist; - ccd_vec3_t dir, pos; CCD_INIT(&ccd); ccd.support1 = supp1; ccd.support2 = supp2; @@ -740,12 +740,37 @@ bool GJKDistance(void* obj1, ccd_support_fn supp1, ccd_simplex_t simplex; dist = __ccdGJKDist(obj1, obj2, &ccd, &simplex, tolerance); + + if(dist > 0) + { + *res = std::sqrt(dist); + return true; + } + else + return false; +} +*/ + +bool GJKDistance(void* obj1, ccd_support_fn supp1, + void* obj2, ccd_support_fn supp2, + unsigned int max_iterations, FCL_REAL tolerance, + FCL_REAL* res) +{ + ccd_t ccd; + ccd_real_t dist; + CCD_INIT(&ccd); + ccd.support1 = supp1; + ccd.support2 = supp2; + + ccd.max_iterations = max_iterations; + ccd.dist_tolerance = tolerance; + + dist = ccdGJKDist(obj1, obj2, &ccd); *res = dist; if(dist < 0) return false; else return true; } - GJKSupportFunction GJKInitializer<Cylinder>::getSupportFunction() { return &supportCyl; @@ -768,7 +793,7 @@ void* GJKInitializer<Cylinder>::createGJKObject(const Cylinder& s, const SimpleT void GJKInitializer<Cylinder>::deleteGJKObject(void* o_) { - ccd_cyl_t* o = (ccd_cyl_t*)o_; + ccd_cyl_t* o = static_cast<ccd_cyl_t*>(o_); delete o; } @@ -794,7 +819,7 @@ void* GJKInitializer<Sphere>::createGJKObject(const Sphere& s, const SimpleTrans void GJKInitializer<Sphere>::deleteGJKObject(void* o_) { - ccd_sphere_t* o = (ccd_sphere_t*)o_; + ccd_sphere_t* o = static_cast<ccd_sphere_t*>(o_); delete o; } @@ -820,7 +845,7 @@ void* GJKInitializer<Box>::createGJKObject(const Box& s, const SimpleTransform& void GJKInitializer<Box>::deleteGJKObject(void* o_) { - ccd_box_t* o = (ccd_box_t*)o_; + ccd_box_t* o = static_cast<ccd_box_t*>(o_); delete o; } @@ -847,7 +872,7 @@ void* GJKInitializer<Capsule>::createGJKObject(const Capsule& s, const SimpleTra void GJKInitializer<Capsule>::deleteGJKObject(void* o_) { - ccd_cap_t* o = (ccd_cap_t*)o_; + ccd_cap_t* o = static_cast<ccd_cap_t*>(o_); delete o; } @@ -874,7 +899,7 @@ void* GJKInitializer<Cone>::createGJKObject(const Cone& s, const SimpleTransform void GJKInitializer<Cone>::deleteGJKObject(void* o_) { - ccd_cone_t* o = (ccd_cone_t*)o_; + ccd_cone_t* o = static_cast<ccd_cone_t*>(o_); delete o; } @@ -901,7 +926,7 @@ void* GJKInitializer<Convex>::createGJKObject(const Convex& s, const SimpleTrans void GJKInitializer<Convex>::deleteGJKObject(void* o_) { - ccd_convex_t* o = (ccd_convex_t*)o_; + ccd_convex_t* o = static_cast<ccd_convex_t*>(o_); delete o; } @@ -954,7 +979,7 @@ void* triCreateGJKObject(const Vec3f& P1, const Vec3f& P2, const Vec3f& P3, cons void triDeleteGJKObject(void* o_) { - ccd_triangle_t* o = (ccd_triangle_t*)o_; + ccd_triangle_t* o = static_cast<ccd_triangle_t*>(o_); delete o; } -- GitLab