

/** @author Jia Pan */

#ifndef FCL_COLLISION_H
#define FCL_COLLISION_H

#include "fcl/narrowphase/collision_object.h"
#include "fcl/narrowphase/collision_request.h"
#include "fcl/narrowphase/collision_result.h"

namespace fcl
{

/// @brief Main collision interface: given two collision objects, and the
/// requirements for contacts, including num of max contacts, whether perform
/// exhaustive collision (i.e., returning returning all the contact points),
/// whether return detailed contact information (i.e., normal, contact point,
/// depth; otherwise only contact primitive id is returned), this function
/// performs the collision between them. Return value is the number of contacts
/// generated between the two objects.
template <typename S>
std::size_t collide(const CollisionObject<S>* o1, const CollisionObject<S>* o2,
                    const CollisionRequest<S>& request,
                    CollisionResult<S>& result);

template <typename S>
std::size_t collide(const CollisionGeometry<S>* o1, const Transform3<S>& tf1,
                    const CollisionGeometry<S>* o2, const Transform3<S>& tf2,
                    const CollisionRequest<S>& request,
                    CollisionResult<S>& result);

} // namespace fcl

#include "fcl/narrowphase/collision-inl.h"

#endif
