00001
00002
00003
00004
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 };
00142
00143 }
00144
00145 #endif
00146