From 68756374120df479f4e322b080a5e8775134f845 Mon Sep 17 00:00:00 2001 From: Florent Lamiraux <florent@laas.fr> Date: Sun, 2 Dec 2018 07:13:31 +0100 Subject: [PATCH] Give CollisionRequest as input to CollisionTraversalNodeBase constructor - store const CollisionRequest& as a member instead of CollisionRequest, - remove member CollisionRequest::enable_distance_lower_bound, - modify constructors of all derived classes. --- .../hpp/fcl/traversal/traversal_node_base.h | 10 +--- .../fcl/traversal/traversal_node_bvh_shape.h | 27 ++++----- .../hpp/fcl/traversal/traversal_node_bvhs.h | 16 +++--- .../hpp/fcl/traversal/traversal_node_octree.h | 15 +++-- .../hpp/fcl/traversal/traversal_node_setup.h | 55 ++++--------------- .../hpp/fcl/traversal/traversal_node_shapes.h | 3 +- src/collision_func_matrix.cpp | 40 +++++++------- src/traversal/traversal_node_bvhs.cpp | 16 +++--- src/traversal/traversal_node_setup.cpp | 14 ++--- src/traversal/traversal_recurse.cpp | 6 +- test/benchmark.cpp | 4 +- test/test_fcl_collision.cpp | 37 ++++++------- test/test_fcl_distance.cpp | 16 +++--- test/test_fcl_frontlist.cpp | 46 +++++++--------- 14 files changed, 131 insertions(+), 174 deletions(-) diff --git a/include/hpp/fcl/traversal/traversal_node_base.h b/include/hpp/fcl/traversal/traversal_node_base.h index fed49bb3..f1651dad 100644 --- a/include/hpp/fcl/traversal/traversal_node_base.h +++ b/include/hpp/fcl/traversal/traversal_node_base.h @@ -90,9 +90,8 @@ public: class CollisionTraversalNodeBase : public TraversalNodeBase { public: - CollisionTraversalNodeBase(bool enable_distance_lower_bound_ = false) : - result(NULL), enable_statistics(false), - enable_distance_lower_bound (enable_distance_lower_bound_){} + CollisionTraversalNodeBase (const CollisionRequest& request_) : + request (request_), result(NULL), enable_statistics(false) {} virtual ~CollisionTraversalNodeBase(); @@ -118,16 +117,13 @@ public: void enableStatistics(bool enable) { enable_statistics = enable; } /// @brief request setting for collision - CollisionRequest request; + const CollisionRequest& request; /// @brief collision result kept during the traversal iteration CollisionResult* result; /// @brief Whether stores statistics bool enable_statistics; - - /// Whether to compute a lower bound on distance between bounding volumes - bool enable_distance_lower_bound; }; /// @brief Node structure encoding the information required for distance traversal. diff --git a/include/hpp/fcl/traversal/traversal_node_bvh_shape.h b/include/hpp/fcl/traversal/traversal_node_bvh_shape.h index 0e3171f3..73e6a9d2 100644 --- a/include/hpp/fcl/traversal/traversal_node_bvh_shape.h +++ b/include/hpp/fcl/traversal/traversal_node_bvh_shape.h @@ -54,8 +54,8 @@ template<typename BV, typename S> class BVHShapeCollisionTraversalNode : public CollisionTraversalNodeBase { public: - BVHShapeCollisionTraversalNode(bool enable_distance_lower_bound) : - CollisionTraversalNodeBase (enable_distance_lower_bound) + BVHShapeCollisionTraversalNode(const CollisionRequest& request) : + CollisionTraversalNodeBase (request) { model1 = NULL; model2 = NULL; @@ -115,7 +115,8 @@ template<typename S, typename BV> class ShapeBVHCollisionTraversalNode : public CollisionTraversalNodeBase { public: - ShapeBVHCollisionTraversalNode() : CollisionTraversalNodeBase() + ShapeBVHCollisionTraversalNode(const CollisionRequest& request) : + CollisionTraversalNodeBase(request) { model1 = NULL; model2 = NULL; @@ -182,8 +183,8 @@ template<typename BV, typename S, typename NarrowPhaseSolver> class MeshShapeCollisionTraversalNode : public BVHShapeCollisionTraversalNode<BV, S> { public: - MeshShapeCollisionTraversalNode(bool enable_distance_lower_bound = false) : - BVHShapeCollisionTraversalNode<BV, S> (enable_distance_lower_bound) + MeshShapeCollisionTraversalNode(const CollisionRequest& request) : + BVHShapeCollisionTraversalNode<BV, S> (request) { vertices = NULL; tri_indices = NULL; @@ -326,9 +327,9 @@ template<typename S, typename NarrowPhaseSolver> class MeshShapeCollisionTraversalNodeOBB : public MeshShapeCollisionTraversalNode<OBB, S, NarrowPhaseSolver> { public: - MeshShapeCollisionTraversalNodeOBB(bool enable_distance_lower_bound = false) : + MeshShapeCollisionTraversalNodeOBB(const CollisionRequest& request) : MeshShapeCollisionTraversalNode<OBB, S, NarrowPhaseSolver> - (enable_distance_lower_bound) + (request) { } @@ -353,9 +354,9 @@ template<typename S, typename NarrowPhaseSolver> class MeshShapeCollisionTraversalNodeRSS : public MeshShapeCollisionTraversalNode<RSS, S, NarrowPhaseSolver> { public: - MeshShapeCollisionTraversalNodeRSS (bool enable_distance_lower_bound = false): + MeshShapeCollisionTraversalNodeRSS (const CollisionRequest& request): MeshShapeCollisionTraversalNode<RSS, S, NarrowPhaseSolver> - (enable_distance_lower_bound) + (request) { } @@ -380,9 +381,9 @@ template<typename S, typename NarrowPhaseSolver> class MeshShapeCollisionTraversalNodekIOS : public MeshShapeCollisionTraversalNode<kIOS, S, NarrowPhaseSolver> { public: - MeshShapeCollisionTraversalNodekIOS(bool enable_distance_lower_bound = false): + MeshShapeCollisionTraversalNodekIOS(const CollisionRequest& request): MeshShapeCollisionTraversalNode<kIOS, S, NarrowPhaseSolver> - (enable_distance_lower_bound) + (request) { } @@ -408,9 +409,9 @@ class MeshShapeCollisionTraversalNodeOBBRSS : public MeshShapeCollisionTraversal { public: MeshShapeCollisionTraversalNodeOBBRSS - (bool enable_distance_lower_bound = false) : + (const CollisionRequest& request) : MeshShapeCollisionTraversalNode - <OBBRSS, S, NarrowPhaseSolver>(enable_distance_lower_bound) + <OBBRSS, S, NarrowPhaseSolver>(request) { } diff --git a/include/hpp/fcl/traversal/traversal_node_bvhs.h b/include/hpp/fcl/traversal/traversal_node_bvhs.h index b401de4d..2aff7688 100644 --- a/include/hpp/fcl/traversal/traversal_node_bvhs.h +++ b/include/hpp/fcl/traversal/traversal_node_bvhs.h @@ -61,8 +61,8 @@ template<typename BV> class BVHCollisionTraversalNode : public CollisionTraversalNodeBase { public: - BVHCollisionTraversalNode(bool enable_distance_lower_bound) : - CollisionTraversalNodeBase (enable_distance_lower_bound) + BVHCollisionTraversalNode(const CollisionRequest& request) : + CollisionTraversalNodeBase (request) { model1 = NULL; model2 = NULL; @@ -157,8 +157,8 @@ template<typename BV> class MeshCollisionTraversalNode : public BVHCollisionTraversalNode<BV> { public: - MeshCollisionTraversalNode(bool enable_distance_lower_bound) : - BVHCollisionTraversalNode<BV> (enable_distance_lower_bound) + MeshCollisionTraversalNode(const CollisionRequest& request) : + BVHCollisionTraversalNode<BV> (request) { vertices1 = NULL; vertices2 = NULL; @@ -247,7 +247,7 @@ public: class MeshCollisionTraversalNodeOBB : public MeshCollisionTraversalNode<OBB> { public: - MeshCollisionTraversalNodeOBB (bool enable_distance_lower_bound); + MeshCollisionTraversalNodeOBB (const CollisionRequest& request); bool BVTesting(int b1, int b2) const; @@ -260,7 +260,7 @@ public: class MeshCollisionTraversalNodeRSS : public MeshCollisionTraversalNode<RSS> { public: - MeshCollisionTraversalNodeRSS (bool enable_distance_lower_bound); + MeshCollisionTraversalNodeRSS (const CollisionRequest& request); bool BVTesting(int b1, int b2) const; @@ -273,7 +273,7 @@ public: class MeshCollisionTraversalNodekIOS : public MeshCollisionTraversalNode<kIOS> { public: - MeshCollisionTraversalNodekIOS (bool enable_distance_lower_bound); + MeshCollisionTraversalNodekIOS (const CollisionRequest& request); bool BVTesting(int b1, int b2) const; @@ -286,7 +286,7 @@ public: class MeshCollisionTraversalNodeOBBRSS : public MeshCollisionTraversalNode<OBBRSS> { public: - MeshCollisionTraversalNodeOBBRSS (bool enable_distance_lower_bound); + MeshCollisionTraversalNodeOBBRSS (const CollisionRequest& request); bool BVTesting(int b1, int b2) const; diff --git a/include/hpp/fcl/traversal/traversal_node_octree.h b/include/hpp/fcl/traversal/traversal_node_octree.h index a378d682..d16d302a 100644 --- a/include/hpp/fcl/traversal/traversal_node_octree.h +++ b/include/hpp/fcl/traversal/traversal_node_octree.h @@ -882,7 +882,8 @@ template<typename NarrowPhaseSolver> class OcTreeCollisionTraversalNode : public CollisionTraversalNodeBase { public: - OcTreeCollisionTraversalNode() + OcTreeCollisionTraversalNode(const CollisionRequest& request) : + CollisionTraversalNodeBase (request) { model1 = NULL; model2 = NULL; @@ -953,7 +954,8 @@ template<typename S, typename NarrowPhaseSolver> class ShapeOcTreeCollisionTraversalNode : public CollisionTraversalNodeBase { public: - ShapeOcTreeCollisionTraversalNode() + ShapeOcTreeCollisionTraversalNode(const CollisionRequest& request) : + CollisionTraversalNodeBase (request) { model1 = NULL; model2 = NULL; @@ -989,7 +991,8 @@ template<typename S, typename NarrowPhaseSolver> class OcTreeShapeCollisionTraversalNode : public CollisionTraversalNodeBase { public: - OcTreeShapeCollisionTraversalNode() + OcTreeShapeCollisionTraversalNode(const CollisionRequest& request) : + CollisionTraversalNodeBase (request) { model1 = NULL; model2 = NULL; @@ -1083,7 +1086,8 @@ template<typename BV, typename NarrowPhaseSolver> class MeshOcTreeCollisionTraversalNode : public CollisionTraversalNodeBase { public: - MeshOcTreeCollisionTraversalNode() + MeshOcTreeCollisionTraversalNode(const CollisionRequest& request) : + CollisionTraversalNodeBase (request) { model1 = NULL; model2 = NULL; @@ -1119,7 +1123,8 @@ template<typename BV, typename NarrowPhaseSolver> class OcTreeMeshCollisionTraversalNode : public CollisionTraversalNodeBase { public: - OcTreeMeshCollisionTraversalNode() + OcTreeMeshCollisionTraversalNode(const CollisionRequest& request) : + CollisionTraversalNodeBase (request) { model1 = NULL; model2 = NULL; diff --git a/include/hpp/fcl/traversal/traversal_node_setup.h b/include/hpp/fcl/traversal/traversal_node_setup.h index 5b8a84e2..964782d6 100644 --- a/include/hpp/fcl/traversal/traversal_node_setup.h +++ b/include/hpp/fcl/traversal/traversal_node_setup.h @@ -59,10 +59,8 @@ bool initialize(OcTreeCollisionTraversalNode<NarrowPhaseSolver>& node, const OcTree& model1, const Transform3f& tf1, const OcTree& model2, const Transform3f& tf2, const OcTreeSolver<NarrowPhaseSolver>* otsolver, - const CollisionRequest& request, CollisionResult& result) { - node.request = request; node.result = &result; node.model1 = &model1; @@ -105,10 +103,8 @@ bool initialize(ShapeOcTreeCollisionTraversalNode<S, NarrowPhaseSolver>& node, const S& model1, const Transform3f& tf1, const OcTree& model2, const Transform3f& tf2, const OcTreeSolver<NarrowPhaseSolver>* otsolver, - const CollisionRequest& request, CollisionResult& result) { - node.request = request; node.result = &result; node.model1 = &model1; @@ -128,10 +124,8 @@ bool initialize(OcTreeShapeCollisionTraversalNode<S, NarrowPhaseSolver>& node, const OcTree& model1, const Transform3f& tf1, const S& model2, const Transform3f& tf2, const OcTreeSolver<NarrowPhaseSolver>* otsolver, - const CollisionRequest& request, CollisionResult& result) { - node.request = request; node.result = &result; node.model1 = &model1; @@ -197,10 +191,8 @@ bool initialize(MeshOcTreeCollisionTraversalNode<BV, NarrowPhaseSolver>& node, const BVHModel<BV>& model1, const Transform3f& tf1, const OcTree& model2, const Transform3f& tf2, const OcTreeSolver<NarrowPhaseSolver>* otsolver, - const CollisionRequest& request, CollisionResult& result) { - node.request = request; node.result = &result; node.model1 = &model1; @@ -220,10 +212,8 @@ bool initialize(OcTreeMeshCollisionTraversalNode<BV, NarrowPhaseSolver>& node, const OcTree& model1, const Transform3f& tf1, const BVHModel<BV>& model2, const Transform3f& tf2, const OcTreeSolver<NarrowPhaseSolver>* otsolver, - const CollisionRequest& request, CollisionResult& result) { - node.request = request; node.result = &result; node.model1 = &model1; @@ -292,16 +282,13 @@ bool initialize(ShapeCollisionTraversalNode<S1, S2, NarrowPhaseSolver>& node, const S1& shape1, const Transform3f& tf1, const S2& shape2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver, - const CollisionRequest& request, CollisionResult& result) { - node.model1 = &shape1; node.tf1 = tf1; node.model2 = &shape2; node.tf2 = tf2; node.nsolver = nsolver; - node.request = request; node.result = &result; node.cost_density = shape1.cost_density * shape2.cost_density; @@ -315,7 +302,6 @@ bool initialize(MeshShapeCollisionTraversalNode<BV, S, NarrowPhaseSolver>& node, BVHModel<BV>& model1, Transform3f& tf1, const S& model2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver, - const CollisionRequest& request, CollisionResult& result, bool use_refit = false, bool refit_bottomup = false) { @@ -350,7 +336,6 @@ bool initialize(MeshShapeCollisionTraversalNode<BV, S, NarrowPhaseSolver>& node, node.vertices = model1.vertices; node.tri_indices = model1.tri_indices; - node.request = request; node.result = &result; node.cost_density = model1.cost_density * model2.cost_density; @@ -365,7 +350,6 @@ bool initialize(ShapeMeshCollisionTraversalNode<S, BV, NarrowPhaseSolver>& node, const S& model1, const Transform3f& tf1, BVHModel<BV>& model2, Transform3f& tf2, const NarrowPhaseSolver* nsolver, - const CollisionRequest& request, CollisionResult& result, bool use_refit = false, bool refit_bottomup = false) { @@ -400,7 +384,6 @@ bool initialize(ShapeMeshCollisionTraversalNode<S, BV, NarrowPhaseSolver>& node, node.vertices = model2.vertices; node.tri_indices = model2.tri_indices; - node.request = request; node.result = &result; node.cost_density = model1.cost_density * model2.cost_density; @@ -417,7 +400,6 @@ static inline bool setupMeshShapeCollisionOrientedNode(OrientedNode<S, NarrowPha const BVHModel<BV>& model1, const Transform3f& tf1, const S& model2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver, - const CollisionRequest& request, CollisionResult& result) { if(model1.getModelType() != BVH_MODEL_TRIANGLES) @@ -434,7 +416,6 @@ static inline bool setupMeshShapeCollisionOrientedNode(OrientedNode<S, NarrowPha node.vertices = model1.vertices; node.tri_indices = model1.tri_indices; - node.request = request; node.result = &result; node.cost_density = model1.cost_density * model2.cost_density; @@ -453,10 +434,9 @@ bool initialize(MeshShapeCollisionTraversalNodeOBB<S, NarrowPhaseSolver>& node, const BVHModel<OBB>& model1, const Transform3f& tf1, const S& model2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver, - const CollisionRequest& request, CollisionResult& result) { - return details::setupMeshShapeCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, request, result); + return details::setupMeshShapeCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, result); } /// @brief Initialize the traversal node for collision between one mesh and one shape, specialized for RSS type @@ -465,10 +445,9 @@ bool initialize(MeshShapeCollisionTraversalNodeRSS<S, NarrowPhaseSolver>& node, const BVHModel<RSS>& model1, const Transform3f& tf1, const S& model2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver, - const CollisionRequest& request, CollisionResult& result) { - return details::setupMeshShapeCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, request, result); + return details::setupMeshShapeCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, result); } /// @brief Initialize the traversal node for collision between one mesh and one shape, specialized for kIOS type @@ -477,10 +456,9 @@ bool initialize(MeshShapeCollisionTraversalNodekIOS<S, NarrowPhaseSolver>& node, const BVHModel<kIOS>& model1, const Transform3f& tf1, const S& model2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver, - const CollisionRequest& request, CollisionResult& result) { - return details::setupMeshShapeCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, request, result); + return details::setupMeshShapeCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, result); } /// @brief Initialize the traversal node for collision between one mesh and one shape, specialized for OBBRSS type @@ -489,10 +467,9 @@ bool initialize(MeshShapeCollisionTraversalNodeOBBRSS<S, NarrowPhaseSolver>& nod const BVHModel<OBBRSS>& model1, const Transform3f& tf1, const S& model2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver, - const CollisionRequest& request, CollisionResult& result) { - return details::setupMeshShapeCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, request, result); + return details::setupMeshShapeCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, result); } @@ -504,7 +481,6 @@ static inline bool setupShapeMeshCollisionOrientedNode(OrientedNode<S, NarrowPha const S& model1, const Transform3f& tf1, const BVHModel<BV>& model2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver, - const CollisionRequest& request, CollisionResult& result) { if(model2.getModelType() != BVH_MODEL_TRIANGLES) @@ -521,7 +497,6 @@ static inline bool setupShapeMeshCollisionOrientedNode(OrientedNode<S, NarrowPha node.vertices = model2.vertices; node.tri_indices = model2.tri_indices; - node.request = request; node.result = &result; node.cost_density = model1.cost_density * model2.cost_density; @@ -537,10 +512,9 @@ bool initialize(ShapeMeshCollisionTraversalNodeOBB<S, NarrowPhaseSolver>& node, const S& model1, const Transform3f& tf1, const BVHModel<OBB>& model2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver, - const CollisionRequest& request, CollisionResult& result) { - return details::setupShapeMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, request, result); + return details::setupShapeMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, result); } /// @brief Initialize the traversal node for collision between one mesh and one shape, specialized for RSS type @@ -549,10 +523,9 @@ bool initialize(ShapeMeshCollisionTraversalNodeRSS<S, NarrowPhaseSolver>& node, const S& model1, const Transform3f& tf1, const BVHModel<RSS>& model2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver, - const CollisionRequest& request, CollisionResult& result) { - return details::setupShapeMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, request, result); + return details::setupShapeMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, result); } /// @brief Initialize the traversal node for collision between one mesh and one shape, specialized for kIOS type @@ -561,10 +534,9 @@ bool initialize(ShapeMeshCollisionTraversalNodekIOS<S, NarrowPhaseSolver>& node, const S& model1, const Transform3f& tf1, const BVHModel<kIOS>& model2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver, - const CollisionRequest& request, CollisionResult& result) { - return details::setupShapeMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, request, result); + return details::setupShapeMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, result); } /// @brief Initialize the traversal node for collision between one mesh and one shape, specialized for OBBRSS type @@ -573,10 +545,9 @@ bool initialize(ShapeMeshCollisionTraversalNodeOBBRSS<S, NarrowPhaseSolver>& nod const S& model1, const Transform3f& tf1, const BVHModel<OBBRSS>& model2, const Transform3f& tf2, const NarrowPhaseSolver* nsolver, - const CollisionRequest& request, CollisionResult& result) { - return details::setupShapeMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, request, result); + return details::setupShapeMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, result); } @@ -587,7 +558,6 @@ template<typename BV> bool initialize(MeshCollisionTraversalNode<BV>& node, BVHModel<BV>& model1, Transform3f& tf1, BVHModel<BV>& model2, Transform3f& tf2, - const CollisionRequest& request, CollisionResult& result, bool use_refit = false, bool refit_bottomup = false) { @@ -639,7 +609,6 @@ bool initialize(MeshCollisionTraversalNode<BV>& node, node.tri_indices1 = model1.tri_indices; node.tri_indices2 = model2.tri_indices; - node.request = request; node.result = &result; node.cost_density = model1.cost_density * model2.cost_density; @@ -652,25 +621,25 @@ bool initialize(MeshCollisionTraversalNode<BV>& node, bool initialize(MeshCollisionTraversalNodeOBB& node, const BVHModel<OBB>& model1, const Transform3f& tf1, const BVHModel<OBB>& model2, const Transform3f& tf2, - const CollisionRequest& request, CollisionResult& result); + CollisionResult& result); /// @brief Initialize traversal node for collision between two meshes, specialized for RSS type bool initialize(MeshCollisionTraversalNodeRSS& node, const BVHModel<RSS>& model1, const Transform3f& tf1, const BVHModel<RSS>& model2, const Transform3f& tf2, - const CollisionRequest& request, CollisionResult& result); + CollisionResult& result); /// @brief Initialize traversal node for collision between two meshes, specialized for OBBRSS type bool initialize(MeshCollisionTraversalNodeOBBRSS& node, const BVHModel<OBBRSS>& model1, const Transform3f& tf1, const BVHModel<OBBRSS>& model2, const Transform3f& tf2, - const CollisionRequest& request, CollisionResult& result); + CollisionResult& result); /// @brief Initialize traversal node for collision between two meshes, specialized for kIOS type bool initialize(MeshCollisionTraversalNodekIOS& node, const BVHModel<kIOS>& model1, const Transform3f& tf1, const BVHModel<kIOS>& model2, const Transform3f& tf2, - const CollisionRequest& request, CollisionResult& result); + CollisionResult& result); /// @brief Initialize traversal node for distance between two geometric shapes diff --git a/include/hpp/fcl/traversal/traversal_node_shapes.h b/include/hpp/fcl/traversal/traversal_node_shapes.h index 659dcc00..c684b556 100644 --- a/include/hpp/fcl/traversal/traversal_node_shapes.h +++ b/include/hpp/fcl/traversal/traversal_node_shapes.h @@ -55,7 +55,8 @@ template<typename S1, typename S2, typename NarrowPhaseSolver> class ShapeCollisionTraversalNode : public CollisionTraversalNodeBase { public: - ShapeCollisionTraversalNode() : CollisionTraversalNodeBase() + ShapeCollisionTraversalNode(const CollisionRequest& request) : + CollisionTraversalNodeBase(request) { model1 = NULL; model2 = NULL; diff --git a/src/collision_func_matrix.cpp b/src/collision_func_matrix.cpp index 93be5a92..bd7ee24e 100644 --- a/src/collision_func_matrix.cpp +++ b/src/collision_func_matrix.cpp @@ -54,12 +54,12 @@ std::size_t ShapeOcTreeCollide(const CollisionGeometry* o1, const Transform3f& t { if(request.isSatisfied(result)) return result.numContacts(); - ShapeOcTreeCollisionTraversalNode<T_SH, NarrowPhaseSolver> node; + ShapeOcTreeCollisionTraversalNode<T_SH, NarrowPhaseSolver> node (request); const T_SH* obj1 = static_cast<const T_SH*>(o1); const OcTree* obj2 = static_cast<const OcTree*>(o2); OcTreeSolver<NarrowPhaseSolver> otsolver(nsolver); - initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result); + initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, result); collide(&node, request, result); return result.numContacts(); @@ -72,12 +72,12 @@ std::size_t OcTreeShapeCollide(const CollisionGeometry* o1, const Transform3f& t { if(request.isSatisfied(result)) return result.numContacts(); - OcTreeShapeCollisionTraversalNode<T_SH, NarrowPhaseSolver> node; + OcTreeShapeCollisionTraversalNode<T_SH, NarrowPhaseSolver> node (request); const OcTree* obj1 = static_cast<const OcTree*>(o1); const T_SH* obj2 = static_cast<const T_SH*>(o2); OcTreeSolver<NarrowPhaseSolver> otsolver(nsolver); - initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result); + initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, result); collide(&node, request, result); return result.numContacts(); @@ -90,12 +90,12 @@ std::size_t OcTreeCollide(const CollisionGeometry* o1, const Transform3f& tf1, c { if(request.isSatisfied(result)) return result.numContacts(); - OcTreeCollisionTraversalNode<NarrowPhaseSolver> node; + OcTreeCollisionTraversalNode<NarrowPhaseSolver> node (request); const OcTree* obj1 = static_cast<const OcTree*>(o1); const OcTree* obj2 = static_cast<const OcTree*>(o2); OcTreeSolver<NarrowPhaseSolver> otsolver(nsolver); - initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result); + initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, result); collide(&node, request, result); return result.numContacts(); @@ -108,12 +108,12 @@ std::size_t OcTreeBVHCollide(const CollisionGeometry* o1, const Transform3f& tf1 { if(request.isSatisfied(result)) return result.numContacts(); - OcTreeMeshCollisionTraversalNode<T_BVH, NarrowPhaseSolver> node; + OcTreeMeshCollisionTraversalNode<T_BVH, NarrowPhaseSolver> node (request); const OcTree* obj1 = static_cast<const OcTree*>(o1); const BVHModel<T_BVH>* obj2 = static_cast<const BVHModel<T_BVH>*>(o2); OcTreeSolver<NarrowPhaseSolver> otsolver(nsolver); - initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result); + initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, result); collide(&node, request, result); return result.numContacts(); } @@ -125,12 +125,12 @@ std::size_t BVHOcTreeCollide(const CollisionGeometry* o1, const Transform3f& tf1 { if(request.isSatisfied(result)) return result.numContacts(); - MeshOcTreeCollisionTraversalNode<T_BVH, NarrowPhaseSolver> node; + MeshOcTreeCollisionTraversalNode<T_BVH, NarrowPhaseSolver> node (request); const BVHModel<T_BVH>* obj1 = static_cast<const BVHModel<T_BVH>*>(o1); const OcTree* obj2 = static_cast<const OcTree*>(o2); OcTreeSolver<NarrowPhaseSolver> otsolver(nsolver); - initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result); + initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, result); collide(&node, request, result); return result.numContacts(); } @@ -163,7 +163,7 @@ std::size_t ShapeShapeCollide(const CollisionGeometry* o1, const Transform3f& tf return 0; } - ShapeCollisionTraversalNode<T_SH1, T_SH2, NarrowPhaseSolver> node; + ShapeCollisionTraversalNode<T_SH1, T_SH2, NarrowPhaseSolver> node (request); const T_SH1* obj1 = static_cast<const T_SH1*>(o1); const T_SH2* obj2 = static_cast<const T_SH2*>(o2); @@ -177,7 +177,7 @@ std::size_t ShapeShapeCollide(const CollisionGeometry* o1, const Transform3f& tf nsolver->enableCachedGuess(true); } - initialize(node, *obj1, tf1, *obj2, tf2, nsolver, request, result); + initialize(node, *obj1, tf1, *obj2, tf2, nsolver, result); collide(&node, request, result); if(request.enable_cached_gjk_guess) @@ -195,13 +195,13 @@ struct BVHShapeCollider { if(request.isSatisfied(result)) return result.numContacts(); - MeshShapeCollisionTraversalNode<T_BVH, T_SH, NarrowPhaseSolver> node; + MeshShapeCollisionTraversalNode<T_BVH, T_SH, NarrowPhaseSolver> node (request); const BVHModel<T_BVH>* obj1 = static_cast<const BVHModel<T_BVH>* >(o1); BVHModel<T_BVH>* obj1_tmp = new BVHModel<T_BVH>(*obj1); Transform3f tf1_tmp = tf1; const T_SH* obj2 = static_cast<const T_SH*>(o2); - initialize(node, *obj1_tmp, tf1_tmp, *obj2, tf2, nsolver, request, result); + initialize(node, *obj1_tmp, tf1_tmp, *obj2, tf2, nsolver, result); fcl::collide(&node, request, result); delete obj1_tmp; @@ -219,11 +219,11 @@ std::size_t orientedBVHShapeCollide(const CollisionGeometry* o1, const Transform { if(request.isSatisfied(result)) return result.numContacts(); - OrientMeshShapeCollisionTraveralNode node; + 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, request, result); + initialize(node, *obj1, tf1, *obj2, tf2, nsolver, result); fcl::collide(&node, request, result); return result.numContacts(); } @@ -284,7 +284,7 @@ std::size_t BVHCollide(const CollisionGeometry* o1, const Transform3f& tf1, cons { if(request.isSatisfied(result)) return result.numContacts(); - MeshCollisionTraversalNode<T_BVH> node (request.enable_distance_lower_bound); + MeshCollisionTraversalNode<T_BVH> 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); BVHModel<T_BVH>* obj1_tmp = new BVHModel<T_BVH>(*obj1); @@ -292,7 +292,7 @@ std::size_t BVHCollide(const CollisionGeometry* o1, const Transform3f& tf1, cons BVHModel<T_BVH>* obj2_tmp = new BVHModel<T_BVH>(*obj2); Transform3f tf2_tmp = tf2; - initialize(node, *obj1_tmp, tf1_tmp, *obj2_tmp, tf2_tmp, request, result); + initialize(node, *obj1_tmp, tf1_tmp, *obj2_tmp, tf2_tmp, result); FCL_REAL sqrDistance; fcl::collide(&node, request, result); @@ -309,11 +309,11 @@ std::size_t orientedMeshCollide(const CollisionGeometry* o1, const Transform3f& { if(request.isSatisfied(result)) return result.numContacts(); - OrientedMeshCollisionTraversalNode node (request.enable_distance_lower_bound); + 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, request, result); + initialize(node, *obj1, tf1, *obj2, tf2, result); collide(&node, request, result); return result.numContacts(); diff --git a/src/traversal/traversal_node_bvhs.cpp b/src/traversal/traversal_node_bvhs.cpp index 05a09240..e17f5392 100644 --- a/src/traversal/traversal_node_bvhs.cpp +++ b/src/traversal/traversal_node_bvhs.cpp @@ -171,8 +171,8 @@ static inline void meshDistanceOrientedNodeLeafTesting(int b1, int b2, } MeshCollisionTraversalNodeOBB::MeshCollisionTraversalNodeOBB -(bool enable_distance_lower_bound) : - MeshCollisionTraversalNode<OBB> (enable_distance_lower_bound) +(const CollisionRequest& request) : + MeshCollisionTraversalNode<OBB> (request) { R.setIdentity(); } @@ -195,8 +195,8 @@ void MeshCollisionTraversalNodeOBB::leafTesting MeshCollisionTraversalNodeRSS::MeshCollisionTraversalNodeRSS -(bool enable_distance_lower_bound) : - MeshCollisionTraversalNode<RSS> (enable_distance_lower_bound) +(const CollisionRequest& request) : + MeshCollisionTraversalNode<RSS> (request) { R.setIdentity(); } @@ -220,8 +220,8 @@ void MeshCollisionTraversalNodeRSS::leafTesting MeshCollisionTraversalNodekIOS::MeshCollisionTraversalNodekIOS -(bool enable_distance_lower_bound) : - MeshCollisionTraversalNode<kIOS>(enable_distance_lower_bound) +(const CollisionRequest& request) : + MeshCollisionTraversalNode<kIOS>(request) { R.setIdentity(); } @@ -244,8 +244,8 @@ void MeshCollisionTraversalNodekIOS::leafTesting MeshCollisionTraversalNodeOBBRSS::MeshCollisionTraversalNodeOBBRSS -(bool enable_distance_lower_bound) : - MeshCollisionTraversalNode<OBBRSS> (enable_distance_lower_bound) +(const CollisionRequest& request) : + MeshCollisionTraversalNode<OBBRSS> (request) { R.setIdentity(); } diff --git a/src/traversal/traversal_node_setup.cpp b/src/traversal/traversal_node_setup.cpp index 0525d5d6..8e417309 100644 --- a/src/traversal/traversal_node_setup.cpp +++ b/src/traversal/traversal_node_setup.cpp @@ -48,7 +48,6 @@ template<typename BV, typename OrientedNode> static inline bool setupMeshCollisionOrientedNode(OrientedNode& node, const BVHModel<BV>& model1, const Transform3f& tf1, const BVHModel<BV>& model2, const Transform3f& tf2, - const CollisionRequest& request, CollisionResult& result) { if(model1.getModelType() != BVH_MODEL_TRIANGLES || model2.getModelType() != BVH_MODEL_TRIANGLES) @@ -65,7 +64,6 @@ static inline bool setupMeshCollisionOrientedNode(OrientedNode& node, node.model2 = &model2; node.tf2 = tf2; - node.request = request; node.result = &result; node.cost_density = model1.cost_density * model2.cost_density; @@ -81,39 +79,35 @@ static inline bool setupMeshCollisionOrientedNode(OrientedNode& node, bool initialize(MeshCollisionTraversalNodeOBB& node, const BVHModel<OBB>& model1, const Transform3f& tf1, const BVHModel<OBB>& model2, const Transform3f& tf2, - const CollisionRequest& request, CollisionResult& result) { - return details::setupMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, request, result); + return details::setupMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, result); } bool initialize(MeshCollisionTraversalNodeRSS& node, const BVHModel<RSS>& model1, const Transform3f& tf1, const BVHModel<RSS>& model2, const Transform3f& tf2, - const CollisionRequest& request, CollisionResult& result) { - return details::setupMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, request, result); + return details::setupMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, result); } bool initialize(MeshCollisionTraversalNodekIOS& node, const BVHModel<kIOS>& model1, const Transform3f& tf1, const BVHModel<kIOS>& model2, const Transform3f& tf2, - const CollisionRequest& request, CollisionResult& result) { - return details::setupMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, request, result); + return details::setupMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, result); } bool initialize(MeshCollisionTraversalNodeOBBRSS& node, const BVHModel<OBBRSS>& model1, const Transform3f& tf1, const BVHModel<OBBRSS>& model2, const Transform3f& tf2, - const CollisionRequest& request, CollisionResult& result) { - return details::setupMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, request, result); + return details::setupMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, result); } diff --git a/src/traversal/traversal_recurse.cpp b/src/traversal/traversal_recurse.cpp index eb847321..6a39f010 100644 --- a/src/traversal/traversal_recurse.cpp +++ b/src/traversal/traversal_recurse.cpp @@ -50,7 +50,7 @@ void collisionRecurse(CollisionTraversalNodeBase* node, int b1, int b2, { updateFrontList(front_list, b1, b2); - if (node->enable_distance_lower_bound) { + if (node->request.enable_distance_lower_bound) { if(node->BVTesting(b1, b2, sqrDistLowerBound)) return; } else { if(node->BVTesting(b1, b2)) return; @@ -60,7 +60,7 @@ void collisionRecurse(CollisionTraversalNodeBase* node, int b1, int b2, return; } - if (node->enable_distance_lower_bound) { + if (node->request.enable_distance_lower_bound) { if(node->BVTesting(b1, b2, sqrDistLowerBound)) { updateFrontList(front_list, b1, b2); return; @@ -332,7 +332,7 @@ void propagateBVHFrontListCollisionRecurse } else { - if (node->enable_distance_lower_bound) { + if (node->request.enable_distance_lower_bound) { if(!node->BVTesting(b1, b2, sqrDistLowerBound)) { front_iter->valid = false; if(node->firstOverSecond(b1, b2)) { diff --git a/test/benchmark.cpp b/test/benchmark.cpp index 49e68310..28571253 100644 --- a/test/benchmark.cpp +++ b/test/benchmark.cpp @@ -126,8 +126,8 @@ double collide (const std::vector<Transform3f>& tf, timer.start(); for (std::size_t i = 0; i < tf.size(); ++i) { - if(!initialize(node, m1, tf[i], m2, pose2, request, local_result)) - std::cout << "initialize error" << std::endl; + bool success (initialize(node, m1, tf[i], m2, pose2, local_result)); + assert (success); CollisionRequest request (1, true, true); CollisionResult result; diff --git a/test/test_fcl_collision.cpp b/test/test_fcl_collision.cpp index d875137e..18328ea8 100644 --- a/test/test_fcl_collision.cpp +++ b/test/test_fcl_collision.cpp @@ -833,17 +833,15 @@ bool collide_Test2(const Transform3f& tf, Transform3f pose1, pose2; CollisionResult local_result; - MeshCollisionTraversalNode<BV> node (false); + CollisionRequest request (num_max_contacts, enable_contact); + MeshCollisionTraversalNode<BV> node (request); - if(!initialize<BV>(node, m1, pose1, m2, pose2, - CollisionRequest(num_max_contacts, enable_contact), local_result)) - std::cout << "initialize error" << std::endl; + bool success = initialize <BV> (node, m1, pose1, m2, pose2, local_result); + assert (success); node.enable_statistics = verbose; - CollisionRequest request (1, true, true); - CollisionResult result; - collide(&node, request, result); + collide(&node, request, local_result); if(local_result.numContacts() > 0) { @@ -893,17 +891,15 @@ bool collide_Test(const Transform3f& tf, Transform3f pose1(tf), pose2; CollisionResult local_result; - MeshCollisionTraversalNode<BV> node (false); + CollisionRequest request (num_max_contacts, enable_contact); + MeshCollisionTraversalNode<BV> node (request); - if(!initialize<BV>(node, m1, pose1, m2, pose2, - CollisionRequest(num_max_contacts, enable_contact), local_result)) - std::cout << "initialize error" << std::endl; + bool success = initialize <BV> (node, m1, pose1, m2, pose2, local_result); + assert (success); node.enable_statistics = verbose; - CollisionRequest request (1, true, true); - CollisionResult result; - collide(&node, request, result); + collide(&node, request, local_result); if(local_result.numContacts() > 0) { @@ -952,16 +948,15 @@ bool collide_Test_Oriented(const Transform3f& tf, Transform3f pose1(tf), pose2; CollisionResult local_result; - TraversalNode node (false); - if(!initialize(node, (const BVHModel<BV>&)m1, pose1, (const BVHModel<BV>&)m2, pose2, - CollisionRequest(num_max_contacts, enable_contact), local_result)) - std::cout << "initialize error" << std::endl; + CollisionRequest request (num_max_contacts, enable_contact); + TraversalNode node (request); + bool success = initialize (node, (const BVHModel<BV>&)m1, pose1, + (const BVHModel<BV>&)m2, pose2, local_result); + assert (success); node.enable_statistics = verbose; - CollisionRequest request (1, true, true); - CollisionResult result; - collide(&node, request, result); + collide(&node, request, local_result); if(local_result.numContacts() > 0) { diff --git a/test/test_fcl_distance.cpp b/test/test_fcl_distance.cpp index 5dee1fbd..ea98c723 100644 --- a/test/test_fcl_distance.cpp +++ b/test/test_fcl_distance.cpp @@ -412,17 +412,17 @@ bool collide_Test_OBB(const Transform3f& tf, m2.addSubModel(vertices2, triangles2); m2.endModel(); - CollisionResult local_result; - MeshCollisionTraversalNodeOBB node (false); - if(!initialize(node, (const BVHModel<OBB>&)m1, tf, (const BVHModel<OBB>&)m2, Transform3f(), - CollisionRequest(), local_result)) - std::cout << "initialize error" << std::endl; + CollisionResult local_result; + CollisionRequest request (1, true, true); + MeshCollisionTraversalNodeOBB node (request); + bool success (initialize(node, (const BVHModel<OBB>&)m1, tf, + (const BVHModel<OBB>&)m2, Transform3f(), + local_result)); + assert (success); node.enable_statistics = verbose; - CollisionRequest request (1, true, true); - CollisionResult result; - collide(&node, request, result); + collide(&node, request, local_result); if(local_result.numContacts() > 0) return true; diff --git a/test/test_fcl_frontlist.cpp b/test/test_fcl_frontlist.cpp index b2ce1e6b..831c26a9 100644 --- a/test/test_fcl_frontlist.cpp +++ b/test/test_fcl_frontlist.cpp @@ -228,18 +228,16 @@ bool collide_front_list_Test(const Transform3f& tf1, const Transform3f& tf2, Transform3f pose1, pose2; - CollisionResult local_result; - MeshCollisionTraversalNode<BV> node (false); + CollisionResult local_result; + CollisionRequest request (std::numeric_limits<int>::max(), false); + MeshCollisionTraversalNode<BV> node (request); - if(!initialize<BV>(node, m1, pose1, m2, pose2, - CollisionRequest(std::numeric_limits<int>::max(), false), local_result)) - std::cout << "initialize error" << std::endl; + bool success = initialize <BV>(node, m1, pose1, m2, pose2, local_result); + assert (success); node.enable_statistics = verbose; - CollisionRequest request (1, true, true); - CollisionResult result; - collide(&node, request, result, &front_list); + collide(&node, request, local_result, &front_list); if(verbose) std::cout << "front list size " << front_list.size() << std::endl; @@ -294,25 +292,25 @@ bool collide_front_list_Test_Oriented(const Transform3f& tf1, const Transform3f& Transform3f pose1(tf1), pose2; CollisionResult local_result; - TraversalNode node (false); + CollisionRequest request (std::numeric_limits<int>::max(), false); + TraversalNode node (request); - if(!initialize(node, (const BVHModel<BV>&)m1, pose1, (const BVHModel<BV>&)m2, pose2, - CollisionRequest(std::numeric_limits<int>::max(), false), local_result)) - std::cout << "initialize error" << std::endl; + bool success = initialize (node, (const BVHModel<BV>&)m1, pose1, + (const BVHModel<BV>&)m2, pose2, local_result); + assert (success); node.enable_statistics = verbose; - CollisionRequest request (1, true, true); - CollisionResult result; - collide(&node, request, result, &front_list); + collide(&node, request, local_result, &front_list); if(verbose) std::cout << "front list size " << front_list.size() << std::endl; // update the mesh pose1 = tf2; - if(!initialize(node, (const BVHModel<BV>&)m1, pose1, (const BVHModel<BV>&)m2, pose2, CollisionRequest(), local_result)) - std::cout << "initialize error" << std::endl; + success = initialize (node, (const BVHModel<BV>&)m1, pose1, + (const BVHModel<BV>&)m2, pose2, local_result); + assert (success); local_result.clear(); collide(&node, request, local_result, &front_list); @@ -344,18 +342,16 @@ bool collide_Test(const Transform3f& tf, Transform3f pose1(tf), pose2; - CollisionResult local_result; - MeshCollisionTraversalNode<BV> node (false); + CollisionResult local_result; + CollisionRequest request (std::numeric_limits<int>::max(), false); + MeshCollisionTraversalNode<BV> node (request); - if(!initialize<BV>(node, m1, pose1, m2, pose2, - CollisionRequest(std::numeric_limits<int>::max(), false), local_result)) - std::cout << "initialize error" << std::endl; + bool success = initialize <BV>(node, m1, pose1, m2, pose2, local_result); + assert (success); node.enable_statistics = verbose; - CollisionRequest request (1, true, true); - CollisionResult result; - collide(&node, request, result); + collide(&node, request, local_result); if(local_result.numContacts() > 0) return true; -- GitLab