00001
00002
00003
00004
00005
00006
00007 #ifndef _PQP_COLLISION_DETECTION_H
00008 #define _PQP_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/CollisionDetection.h>
00017
00018 struct PQP_CollideResult;
00019
00020 namespace Physsim {
00021
00022 class RigidBody;
00023 class ArticulatedBody;
00024 class CollisionGeometry;
00025 struct InsideEdge;
00026
00028 class PQPCollisionDetection : public CollisionDetection
00029 {
00030 public:
00031 PQPCollisionDetection();
00032 PQPCollisionDetection(const std::vector<DynamicBodyPtr>& bodies);
00033 PQPCollisionDetection(const std::vector<DynamicBodyPtr>& bodies, bool disable_adjacent);
00034 ~PQPCollisionDetection() {}
00035 void reconstruct();
00036 void reconstruct(CollisionGeometryPtr geom);
00037 virtual void clone(BasePtr& cloned, bimap<BasePtr, BasePtr>* obj_map = NULL) const;
00038 virtual bool is_struct_identical(BaseConstPtr object) const;
00039 virtual void load_state(BaseConstPtr object, bimap<BasePtr, BasePtr>* correspondence = NULL);
00040 virtual void save_state(BasePtr object, bimap<BasePtr, BasePtr>* correspondence = NULL) const;
00041 virtual bool is_collision(Real epsilon = 0.0);
00042 virtual Real calc_distances();
00043 virtual std::list<ContactPtr> find_contacts(CollisionGeometryPtr g1, CollisionGeometryPtr g2);
00044 virtual void load_from_xml(XMLTreeConstPtr node, std::map<std::string, BasePtr>& id_map);
00045 virtual void save_to_xml(XMLTreePtr node, std::list<BaseConstPtr>& shared_objects) const;
00046 virtual void add_collision_geometry(CollisionGeometryPtr geom);
00047 virtual void remove_collision_geometry(CollisionGeometryPtr geom);
00048 virtual void remove_all_collision_geometries();
00049
00051
00054 void set_distance_query_rerr(Real err) { _dquery_rerr = err; }
00055
00057
00060 void set_distance_query_aerr(Real err) { _dquery_aerr = err; }
00061
00063
00069 bool get_geoms_interpenetrate() const { return _geoms_interpenetrate; }
00070
00072
00078 void set_geoms_interpenetrate(bool flag) { _geoms_interpenetrate = flag; }
00079
00080
00081 protected:
00082 boost::shared_ptr<std::list<std::pair<TriangleConstPtr, TriangleConstPtr> > > get_colliding_tris(CollisionGeometryPtr g1, boost::shared_ptr<CollisionGeometry> g2) const;
00083 virtual void clone_query_results(BasePtr& cloned, bimap<BasePtr, BasePtr>* object_map) const;
00084 virtual void save_query_results(BasePtr object, bimap<BasePtr, BasePtr>* correspondence) const;
00085 virtual void load_query_results(BaseConstPtr object, bimap<BasePtr, BasePtr>* correspondence);
00086
00088 std::map<Vector3ConstPtr, std::list<TriangleConstPtr> > _adj_facets;
00089
00090 private:
00091 std::list<ContactPtr> form_contacts(CollisionGeometryPtr g1, CollisionGeometryPtr g2, const std::list<std::pair<TriangleConstPtr, TriangleConstPtr> >& colliding_tris) const;
00092 ContactPtr det_contact_geometry(CollisionGeometryPtr g1, CollisionGeometryPtr g2, std::list<std::pair<TriangleConstPtr, TriangleConstPtr> >& colliding_tris) const;
00093 void det_contact_normal(CollisionGeometryPtr g2, CollisionGeometryPtr g2, Contact& c, std::list<std::pair<TriangleConstPtr, TriangleConstPtr> >& colliding_tris) const;
00094 Real det_d(const std::list<Vector3ConstPtr>& p_vertices, const std::list<Vector3ConstPtr>& q_vertices, const Polyhedron& isect, const Vector3& normal) const;
00095 Vector3 det_polygon_normal(const std::list<Vector3>& polygon) const;
00096 boost::shared_ptr<std::list<Vector3> > get_contact_vertices(CollisionGeometryPtr g2, CollisionGeometryPtr g2, const std::list<std::pair<TriangleConstPtr, TriangleConstPtr> >& colliding_tris) const;
00097 static void to_PQP(const Matrix4& m, PQP_REAL R[3][3], PQP_REAL T[3]);
00098 static boost::shared_ptr<PQP_CollideResult> clone_collide_result(const PQP_CollideResult& cr);
00099 static boost::shared_ptr<PQP_DistanceResult> clone_distance_result(const PQP_DistanceResult& dr);
00100 Real _dquery_rerr;
00101 Real _dquery_aerr;
00102
00104 std::map<CollisionGeometryPtr, boost::shared_ptr<PQP_Model> > _model_map;
00105
00106 protected:
00108 bool _geoms_interpenetrate;
00109
00111 std::map<CollisionGeometryPtr, std::list<TriangleConstPtr> > _non_coplanar_facets;
00112 };
00113
00114 }
00115
00116 #endif
00117