ADFCollisionDetection.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 _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 } // end namespace
00073 
00074 #endif
00075 

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