Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00039 #ifndef FCL_BROAD_PHASE_H
00040 #define FCL_BROAD_PHASE_H
00041
00042 #include "fcl/collision_object.h"
00043 #include <set>
00044 #include <vector>
00045
00046 namespace fcl
00047 {
00048
00049
00051 typedef bool (*CollisionCallBack)(CollisionObject* o1, CollisionObject* o2, void* cdata);
00052
00054 typedef bool (*DistanceCallBack)(CollisionObject* o1, CollisionObject* o2, void* cdata, FCL_REAL& dist);
00055
00056
00058 class BroadPhaseCollisionManager
00059 {
00060 public:
00061 BroadPhaseCollisionManager() : enable_tested_set_(false)
00062 {
00063 }
00064
00065 virtual ~BroadPhaseCollisionManager() {}
00066
00068 virtual void registerObjects(const std::vector<CollisionObject*>& other_objs)
00069 {
00070 for(size_t i = 0; i < other_objs.size(); ++i)
00071 registerObject(other_objs[i]);
00072 }
00073
00075 virtual void registerObject(CollisionObject* obj) = 0;
00076
00078 virtual void unregisterObject(CollisionObject* obj) = 0;
00079
00081 virtual void setup() = 0;
00082
00084 virtual void update() = 0;
00085
00087 virtual void update(CollisionObject* updated_obj)
00088 {
00089 update();
00090 }
00091
00093 virtual void update(const std::vector<CollisionObject*>& updated_objs)
00094 {
00095 update();
00096 }
00097
00099 virtual void clear() = 0;
00100
00102 virtual void getObjects(std::vector<CollisionObject*>& objs) const = 0;
00103
00105 virtual void collide(CollisionObject* obj, void* cdata, CollisionCallBack callback) const = 0;
00106
00108 virtual void distance(CollisionObject* obj, void* cdata, DistanceCallBack callback) const = 0;
00109
00111 virtual void collide(void* cdata, CollisionCallBack callback) const = 0;
00112
00114 virtual void distance(void* cdata, DistanceCallBack callback) const = 0;
00115
00117 virtual void collide(BroadPhaseCollisionManager* other_manager, void* cdata, CollisionCallBack callback) const = 0;
00118
00120 virtual void distance(BroadPhaseCollisionManager* other_manager, void* cdata, DistanceCallBack callback) const = 0;
00121
00123 virtual bool empty() const = 0;
00124
00126 virtual size_t size() const = 0;
00127
00128 protected:
00129
00131 mutable std::set<std::pair<CollisionObject*, CollisionObject*> > tested_set;
00132 mutable bool enable_tested_set_;
00133
00134 bool inTestedSet(CollisionObject* a, CollisionObject* b) const
00135 {
00136 if(a < b) return tested_set.find(std::make_pair(a, b)) != tested_set.end();
00137 else return tested_set.find(std::make_pair(b, a)) != tested_set.end();
00138 }
00139
00140 void insertTestedSet(CollisionObject* a, CollisionObject* b) const
00141 {
00142 if(a < b) tested_set.insert(std::make_pair(a, b));
00143 else tested_set.insert(std::make_pair(b, a));
00144 }
00145
00146 };
00147
00148
00149 }
00150
00151
00152 #include "fcl/broadphase/broadphase_bruteforce.h"
00153 #include "fcl/broadphase/broadphase_spatialhash.h"
00154 #include "fcl/broadphase/broadphase_SaP.h"
00155 #include "fcl/broadphase/broadphase_SSaP.h"
00156 #include "fcl/broadphase/broadphase_interval_tree.h"
00157 #include "fcl/broadphase/broadphase_dynamic_AABB_tree.h"
00158 #include "fcl/broadphase/broadphase_dynamic_AABB_tree_array.h"
00159
00160 #endif