PQPCollisionDetection.h

00001 /****************************************************************************
00002  * Copyright 2005 Evan Drumwright
00003  * This library is distributed under the terms of the GNU General Public 
00004  * License (found in COPYING).
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 } // end namespace
00115 
00116 #endif
00117 

Generated on Wed Oct 24 14:54:21 2007 for Physsim by  doxygen 1.5.1