CollisionElement.h

Go to the documentation of this file.
00001 /******************************************************************************
00002 *       SOFA, Simulation Open-Framework Architecture, version 1.0 beta 3      *
00003 *                (c) 2006-2008 MGH, INRIA, USTL, UJF, CNRS                    *
00004 *                                                                             *
00005 * This library is free software; you can redistribute it and/or modify it     *
00006 * under the terms of the GNU Lesser General Public License as published by    *
00007 * the Free Software Foundation; either version 2.1 of the License, or (at     *
00008 * your option) any later version.                                             *
00009 *                                                                             *
00010 * This library is distributed in the hope that it will be useful, but WITHOUT *
00011 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
00012 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License *
00013 * for more details.                                                           *
00014 *                                                                             *
00015 * You should have received a copy of the GNU Lesser General Public License    *
00016 * along with this library; if not, write to the Free Software Foundation,     *
00017 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.          *
00018 *******************************************************************************
00019 *                              SOFA :: Framework                              *
00020 *                                                                             *
00021 * Authors: M. Adam, J. Allard, B. Andre, P-J. Bensoussan, S. Cotin, C. Duriez,*
00022 * H. Delingette, F. Falipou, F. Faure, S. Fonteneau, L. Heigeas, C. Mendoza,  *
00023 * M. Nesme, P. Neumann, J-P. de la Plata Alcade, F. Poyer and F. Roy          *
00024 *                                                                             *
00025 * Contact information: contact@sofa-framework.org                             *
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 } // namespace core
00331 
00332 } // namespace sofa
00333 
00334 #endif

Generated on Sun Nov 23 02:28:39 2008 for Sofa by  doxygen 1.5.7.1