CollisionElement.h
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 #ifndef SOFA_CORE_COLLISIONELEMENT_H
00028 #define SOFA_CORE_COLLISIONELEMENT_H
00029
00030 #include <vector>
00031
00032 namespace sofa
00033 {
00034
00035 namespace core
00036 {
00037
00038 class CollisionModel;
00039 class CollisionElementIterator;
00040
00045 class BaseCollisionElementIterator
00046 {
00047 public:
00048 typedef std::vector<int>::const_iterator VIterator;
00049
00054 BaseCollisionElementIterator(int index=0)
00055 : index(index), it(emptyVector.begin()), itend(emptyVector.end())
00056 {
00057 }
00058
00061 BaseCollisionElementIterator(int index, VIterator it, VIterator itend)
00062 : index(index), it(it), itend(itend)
00063 {
00064 }
00065
00068 BaseCollisionElementIterator(VIterator it, VIterator itend)
00069 : index(-1), it(it), itend(itend)
00070 {
00071 if (it != itend) index = *it;
00072 }
00073
00076
00078 void next()
00079 {
00080 if (it == itend)
00081 ++index;
00082 else
00083 {
00084 ++it;
00085 if (it != itend) index = *it;
00086 }
00087 }
00088
00090 void operator++()
00091 {
00092 next();
00093 }
00094
00096 void operator++(int)
00097 {
00098 next();
00099 }
00100
00105 int getIndex() const
00106 {
00107 return index;
00108 }
00109
00111 const VIterator& getVIterator() const
00112 {
00113 return it;
00114 }
00115
00117 const VIterator& getVIteratorEnd() const
00118 {
00119 return itend;
00120 }
00121
00123
00124 protected:
00125 int index;
00126 VIterator it;
00127 VIterator itend;
00128 static std::vector<int> emptyVector;
00129 };
00130
00142 template<class TModel>
00143 class TCollisionElementIterator : public BaseCollisionElementIterator
00144 {
00145 public:
00146 typedef TModel Model;
00147 typedef std::vector<int>::const_iterator VIterator;
00148
00153 TCollisionElementIterator(Model* model=NULL, int index=0)
00154 : BaseCollisionElementIterator(index), model(model)
00155 {
00156 }
00157
00160 TCollisionElementIterator(Model* model, int index, VIterator it, VIterator itend)
00161 : BaseCollisionElementIterator(index, it, itend), model(model)
00162 {
00163 }
00164
00167 TCollisionElementIterator(Model* model, VIterator it, VIterator itend)
00168 : BaseCollisionElementIterator(it, itend), model(model)
00169 {
00170 }
00171
00174
00177 template<class Model2>
00178 bool operator==(const TCollisionElementIterator<Model2>& i) const
00179 {
00180 return this->model == i.getCollisionModel() && this->index == i.getIndex();
00181 }
00182
00185 template<class Model2>
00186 bool operator!=(const TCollisionElementIterator<Model2>& i) const
00187 {
00188 return this->model != i.getCollisionModel() || this->index != i.getIndex();
00189 }
00190
00193 bool valid() const
00194 {
00195 return model!=NULL;
00196 }
00197
00199 Model* getCollisionModel() const
00200 {
00201 return model;
00202 }
00203
00205
00208
00212 std::pair<CollisionElementIterator,CollisionElementIterator> getInternalChildren() const;
00213
00217 std::pair<CollisionElementIterator,CollisionElementIterator> getExternalChildren() const;
00218
00222 bool isLeaf ( ) const
00223 {
00224 return model->isLeaf(index);
00225 }
00226
00230 bool canCollideWith(TCollisionElementIterator<Model>& elem)
00231 {
00232 return model->canCollideWithElement(index, elem.model, elem.index);
00233 }
00234
00236 double getProximity() { return model->getProximity(); }
00237
00239 double getContactStiffness() { return model->getContactStiffness(index); }
00240
00242 double getContactFriction() { return model->getContactFriction(index); }
00243
00244
00248 void draw()
00249 {
00250 model->draw(index);
00251 }
00252
00254
00255
00256 protected:
00257 Model* model;
00258 };
00259
00273 class CollisionElementIterator : public TCollisionElementIterator<CollisionModel>
00274 {
00275 public:
00280 CollisionElementIterator(CollisionModel* model=NULL, int index=0)
00281 : TCollisionElementIterator<CollisionModel>(model, index)
00282 {
00283 }
00284
00287 CollisionElementIterator(CollisionModel* model, VIterator it, VIterator itend)
00288 : TCollisionElementIterator<CollisionModel>(model, it, itend)
00289 {
00290 }
00291
00294 CollisionElementIterator(CollisionModel* model, int index, VIterator it, VIterator itend)
00295 : TCollisionElementIterator<CollisionModel>(model, index, it, itend)
00296 {
00297 }
00298
00300 template<class DerivedModel>
00301 CollisionElementIterator(const TCollisionElementIterator<DerivedModel>& i)
00302 : TCollisionElementIterator<CollisionModel>(i.getCollisionModel(), i.getIndex(), i.getVIterator(), i.getVIteratorEnd())
00303 {
00304 }
00305
00307 template<class DerivedModel>
00308 void operator=(const TCollisionElementIterator<DerivedModel>& i)
00309 {
00310 this->model = i.getCollisionModel();
00311 this->index = i.getIndex();
00312 this->it = i.getVIterator();
00313 this->itend = i.getVIteratorEnd();
00314 }
00315 };
00316
00317
00318 template<class Model>
00319 std::pair<CollisionElementIterator,CollisionElementIterator> TCollisionElementIterator<Model>::getInternalChildren() const
00320 {
00321 return model->getInternalChildren(index);
00322 }
00323
00324 template<class Model>
00325 std::pair<CollisionElementIterator,CollisionElementIterator> TCollisionElementIterator<Model>::getExternalChildren() const
00326 {
00327 return model->getExternalChildren(index);
00328 }
00329
00330 }
00331
00332 }
00333
00334 #endif