CollisionDetection.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 _COLLISION_DETECTION_H
00008 #define _COLLISION_DETECTION_H
00009 
00010 #include <map>
00011 #include <set>
00012 #include <Physsim/sorted_pair>
00013 #include <Physsim/Base.h>
00014 #include <Physsim/Contact.h>
00015 #include <Physsim/VectorN.h>
00016 #include <Physsim/Matrix4.h>
00017 
00018 namespace Physsim {
00019 
00020 class DynamicBody;
00021 class RigidBody;
00022 class ArticulatedBody;
00023 class CollisionGeometry;
00024 class Triangle;
00025 
00027 struct Query
00028 {
00029         public:
00030                 boost::shared_ptr<void> result;
00031                 CollisionGeometryPtr g1, g2;
00032                 std::list<ContactPtr> c;
00033 };
00034 
00035 typedef boost::shared_ptr<Query> QueryPtr;
00036 
00038 class CollisionDetection : public Base
00039 {
00040         public:
00041                 CollisionDetection();
00042                 virtual ~CollisionDetection() {}
00043                 virtual void clone(BasePtr& cloned, bimap<BasePtr, BasePtr>* obj_map = NULL) const;
00044                 virtual bool is_struct_identical(BaseConstPtr object) const;
00045                 virtual void load_state(BaseConstPtr object, bimap<BasePtr, BasePtr>* correspondence = NULL);
00046                 virtual void save_state(BasePtr object, bimap<BasePtr, BasePtr>* correspondence = NULL) const;
00047                 void add_dynamic_body(DynamicBodyPtr body);
00048                 void operator=(const CollisionDetection* source);
00049                 virtual void load_from_xml(XMLTreeConstPtr node, std::map<std::string, BasePtr>& id_map);
00050                 virtual void save_to_xml(XMLTreePtr node, std::list<BaseConstPtr>& shared_objects) const;
00051                 virtual void remove_collision_geometry(CollisionGeometryPtr geom);
00052                 virtual void remove_all_collision_geometries();
00053                 virtual void add_rigid_body(RigidBodyPtr body); 
00054                 virtual void add_articulated_body(ArticulatedBodyPtr abody, bool disable_adjacent);
00055                 virtual void output_object_state(std::ostream& out) const;
00056                 void set_enabled(BasePtr b1, BasePtr b2, bool enabled);
00057                 void set_enabled(BasePtr b, bool enabled);
00058                 bool is_checked(CollisionGeometryPtr cg1, CollisionGeometryPtr cg2) const;
00059 
00061 
00066                 virtual void add_collision_geometry(CollisionGeometryPtr geom) { _geoms.insert(geom); } 
00067 
00069                 const std::set<CollisionGeometryPtr>& get_collision_geometries() const { return _geoms; }
00070                 
00072                 bool is_enabled(CollisionGeometryPtr g1, CollisionGeometryPtr g2) const { return _disabled_pairs.find(make_sorted_pair(g1, g2)) == _disabled_pairs.end(); }
00073                         
00075                 bool is_enabled(CollisionGeometryPtr g) const { return _disabled.find(g) == _disabled.end(); }
00076 
00078 
00085                 virtual bool is_collision(Real epsilon = 0.0) = 0;
00086 
00088                 virtual Real calc_distances() = 0;
00089 
00091                 
00093                 const std::map<sorted_pair<CollisionGeometryPtr>, QueryPtr>& get_colliding_pairs() const { return _colliding_pairs; }
00094 
00096                 const std::map<sorted_pair<CollisionGeometryPtr>, QueryPtr>& get_distances() const { return _distances; }
00097 
00099                 const std::set<sorted_pair<CollisionGeometryPtr> >& get_disabled_pairs() const { return _disabled_pairs; }
00100 
00102                 const std::set<CollisionGeometryPtr>& get_disabled() const { return _disabled; }
00103 
00105                 void add_articulated_body(ArticulatedBodyPtr abody) { add_articulated_body(abody, _disable_adjacent_default); }
00106 
00108                 virtual std::list<ContactPtr> find_contacts(CollisionGeometryPtr g1, CollisionGeometryPtr g2) = 0;
00109                 
00111                 bool _disable_adjacent_default;
00112 
00113         protected:
00115                 virtual void save_query_results(BasePtr object, bimap<BasePtr, BasePtr>* correspondence) const { }
00116 
00118                 virtual void clone_query_results(BasePtr& cloned, bimap<BasePtr, BasePtr>* object_map) const { }
00119 
00121                 virtual void load_query_results(BaseConstPtr object, bimap<BasePtr, BasePtr>* correspondence) { }
00122 
00123                 bool collinear(const std::list<Vector3>& points) const;
00124         
00126                 std::set<sorted_pair<CollisionGeometryPtr> > _disabled_pairs;
00127 
00129                 std::set<CollisionGeometryPtr> _disabled;
00130 
00132                 std::map<sorted_pair<CollisionGeometryPtr>, QueryPtr> _colliding_pairs;
00133 
00135                 std::map<sorted_pair<CollisionGeometryPtr>, QueryPtr> _distances;
00136 
00137         protected:
00138 
00140                 std::set<CollisionGeometryPtr> _geoms;
00141 }; // end class
00142 
00143 } // end namespace Physsim
00144 
00145 #endif
00146 

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