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
00038 #ifndef FCL_BROAD_PHASE_SSAP_H
00039 #define FCL_BROAD_PHASE_SSAP_H
00040
00041 #include "fcl/broadphase/broadphase.h"
00042
00043 namespace fcl
00044 {
00045
00047 class SSaPCollisionManager : public BroadPhaseCollisionManager
00048 {
00049 public:
00050 SSaPCollisionManager() : setup_(false)
00051 {}
00052
00054 void registerObject(CollisionObject* obj);
00055
00057 void unregisterObject(CollisionObject* obj);
00058
00060 void setup();
00061
00063 void update();
00064
00066 void clear();
00067
00069 void getObjects(std::vector<CollisionObject*>& objs) const;
00070
00072 void collide(CollisionObject* obj, void* cdata, CollisionCallBack callback) const;
00073
00075 void distance(CollisionObject* obj, void* cdata, DistanceCallBack callback) const;
00076
00078 void collide(void* cdata, CollisionCallBack callback) const;
00079
00081 void distance(void* cdata, DistanceCallBack callback) const;
00082
00084 void collide(BroadPhaseCollisionManager* other_manager, void* cdata, CollisionCallBack callback) const;
00085
00087 void distance(BroadPhaseCollisionManager* other_manager, void* cdata, DistanceCallBack callback) const;
00088
00090 bool empty() const;
00091
00093 inline size_t size() const { return objs_x.size(); }
00094
00095 protected:
00097 bool checkColl(std::vector<CollisionObject*>::const_iterator pos_start, std::vector<CollisionObject*>::const_iterator pos_end,
00098 CollisionObject* obj, void* cdata, CollisionCallBack callback) const;
00099
00101 bool checkDis(std::vector<CollisionObject*>::const_iterator pos_start, std::vector<CollisionObject*>::const_iterator pos_end,
00102 CollisionObject* obj, void* cdata, DistanceCallBack callback, FCL_REAL& min_dist) const;
00103
00104 bool collide_(CollisionObject* obj, void* cdata, CollisionCallBack callback) const;
00105
00106 bool distance_(CollisionObject* obj, void* cdata, DistanceCallBack callback, FCL_REAL& min_dist) const;
00107
00108 static inline size_t selectOptimalAxis(const std::vector<CollisionObject*>& objs_x, const std::vector<CollisionObject*>& objs_y, const std::vector<CollisionObject*>& objs_z, std::vector<CollisionObject*>::const_iterator& it_beg, std::vector<CollisionObject*>::const_iterator& it_end)
00109 {
00111 double delta_x = (objs_x[objs_x.size() - 1])->getAABB().min_[0] - (objs_x[0])->getAABB().min_[0];
00112 double delta_y = (objs_x[objs_y.size() - 1])->getAABB().min_[1] - (objs_y[0])->getAABB().min_[1];
00113 double delta_z = (objs_z[objs_z.size() - 1])->getAABB().min_[2] - (objs_z[0])->getAABB().min_[2];
00114
00115 int axis = 0;
00116 if(delta_y > delta_x && delta_y > delta_z)
00117 axis = 1;
00118 else if(delta_z > delta_y && delta_z > delta_x)
00119 axis = 2;
00120
00121 switch(axis)
00122 {
00123 case 0:
00124 it_beg = objs_x.begin();
00125 it_end = objs_x.end();
00126 break;
00127 case 1:
00128 it_beg = objs_y.begin();
00129 it_end = objs_y.end();
00130 break;
00131 case 2:
00132 it_beg = objs_z.begin();
00133 it_end = objs_z.end();
00134 break;
00135 }
00136
00137 return axis;
00138 }
00139
00140
00142 std::vector<CollisionObject*> objs_x;
00143
00145 std::vector<CollisionObject*> objs_y;
00146
00148 std::vector<CollisionObject*> objs_z;
00149
00151 bool setup_;
00152 };
00153
00154
00155 }
00156
00157 #endif