00001
00002
00003
00004
00005
00006
00007 #ifndef _ADF_COLLISION_DETECTION_H
00008 #define _ADF_COLLISION_DETECTION_H
00009
00010 #include <list>
00011 #include <set>
00012 #include <map>
00013 #include <boost/shared_ptr.hpp>
00014 #include "PQP.h"
00015 #include <Physsim/Polyhedron.h>
00016 #include <Physsim/PQPCollisionDetection.h>
00017
00018 namespace Physsim {
00019
00020 class ADF;
00021 class RigidBody;
00022 class ArticulatedBody;
00023 class CollisionGeometry;
00024 struct InsideEdge;
00025
00027 class ADFCollisionDetection : public PQPCollisionDetection
00028 {
00029 public:
00030 ADFCollisionDetection();
00031 ADFCollisionDetection(Real epsilon, unsigned max_recursion);
00032 ADFCollisionDetection(const std::vector<DynamicBodyPtr>& bodies, Real epsilon, unsigned max_recursion);
00033 ADFCollisionDetection(const std::vector<DynamicBodyPtr>& bodies, Real epsilon, unsigned max_recursion, bool disable_adjacent);
00034 ~ADFCollisionDetection() {}
00035 virtual void clone(BasePtr& cloned, bimap<BasePtr, BasePtr>* obj_map = NULL) const;
00036 virtual bool is_struct_identical(BaseConstPtr object) const;
00037 virtual void load_state(BaseConstPtr object, bimap<BasePtr, BasePtr>* correspondence = NULL);
00038 virtual void save_state(BasePtr object, bimap<BasePtr, BasePtr>* correspondence = NULL) const;
00039 void set_max_recursion(unsigned max_recursion);
00040 void set_epsilon(Real epsilon);
00041 virtual std::list<ContactPtr> find_contacts(CollisionGeometryPtr g1, CollisionGeometryPtr g2);
00042 virtual void load_from_xml(XMLTreeConstPtr node, std::map<std::string, BasePtr>& id_map);
00043 virtual void save_to_xml(XMLTreePtr node, std::list<BaseConstPtr>& shared_objects) const;
00044 virtual void remove_collision_geometry(CollisionGeometryPtr geom);
00045 virtual void remove_all_collision_geometries();
00046 virtual void add_collision_geometry(CollisionGeometryPtr geom);
00047
00049
00052 unsigned get_max_recursion() const { return _max_recursion; }
00053
00054 private:
00055 static int area_sign(const Vector2& a, const Vector2& b, const Vector2& c);
00056 static Vector2 to_2D(const Vector3& v);
00057 static Vector3 to_3D(const Vector2& v, Real z);
00058 static void find_bottom_points(std::list<Vector3>& points, const Vector3& normal, Real d);
00059 void get_inside_points(CollisionGeometryPtr g1, CollisionGeometryPtr g2, const std::list<std::pair<TriangleConstPtr, TriangleConstPtr> >& colliding_tris, std::list<std::pair<Vector3, Real> >& inside_g1, std::list<std::pair<Vector3, Real> >& inside_g2) const;
00060 void determine_normal(CollisionGeometryPtr g1, CollisionGeometryPtr g2, const std::list<std::pair<TriangleConstPtr, TriangleConstPtr> >& colliding_tris, const std::list<std::pair<Vector3, Real> >& inside_g1, const std::list<std::pair<Vector3, Real> >& inside_g2, Vector3& normal, Real& d) const;
00061
00063 Real _epsilon;
00064
00066 unsigned _max_recursion;
00067
00069 std::map<CollisionGeometryPtr, boost::shared_ptr<ADF> > _adf_map;
00070 };
00071
00072 }
00073
00074 #endif
00075