From 4f75ae6af65314dcff38982fc3a239c2d223563a Mon Sep 17 00:00:00 2001 From: Lucile Remigy <lucile.remigy@epitech.eu> Date: Mon, 21 Oct 2019 14:49:57 +0200 Subject: [PATCH] traits collision_func_matrix.cpp --- src/collision_func_matrix.cpp | 233 ++++++++++++---------------------- src/traits_traversal.h | 23 +++- 2 files changed, 100 insertions(+), 156 deletions(-) diff --git a/src/collision_func_matrix.cpp b/src/collision_func_matrix.cpp index 78e9719e..73d6a931 100644 --- a/src/collision_func_matrix.cpp +++ b/src/collision_func_matrix.cpp @@ -49,92 +49,24 @@ namespace fcl { #ifdef HPP_FCL_HAVE_OCTOMAP -template<typename T_SH> -std::size_t ShapeOcTreeCollide(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, - const GJKSolver* nsolver, - const CollisionRequest& request, CollisionResult& result) -{ - if(request.isSatisfied(result)) return result.numContacts(); - ShapeOcTreeCollisionTraversalNode<T_SH> node (request); - const T_SH* obj1 = static_cast<const T_SH*>(o1); - const OcTree* obj2 = static_cast<const OcTree*>(o2); - OcTreeSolver otsolver(nsolver); - - initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, result); - collide(&node, request, result); - - return result.numContacts(); -} - -template<typename T_SH> -std::size_t OcTreeShapeCollide(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, +template<typename TypeA, typename TypeB> +std::size_t Collide(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const GJKSolver* nsolver, const CollisionRequest& request, CollisionResult& result) { if(request.isSatisfied(result)) return result.numContacts(); - OcTreeShapeCollisionTraversalNode<T_SH> node (request); - const OcTree* obj1 = static_cast<const OcTree*>(o1); - const T_SH* obj2 = static_cast<const T_SH*>(o2); + typename TraversalTraits<TypeA, TypeB>::CollisionTraversal_t node (request); + const TypeA* obj1 = static_cast<const TypeA*>(o1); + const TypeB* obj2 = static_cast<const TypeB*>(o2); OcTreeSolver otsolver(nsolver); initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, result); collide(&node, request, result); return result.numContacts(); -} - -std::size_t OcTreeCollide(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, - const GJKSolver* nsolver, - const CollisionRequest& request, CollisionResult& result) -{ - if(request.isSatisfied(result)) return result.numContacts(); - - OcTreeCollisionTraversalNode node (request); - const OcTree* obj1 = static_cast<const OcTree*>(o1); - const OcTree* obj2 = static_cast<const OcTree*>(o2); - OcTreeSolver otsolver(nsolver); - - initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, result); - collide(&node, request, result); - - return result.numContacts(); -} - -template<typename T_BVH> -std::size_t OcTreeBVHCollide(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, - const GJKSolver* nsolver, - const CollisionRequest& request, CollisionResult& result) -{ - if(request.isSatisfied(result)) return result.numContacts(); - - OcTreeMeshCollisionTraversalNode<T_BVH> node (request); - const OcTree* obj1 = static_cast<const OcTree*>(o1); - const BVHModel<T_BVH>* obj2 = static_cast<const BVHModel<T_BVH>*>(o2); - OcTreeSolver otsolver(nsolver); - - initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, result); - collide(&node, request, result); - return result.numContacts(); -} -template<typename T_BVH> -std::size_t BVHOcTreeCollide(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, - const GJKSolver* nsolver, - const CollisionRequest& request, CollisionResult& result) -{ - if(request.isSatisfied(result)) return result.numContacts(); - - MeshOcTreeCollisionTraversalNode<T_BVH> node (request); - const BVHModel<T_BVH>* obj1 = static_cast<const BVHModel<T_BVH>*>(o1); - const OcTree* obj2 = static_cast<const OcTree*>(o2); - OcTreeSolver otsolver(nsolver); - - initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, result); - collide(&node, request, result); - return result.numContacts(); -} #endif @@ -178,6 +110,28 @@ std::size_t ShapeShapeCollide(const CollisionGeometry* o1, const Transform3f& tf return 0; } +namespace details +{ + +template<typename OrientMeshShapeCollisionTraveralNode, typename T_BVH, typename T_SH> +std::size_t orientedBVHShapeCollide(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, + const GJKSolver* nsolver, + const CollisionRequest& request, CollisionResult& result) +{ + if(request.isSatisfied(result)) return result.numContacts(); + + OrientMeshShapeCollisionTraveralNode node (request); + const BVHModel<T_BVH>* obj1 = static_cast<const BVHModel<T_BVH>* >(o1); + const T_SH* obj2 = static_cast<const T_SH*>(o2); + + initialize(node, *obj1, tf1, *obj2, tf2, nsolver, result); + fcl::collide(&node, request, result); + return result.numContacts(); +} + +} + + template<typename T_BVH, typename T_SH> struct BVHShapeCollider { @@ -201,28 +155,6 @@ struct BVHShapeCollider } }; -namespace details -{ - -template<typename OrientMeshShapeCollisionTraveralNode, typename T_BVH, typename T_SH> -std::size_t orientedBVHShapeCollide(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, - const GJKSolver* nsolver, - const CollisionRequest& request, CollisionResult& result) -{ - if(request.isSatisfied(result)) return result.numContacts(); - - OrientMeshShapeCollisionTraveralNode node (request); - const BVHModel<T_BVH>* obj1 = static_cast<const BVHModel<T_BVH>* >(o1); - const T_SH* obj2 = static_cast<const T_SH*>(o2); - - initialize(node, *obj1, tf1, *obj2, tf2, nsolver, result); - fcl::collide(&node, request, result); - return result.numContacts(); -} - -} - - template<typename T_SH> struct BVHShapeCollider<OBB, T_SH> { @@ -270,6 +202,24 @@ struct BVHShapeCollider<OBBRSS, T_SH> } }; +namespace details +{ +template<typename OrientedMeshCollisionTraversalNode, typename T_BVH> +std::size_t orientedMeshCollide(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const CollisionRequest& request, CollisionResult& result) +{ + if(request.isSatisfied(result)) return result.numContacts(); + + OrientedMeshCollisionTraversalNode node (request); + const BVHModel<T_BVH>* obj1 = static_cast<const BVHModel<T_BVH>* >(o1); + const BVHModel<T_BVH>* obj2 = static_cast<const BVHModel<T_BVH>* >(o2); + + initialize(node, *obj1, tf1, *obj2, tf2, result); + collide(&node, request, result); + + return result.numContacts(); +} + +} template<typename T_BVH> std::size_t BVHCollide(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const CollisionRequest& request, CollisionResult& result) @@ -293,25 +243,6 @@ std::size_t BVHCollide(const CollisionGeometry* o1, const Transform3f& tf1, cons return result.numContacts(); } -namespace details -{ -template<typename OrientedMeshCollisionTraversalNode, typename T_BVH> -std::size_t orientedMeshCollide(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const CollisionRequest& request, CollisionResult& result) -{ - if(request.isSatisfied(result)) return result.numContacts(); - - OrientedMeshCollisionTraversalNode node (request); - const BVHModel<T_BVH>* obj1 = static_cast<const BVHModel<T_BVH>* >(o1); - const BVHModel<T_BVH>* obj2 = static_cast<const BVHModel<T_BVH>* >(o2); - - initialize(node, *obj1, tf1, *obj2, tf2, result); - collide(&node, request, result); - - return result.numContacts(); -} - -} - template<> std::size_t BVHCollide<OBB>(const CollisionGeometry* o1, const Transform3f& tf1, const CollisionGeometry* o2, const Transform3f& tf2, const CollisionRequest& request, CollisionResult& result) { @@ -503,43 +434,43 @@ CollisionFunctionMatrix::CollisionFunctionMatrix() collision_matrix[BV_OBBRSS][BV_OBBRSS] = &BVHCollide<OBBRSS>; #ifdef HPP_FCL_HAVE_OCTOMAP - collision_matrix[GEOM_OCTREE][GEOM_BOX] = &OcTreeShapeCollide<Box>; - collision_matrix[GEOM_OCTREE][GEOM_SPHERE] = &OcTreeShapeCollide<Sphere>; - collision_matrix[GEOM_OCTREE][GEOM_CAPSULE] = &OcTreeShapeCollide<Capsule>; - collision_matrix[GEOM_OCTREE][GEOM_CONE] = &OcTreeShapeCollide<Cone>; - collision_matrix[GEOM_OCTREE][GEOM_CYLINDER] = &OcTreeShapeCollide<Cylinder>; - collision_matrix[GEOM_OCTREE][GEOM_CONVEX] = &OcTreeShapeCollide<ConvexBase>; - collision_matrix[GEOM_OCTREE][GEOM_PLANE] = &OcTreeShapeCollide<Plane>; - collision_matrix[GEOM_OCTREE][GEOM_HALFSPACE] = &OcTreeShapeCollide<Halfspace>; - - collision_matrix[GEOM_BOX][GEOM_OCTREE] = &ShapeOcTreeCollide<Box>; - collision_matrix[GEOM_SPHERE][GEOM_OCTREE] = &ShapeOcTreeCollide<Sphere>; - collision_matrix[GEOM_CAPSULE][GEOM_OCTREE] = &ShapeOcTreeCollide<Capsule>; - collision_matrix[GEOM_CONE][GEOM_OCTREE] = &ShapeOcTreeCollide<Cone>; - collision_matrix[GEOM_CYLINDER][GEOM_OCTREE] = &ShapeOcTreeCollide<Cylinder>; - collision_matrix[GEOM_CONVEX][GEOM_OCTREE] = &ShapeOcTreeCollide<ConvexBase>; - collision_matrix[GEOM_PLANE][GEOM_OCTREE] = &ShapeOcTreeCollide<Plane>; - collision_matrix[GEOM_HALFSPACE][GEOM_OCTREE] = &ShapeOcTreeCollide<Halfspace>; - - collision_matrix[GEOM_OCTREE][GEOM_OCTREE] = &OcTreeCollide; - - collision_matrix[GEOM_OCTREE][BV_AABB] = &OcTreeBVHCollide<AABB>; - collision_matrix[GEOM_OCTREE][BV_OBB] = &OcTreeBVHCollide<OBB>; - collision_matrix[GEOM_OCTREE][BV_RSS] = &OcTreeBVHCollide<RSS>; - collision_matrix[GEOM_OCTREE][BV_OBBRSS] = &OcTreeBVHCollide<OBBRSS>; - collision_matrix[GEOM_OCTREE][BV_kIOS] = &OcTreeBVHCollide<kIOS>; - collision_matrix[GEOM_OCTREE][BV_KDOP16] = &OcTreeBVHCollide<KDOP<16> >; - collision_matrix[GEOM_OCTREE][BV_KDOP18] = &OcTreeBVHCollide<KDOP<18> >; - collision_matrix[GEOM_OCTREE][BV_KDOP24] = &OcTreeBVHCollide<KDOP<24> >; - - collision_matrix[BV_AABB][GEOM_OCTREE] = &BVHOcTreeCollide<AABB>; - collision_matrix[BV_OBB][GEOM_OCTREE] = &BVHOcTreeCollide<OBB>; - collision_matrix[BV_RSS][GEOM_OCTREE] = &BVHOcTreeCollide<RSS>; - collision_matrix[BV_OBBRSS][GEOM_OCTREE] = &BVHOcTreeCollide<OBBRSS>; - collision_matrix[BV_kIOS][GEOM_OCTREE] = &BVHOcTreeCollide<kIOS>; - collision_matrix[BV_KDOP16][GEOM_OCTREE] = &BVHOcTreeCollide<KDOP<16> >; - collision_matrix[BV_KDOP18][GEOM_OCTREE] = &BVHOcTreeCollide<KDOP<18> >; - collision_matrix[BV_KDOP24][GEOM_OCTREE] = &BVHOcTreeCollide<KDOP<24> >; + collision_matrix[GEOM_OCTREE][GEOM_BOX] = &Collide<Box>; + collision_matrix[GEOM_OCTREE][GEOM_SPHERE] = &Collide<Sphere>; + collision_matrix[GEOM_OCTREE][GEOM_CAPSULE] = &Collide<Capsule>; + collision_matrix[GEOM_OCTREE][GEOM_CONE] = &Collide<Cone>; + collision_matrix[GEOM_OCTREE][GEOM_CYLINDER] = &Collide<Cylinder>; + collision_matrix[GEOM_OCTREE][GEOM_CONVEX] = &Collide<ConvexBase>; + collision_matrix[GEOM_OCTREE][GEOM_PLANE] = &Collide<Plane>; + collision_matrix[GEOM_OCTREE][GEOM_HALFSPACE] = &Collide<Halfspace>; + + collision_matrix[GEOM_BOX][GEOM_OCTREE] = &Collide<Box>; + collision_matrix[GEOM_SPHERE][GEOM_OCTREE] = &Collide<Sphere>; + collision_matrix[GEOM_CAPSULE][GEOM_OCTREE] = &Collide<Capsule>; + collision_matrix[GEOM_CONE][GEOM_OCTREE] = &Collide<Cone>; + collision_matrix[GEOM_CYLINDER][GEOM_OCTREE] = &Collide<Cylinder>; + collision_matrix[GEOM_CONVEX][GEOM_OCTREE] = &Collide<ConvexBase>; + collision_matrix[GEOM_PLANE][GEOM_OCTREE] = &Collide<Plane>; + collision_matrix[GEOM_HALFSPACE][GEOM_OCTREE] = &Collide<Halfspace>; + + collision_matrix[GEOM_OCTREE][GEOM_OCTREE] = &Collide; + + collision_matrix[GEOM_OCTREE][BV_AABB] = &Collide<AABB>; + collision_matrix[GEOM_OCTREE][BV_OBB] = &Collide<OBB>; + collision_matrix[GEOM_OCTREE][BV_RSS] = &Collide<RSS>; + collision_matrix[GEOM_OCTREE][BV_OBBRSS] = &Collide<OBBRSS>; + collision_matrix[GEOM_OCTREE][BV_kIOS] = &Collide<kIOS>; + collision_matrix[GEOM_OCTREE][BV_KDOP16] = &Collide<KDOP<16> >; + collision_matrix[GEOM_OCTREE][BV_KDOP18] = &Collide<KDOP<18> >; + collision_matrix[GEOM_OCTREE][BV_KDOP24] = &Collide<KDOP<24> >; + + collision_matrix[BV_AABB][GEOM_OCTREE] = &Collide<AABB>; + collision_matrix[BV_OBB][GEOM_OCTREE] = &Collide<OBB>; + collision_matrix[BV_RSS][GEOM_OCTREE] = &Collide<RSS>; + collision_matrix[BV_OBBRSS][GEOM_OCTREE] = &Collide<OBBRSS>; + collision_matrix[BV_kIOS][GEOM_OCTREE] = &Collide<kIOS>; + collision_matrix[BV_KDOP16][GEOM_OCTREE] = &Collide<KDOP<16> >; + collision_matrix[BV_KDOP18][GEOM_OCTREE] = &Collide<KDOP<18> >; + collision_matrix[BV_KDOP24][GEOM_OCTREE] = &Collide<KDOP<24> >; #endif } //template struct CollisionFunctionMatrix; diff --git a/src/traits_traversal.h b/src/traits_traversal.h index 312e27d5..f67db364 100644 --- a/src/traits_traversal.h +++ b/src/traits_traversal.h @@ -46,6 +46,7 @@ namespace hpp { namespace fcl { + template <typename TypeA, typename TypeB> struct TraversalTraits { @@ -54,31 +55,43 @@ struct TraversalTraits template <typename T_SH> struct TraversalTraits <T_SH, OcTree> { - typedef ShapeOcTreeCollisionTraversalNode<T_SH, GJKSolver> CollisionTraversal_t; + typedef ShapeOcTreeCollisionTraversalNode<T_SH> CollisionTraversal_t; }; template <typename T_SH> struct TraversalTraits <OcTree, T_SH> { - typedef OcTreeShapeCollisionTraversalNode<T_SH, GJKSolver> CollisionTraversal_t; + typedef OcTreeShapeCollisionTraversalNode<T_SH> CollisionTraversal_t; }; template <> struct TraversalTraits <OcTree, OcTree> { - typedef OcTreeCollisionTraversalNode<GJKSolver> CollisionTraversal_t; + typedef OcTreeCollisionTraversalNode<> CollisionTraversal_t; }; template <typename T_BVH> struct TraversalTraits <OcTree, BVHModel<T_BVH>> { - typedef OcTreeMeshCollisionTraversalNode<T_BVH, GJKSolver> CollisionTraversal_t; + typedef OcTreeMeshCollisionTraversalNode<T_BVH> CollisionTraversal_t; }; template <typename T_BVH> struct TraversalTraits <BVHModel<T_BVH>, OcTree> { - typedef MeshOcTreeCollisionTraversalNode<T_BVH, GJKSolver> CollisionTraversal_t; + typedef MeshOcTreeCollisionTraversalNode<T_BVH> CollisionTraversal_t; +}; + +template <typename OrientedMeshCollisionTraversalNode, typename T_BVH, typename T_SH> +struct TraversalTraits <BVHModel<T_BVH>, T_SH> +{ + typedef OrientMeshShapeCollisionTraveralNode<> CollisionTraversal_t; +}; + +template <typename OrientedMeshCollisionTraversalNode, typename T_BVH> +struct TraversalTraits <BVHModel<T_BVH>, BVHModel<T_BVH>> +{ + typedef OrientedMeshCollisionTraversalNode<> CollisionTraversal_t; }; -- GitLab