Commit bf945404 authored by jpan's avatar jpan
Browse files

change the interface of collide: the collision settings are now in a...

change the interface of collide: the collision settings are now in a CollisionRequest structure, and collision results are now in a CollisionResult structure. Distance has similar extension. This is for the convenience of adding cost and potential future extension.


git-svn-id: https://kforge.ros.org/fcl/fcl_ros@137 253336fb-580f-4252-a368-f3cef5a2a82b
parent d77c399b
......@@ -55,25 +55,24 @@ namespace fcl
template<typename NarrowPhaseSolver>
int collide(const CollisionObject* o1, const CollisionObject* o2,
const NarrowPhaseSolver* nsolver,
int num_max_contacts, bool exhaustive, bool enable_contact,
std::vector<Contact>& contacts);
const CollisionRequest& request,
CollisionResult& result);
template<typename NarrowPhaseSolver>
int collide(const CollisionGeometry* o1, const SimpleTransform& tf1,
const CollisionGeometry* o2, const SimpleTransform& tf2,
const NarrowPhaseSolver* nsolver,
int num_max_contacts, bool exhaustive, bool enable_contact,
std::vector<Contact>& contacts);
const CollisionRequest& request,
CollisionResult& result);
int collide(const CollisionObject* o1, const CollisionObject* o2,
int num_max_contacts, bool exhaustive, bool enable_contact,
std::vector<Contact>& contacts);
const CollisionRequest& request,
CollisionResult& result);
int collide(const CollisionGeometry* o1, const SimpleTransform& tf1,
const CollisionGeometry* o2, const SimpleTransform& tf2,
int num_max_contacts, bool exhaustive, bool enable_contact,
std::vector<Contact>& contacts);
const CollisionRequest& request,
CollisionResult& result);
}
#endif
......@@ -49,36 +49,104 @@ struct Contact
}
};
struct CostSource
{
Vec3f aabb_min;
Vec3f aabb_max;
FCL_REAL cost; // density
};
struct CollisionRequest
{
bool exhaustive;
int num_max_contacts;
bool enable_contact;
int num_max_cost_sources;
bool enable_cost;
CollisionRequest(bool exhaustive_ = false,
unsigned int num_max_contacts_ = 1,
bool enable_contact_ = false,
unsigned int num_max_cost_sources_ = 1,
bool enable_cost_ = false) : exhaustive(exhaustive_),
num_max_contacts(num_max_contacts_),
enable_contact(enable_contact_),
num_max_cost_sources(num_max_cost_sources_),
enable_cost(enable_cost_)
{
}
};
struct CollisionResult
{
std::vector<Contact> contacts;
std::vector<CostSource> cost_sources;
bool is_collision;
CollisionResult() : is_collision(false)
{
}
void clear()
{
contacts.clear();
cost_sources.clear();
is_collision = false;
}
};
struct CollisionData
{
CollisionData()
{
done = false;
is_collision = false;
num_max_contacts = 1;
enable_contact = false;
exhaustive = false;
}
CollisionRequest request;
CollisionResult result;
bool done;
bool is_collision;
bool exhaustive;
unsigned int num_max_contacts;
bool enable_contact;
};
std::vector<Contact> contacts;
struct DistanceRequest
{
bool enable_nearest_points;
DistanceRequest() : enable_nearest_points(false)
{
}
};
struct DistanceResult
{
FCL_REAL min_distance;
Vec3f nearest_points[2];
DistanceResult() : min_distance(std::numeric_limits<FCL_REAL>::max())
{
}
void clear()
{
min_distance = std::numeric_limits<FCL_REAL>::max();
}
};
struct DistanceData
{
DistanceData()
{
min_distance = std::numeric_limits<FCL_REAL>::max();
done = false;
}
FCL_REAL min_distance;
bool done;
DistanceRequest request;
DistanceResult result;
};
......
......@@ -48,7 +48,7 @@ namespace fcl
template<typename NarrowPhaseSolver>
struct CollisionFunctionMatrix
{
typedef int (*CollisionFunc)(const CollisionGeometry* o1, const SimpleTransform& tf1, const CollisionGeometry* o2, const SimpleTransform& tf2, const NarrowPhaseSolver* nsolver, int num_max_contacts, bool exhaustive, bool enable_contact, std::vector<Contact>& contacts);
typedef int (*CollisionFunc)(const CollisionGeometry* o1, const SimpleTransform& tf1, const CollisionGeometry* o2, const SimpleTransform& tf2, const NarrowPhaseSolver* nsolver, const CollisionRequest& request, CollisionResult& result);
CollisionFunc collision_matrix[NODE_COUNT][NODE_COUNT];
......
......@@ -52,8 +52,8 @@ int conservativeAdvancement(const CollisionGeometry* o1,
MotionBase<BV>* motion1,
const CollisionGeometry* o2,
MotionBase<BV>* motion2,
int num_max_contacts, bool exhaustive, bool enable_contact,
std::vector<Contact>& contacts,
const CollisionRequest& request,
CollisionResult& result,
FCL_REAL& toc);
}
......
......@@ -38,24 +38,29 @@
#define FCL_DISTANCE_H
#include "fcl/collision_object.h"
#include "fcl/collision_data.h"
namespace fcl
{
template<typename NarrowPhaseSolver>
FCL_REAL distance(const CollisionObject* o1, const CollisionObject* o2, const NarrowPhaseSolver* nsolver);
FCL_REAL distance(const CollisionObject* o1, const CollisionObject* o2, const NarrowPhaseSolver* nsolver,
const DistanceRequest& request, DistanceResult& result);
template<typename NarrowPhaseSolver>
FCL_REAL distance(const CollisionGeometry* o1, const SimpleTransform& tf1,
const CollisionGeometry* o2, const SimpleTransform& tf2,
const NarrowPhaseSolver* nsolver);
const NarrowPhaseSolver* nsolver,
const DistanceRequest& request, DistanceResult& result);
FCL_REAL distance(const CollisionObject* o1, const CollisionObject* o2);
FCL_REAL distance(const CollisionObject* o1, const CollisionObject* o2,
const DistanceRequest& request, DistanceResult& result);
FCL_REAL distance(const CollisionGeometry* o1, const SimpleTransform& tf1,
const CollisionGeometry* o2, const SimpleTransform& tf2);
const CollisionGeometry* o2, const SimpleTransform& tf2,
const DistanceRequest& request, DistanceResult& result);
}
#endif
......@@ -46,7 +46,8 @@ namespace fcl
template<typename NarrowPhaseSolver>
struct DistanceFunctionMatrix
{
typedef FCL_REAL (*DistanceFunc)(const CollisionGeometry* o1, const SimpleTransform& tf1, const CollisionGeometry* o2, const SimpleTransform& tf2, const NarrowPhaseSolver* nsolver);
typedef FCL_REAL (*DistanceFunc)(const CollisionGeometry* o1, const SimpleTransform& tf1, const CollisionGeometry* o2, const SimpleTransform& tf2, const NarrowPhaseSolver* nsolver,
const DistanceRequest& request, DistanceResult& result);
DistanceFunc distance_matrix[NODE_COUNT][NODE_COUNT];
......
......@@ -53,11 +53,9 @@ bool initialize(OcTreeCollisionTraversalNode<NarrowPhaseSolver>& node,
const OcTree& model1, const SimpleTransform& tf1,
const OcTree& model2, const SimpleTransform& tf2,
const OcTreeSolver<NarrowPhaseSolver>* otsolver,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false)
const CollisionRequest& request)
{
node.enable_contact = enable_contact;
node.num_max_contacts = num_max_contacts;
node.exhaustive = exhaustive;
node.request = request;
node.model1 = &model1;
node.model2 = &model2;
......@@ -74,8 +72,11 @@ template<typename NarrowPhaseSolver>
bool initialize(OcTreeDistanceTraversalNode<NarrowPhaseSolver>& node,
const OcTree& model1, const SimpleTransform& tf1,
const OcTree& model2, const SimpleTransform& tf2,
const OcTreeSolver<NarrowPhaseSolver>* otsolver)
const OcTreeSolver<NarrowPhaseSolver>* otsolver,
const DistanceRequest& request)
{
node.request = request;
node.model1 = &model1;
node.model2 = &model2;
......@@ -92,11 +93,9 @@ bool initialize(ShapeOcTreeCollisionTraversalNode<S, NarrowPhaseSolver>& node,
const S& model1, const SimpleTransform& tf1,
const OcTree& model2, const SimpleTransform& tf2,
const OcTreeSolver<NarrowPhaseSolver>* otsolver,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false)
const CollisionRequest& request)
{
node.enable_contact = enable_contact;
node.num_max_contacts = num_max_contacts;
node.exhaustive = exhaustive;
node.request = request;
node.model1 = &model1;
node.model2 = &model2;
......@@ -114,11 +113,9 @@ bool initialize(OcTreeShapeCollisionTraversalNode<S, NarrowPhaseSolver>& node,
const OcTree& model1, const SimpleTransform& tf1,
const S& model2, const SimpleTransform& tf2,
const OcTreeSolver<NarrowPhaseSolver>* otsolver,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false)
const CollisionRequest& request)
{
node.enable_contact = enable_contact;
node.num_max_contacts = num_max_contacts;
node.exhaustive = exhaustive;
node.request = request;
node.model1 = &model1;
node.model2 = &model2;
......@@ -135,8 +132,11 @@ template<typename S, typename NarrowPhaseSolver>
bool initialize(ShapeOcTreeDistanceTraversalNode<S, NarrowPhaseSolver>& node,
const S& model1, const SimpleTransform& tf1,
const OcTree& model2, const SimpleTransform& tf2,
const OcTreeSolver<NarrowPhaseSolver>* otsolver)
const OcTreeSolver<NarrowPhaseSolver>* otsolver,
const DistanceRequest& request)
{
node.request = request;
node.model1 = &model1;
node.model2 = &model2;
......@@ -153,8 +153,11 @@ template<typename S, typename NarrowPhaseSolver>
bool initialize(OcTreeShapeDistanceTraversalNode<S, NarrowPhaseSolver>& node,
const OcTree& model1, const SimpleTransform& tf1,
const S& model2, const SimpleTransform& tf2,
const OcTreeSolver<NarrowPhaseSolver>* otsolver)
const OcTreeSolver<NarrowPhaseSolver>* otsolver,
const DistanceRequest& request)
{
node.request = request;
node.model1 = &model1;
node.model2 = &model2;
......@@ -171,11 +174,9 @@ bool initialize(MeshOcTreeCollisionTraversalNode<BV, NarrowPhaseSolver>& node,
const BVHModel<BV>& model1, const SimpleTransform& tf1,
const OcTree& model2, const SimpleTransform& tf2,
const OcTreeSolver<NarrowPhaseSolver>* otsolver,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false)
const CollisionRequest& request)
{
node.enable_contact = enable_contact;
node.num_max_contacts = num_max_contacts;
node.exhaustive = exhaustive;
node.request = request;
node.model1 = &model1;
node.model2 = &model2;
......@@ -193,11 +194,9 @@ bool initialize(OcTreeMeshCollisionTraversalNode<BV, NarrowPhaseSolver>& node,
const OcTree& model1, const SimpleTransform& tf1,
const BVHModel<BV>& model2, const SimpleTransform& tf2,
const OcTreeSolver<NarrowPhaseSolver>* otsolver,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false)
const CollisionRequest& request)
{
node.enable_contact = enable_contact;
node.num_max_contacts = num_max_contacts;
node.exhaustive = exhaustive;
node.request = request;
node.model1 = &model1;
node.model2 = &model2;
......@@ -214,8 +213,11 @@ template<typename BV, typename NarrowPhaseSolver>
bool initialize(MeshOcTreeDistanceTraversalNode<BV, NarrowPhaseSolver>& node,
const BVHModel<BV>& model1, const SimpleTransform& tf1,
const OcTree& model2, const SimpleTransform& tf2,
const OcTreeSolver<NarrowPhaseSolver>* otsolver)
const OcTreeSolver<NarrowPhaseSolver>* otsolver,
const DistanceRequest& request)
{
node.request = request;
node.model1 = &model1;
node.model2 = &model2;
......@@ -232,8 +234,11 @@ template<typename BV, typename NarrowPhaseSolver>
bool initialize(OcTreeMeshDistanceTraversalNode<BV, NarrowPhaseSolver>& node,
const OcTree& model1, const SimpleTransform& tf1,
const BVHModel<BV>& model2, const SimpleTransform& tf2,
const OcTreeSolver<NarrowPhaseSolver>* otsolver)
const OcTreeSolver<NarrowPhaseSolver>* otsolver,
const DistanceRequest& request)
{
node.request = request;
node.model1 = &model1;
node.model2 = &model2;
......@@ -253,14 +258,14 @@ bool initialize(ShapeCollisionTraversalNode<S1, S2, NarrowPhaseSolver>& node,
const S1& shape1, const SimpleTransform& tf1,
const S2& shape2, const SimpleTransform& tf2,
const NarrowPhaseSolver* nsolver,
bool enable_contact = false)
const CollisionRequest& request)
{
node.enable_contact = enable_contact;
node.model1 = &shape1;
node.tf1 = tf1;
node.model2 = &shape2;
node.tf2 = tf2;
node.nsolver = nsolver;
node.request = request;
return true;
}
......@@ -270,7 +275,7 @@ bool initialize(MeshShapeCollisionTraversalNode<BV, S, NarrowPhaseSolver>& node,
BVHModel<BV>& model1, SimpleTransform& tf1,
const S& model2, const SimpleTransform& tf2,
const NarrowPhaseSolver* nsolver,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false,
const CollisionRequest& request,
bool use_refit = false, bool refit_bottomup = false)
{
if(model1.getModelType() != BVH_MODEL_TRIANGLES)
......@@ -303,9 +308,7 @@ bool initialize(MeshShapeCollisionTraversalNode<BV, S, NarrowPhaseSolver>& node,
node.vertices = model1.vertices;
node.tri_indices = model1.tri_indices;
node.num_max_contacts = num_max_contacts;
node.exhaustive = exhaustive;
node.enable_contact = enable_contact;
node.request = request;
return true;
}
......@@ -317,7 +320,7 @@ bool initialize(ShapeMeshCollisionTraversalNode<S, BV, NarrowPhaseSolver>& node,
const S& model1, const SimpleTransform& tf1,
BVHModel<BV>& model2, SimpleTransform& tf2,
const NarrowPhaseSolver* nsolver,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false,
const CollisionRequest& request,
bool use_refit = false, bool refit_bottomup = false)
{
if(model2.getModelType() != BVH_MODEL_TRIANGLES)
......@@ -350,9 +353,7 @@ bool initialize(ShapeMeshCollisionTraversalNode<S, BV, NarrowPhaseSolver>& node,
node.vertices = model2.vertices;
node.tri_indices = model2.tri_indices;
node.num_max_contacts = num_max_contacts;
node.exhaustive = exhaustive;
node.enable_contact = enable_contact;
node.request = request;
return true;
}
......@@ -366,7 +367,7 @@ static inline bool setupMeshShapeCollisionOrientedNode(OrientedNode<S, NarrowPha
const BVHModel<BV>& model1, const SimpleTransform& tf1,
const S& model2, const SimpleTransform& tf2,
const NarrowPhaseSolver* nsolver,
int num_max_contacts, bool exhaustive, bool enable_contact)
const CollisionRequest& request)
{
if(model1.getModelType() != BVH_MODEL_TRIANGLES)
return false;
......@@ -381,9 +382,7 @@ static inline bool setupMeshShapeCollisionOrientedNode(OrientedNode<S, NarrowPha
node.vertices = model1.vertices;
node.tri_indices = model1.tri_indices;
node.num_max_contacts = num_max_contacts;
node.exhaustive = exhaustive;
node.enable_contact = enable_contact;
node.request = request;
node.R = tf1.getRotation();
node.T = tf1.getTranslation();
......@@ -401,9 +400,9 @@ bool initialize(MeshShapeCollisionTraversalNodeOBB<S, NarrowPhaseSolver>& node,
const BVHModel<OBB>& model1, const SimpleTransform& tf1,
const S& model2, const SimpleTransform& tf2,
const NarrowPhaseSolver* nsolver,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false)
const CollisionRequest& request)
{
return details::setupMeshShapeCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, num_max_contacts, exhaustive, enable_contact);
return details::setupMeshShapeCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, request);
}
/** \brief Initialize the traversal node for collision between one mesh and one shape, specialized for RSS type */
......@@ -412,9 +411,9 @@ bool initialize(MeshShapeCollisionTraversalNodeRSS<S, NarrowPhaseSolver>& node,
const BVHModel<RSS>& model1, const SimpleTransform& tf1,
const S& model2, const SimpleTransform& tf2,
const NarrowPhaseSolver* nsolver,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false)
const CollisionRequest& request)
{
return details::setupMeshShapeCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, num_max_contacts, exhaustive, enable_contact);
return details::setupMeshShapeCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, request);
}
/** \brief Initialize the traversal node for collision between one mesh and one shape, specialized for kIOS type */
......@@ -423,9 +422,9 @@ bool initialize(MeshShapeCollisionTraversalNodekIOS<S, NarrowPhaseSolver>& node,
const BVHModel<kIOS>& model1, const SimpleTransform& tf1,
const S& model2, const SimpleTransform& tf2,
const NarrowPhaseSolver* nsolver,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false)
const CollisionRequest& request)
{
return details::setupMeshShapeCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, num_max_contacts, exhaustive, enable_contact);
return details::setupMeshShapeCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, request);
}
/** \brief Initialize the traversal node for collision between one mesh and one shape, specialized for OBBRSS type */
......@@ -434,9 +433,9 @@ bool initialize(MeshShapeCollisionTraversalNodeOBBRSS<S, NarrowPhaseSolver>& nod
const BVHModel<OBBRSS>& model1, const SimpleTransform& tf1,
const S& model2, const SimpleTransform& tf2,
const NarrowPhaseSolver* nsolver,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false)
const CollisionRequest& request)
{
return details::setupMeshShapeCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, num_max_contacts, exhaustive, enable_contact);
return details::setupMeshShapeCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, request);
}
......@@ -448,7 +447,7 @@ static inline bool setupShapeMeshCollisionOrientedNode(OrientedNode<S, NarrowPha
const S& model1, const SimpleTransform& tf1,
const BVHModel<BV>& model2, const SimpleTransform& tf2,
const NarrowPhaseSolver* nsolver,
int num_max_contacts, bool exhaustive, bool enable_contact)
const CollisionRequest& request)
{
if(model2.getModelType() != BVH_MODEL_TRIANGLES)
return false;
......@@ -463,9 +462,7 @@ static inline bool setupShapeMeshCollisionOrientedNode(OrientedNode<S, NarrowPha
node.vertices = model2.vertices;
node.tri_indices = model2.tri_indices;
node.num_max_contacts = num_max_contacts;
node.exhaustive = exhaustive;
node.enable_contact = enable_contact;
node.request = request;
node.R = tf2.getRotation();
node.T = tf2.getTranslation();
......@@ -481,9 +478,9 @@ bool initialize(ShapeMeshCollisionTraversalNodeOBB<S, NarrowPhaseSolver>& node,
const S& model1, const SimpleTransform& tf1,
const BVHModel<OBB>& model2, const SimpleTransform& tf2,
const NarrowPhaseSolver* nsolver,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false)
const CollisionRequest& request)
{
return setupShapeMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, num_max_contacts, exhaustive, enable_contact);
return setupShapeMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, request);
}
/** \brief Initialize the traversal node for collision between one mesh and one shape, specialized for RSS type */
......@@ -492,9 +489,9 @@ bool initialize(ShapeMeshCollisionTraversalNodeRSS<S, NarrowPhaseSolver>& node,
const S& model1, const SimpleTransform& tf1,
const BVHModel<RSS>& model2, const SimpleTransform& tf2,
const NarrowPhaseSolver* nsolver,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false)
const CollisionRequest& request)
{
return setupShapeMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, num_max_contacts, exhaustive, enable_contact);
return setupShapeMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, request);
}
/** \brief Initialize the traversal node for collision between one mesh and one shape, specialized for kIOS type */
......@@ -503,9 +500,9 @@ bool initialize(ShapeMeshCollisionTraversalNodekIOS<S, NarrowPhaseSolver>& node,
const S& model1, const SimpleTransform& tf1,
const BVHModel<kIOS>& model2, const SimpleTransform& tf2,
const NarrowPhaseSolver* nsolver,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false)
const CollisionRequest& request)
{
return setupShapeMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, num_max_contacts, exhaustive, enable_contact);
return setupShapeMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, request);
}
/** \brief Initialize the traversal node for collision between one mesh and one shape, specialized for OBBRSS type */
......@@ -514,9 +511,9 @@ bool initialize(ShapeMeshCollisionTraversalNodeOBBRSS<S, NarrowPhaseSolver>& nod
const S& model1, const SimpleTransform& tf1,
const BVHModel<OBBRSS>& model2, const SimpleTransform& tf2,
const NarrowPhaseSolver* nsolver,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false)
const CollisionRequest& request)
{
return setupShapeMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, num_max_contacts, exhaustive, enable_contact);
return setupShapeMeshCollisionOrientedNode(node, model1, tf1, model2, tf2, nsolver, request);
}
......@@ -527,7 +524,7 @@ template<typename BV>
bool initialize(MeshCollisionTraversalNode<BV>& node,
BVHModel<BV>& model1, SimpleTransform& tf1,
BVHModel<BV>& model2, SimpleTransform& tf2,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false,
const CollisionRequest& request,
bool use_refit = false, bool refit_bottomup = false)
{
if(model1.getModelType() != BVH_MODEL_TRIANGLES || model2.getModelType() != BVH_MODEL_TRIANGLES)
......@@ -578,9 +575,7 @@ bool initialize(MeshCollisionTraversalNode<BV>& node,
node.tri_indices1 = model1.tri_indices;
node.tri_indices2 = model2.tri_indices;
node.num_max_contacts = num_max_contacts;
node.exhaustive = exhaustive;
node.enable_contact = enable_contact;
node.request = request;
return true;
}
......@@ -590,22 +585,22 @@ bool initialize(MeshCollisionTraversalNode<BV>& node,
bool initialize(MeshCollisionTraversalNodeOBB& node,
const BVHModel<OBB>& model1, const SimpleTransform& tf1,
const BVHModel<OBB>& model2, const SimpleTransform& tf2,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false);
const CollisionRequest& request);
bool initialize(MeshCollisionTraversalNodeRSS& node,
const BVHModel<RSS>& model1, const SimpleTransform& tf1,
const BVHModel<RSS>& model2, const SimpleTransform& tf2,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false);
const CollisionRequest& request);
bool initialize(MeshCollisionTraversalNodeOBBRSS& node,
const BVHModel<OBBRSS>& model1, const SimpleTransform& tf1,
const BVHModel<OBBRSS>& model2, const SimpleTransform& tf2,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false);
const CollisionRequest& request);
bool initialize(MeshCollisionTraversalNodekIOS& node,
const BVHModel<kIOS>& model1, const SimpleTransform& tf1,
const BVHModel<kIOS>& model2, const SimpleTransform& tf2,
int num_max_contacts = 1, bool exhaustive = false, bool enable_contact = false);