Intersection.cpp
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 #include <sofa/core/componentmodel/collision/Intersection.inl>
00028 #include <sofa/core/componentmodel/collision/DetectionOutput.h>
00029 #include <sofa/helper/FnDispatcher.h>
00030
00031 namespace sofa
00032 {
00033
00034 namespace core
00035 {
00036
00037 namespace componentmodel
00038 {
00039
00040 namespace collision
00041 {
00042
00043 using namespace sofa::defaulttype;
00044
00045 helper::TypeInfo IntersectorMap::getType(core::CollisionModel* model)
00046 {
00047 helper::TypeInfo t(typeid(*model));
00048 const std::map<helper::TypeInfo,helper::TypeInfo>::iterator it = castMap.find(t);
00049 if (it == castMap.end())
00050 {
00051 helper::TypeInfo t2 = t;
00052 for (std::set<const objectmodel::ClassInfo* >::iterator it = classes.begin(); it != classes.end(); ++it)
00053 if ((*it)->isInstance(model))
00054 {
00055 t2 = (*it)->type();
00056 break;
00057 }
00058 castMap.insert(std::make_pair(t,t2));
00059 return t2;
00060 }
00061 else return it->second;
00062 }
00063
00064 ElementIntersector* IntersectorMap::get(core::CollisionModel* model1, core::CollisionModel* model2, bool& swapModels)
00065 {
00066 helper::TypeInfo t1 = getType(model1);
00067 helper::TypeInfo t2 = getType(model2);
00068 iterator it =
00069 this->find(std::make_pair(t1,t2));
00070 if (it != this->end())
00071 {
00072 swapModels = false;
00073 return it->second;
00074 }
00075
00076 it = this->find(std::make_pair(t2,t1));
00077 if (it != this->end())
00078 {
00079 swapModels = true;
00080 return it->second;
00081 }
00082
00083 std::cerr << "ERROR: Element Intersector "
00084 << gettypename(t1) << "-"
00085 << gettypename(t2) << " NOT FOUND.\n";
00086 (*this)[std::make_pair(t1,t2)] = NULL;
00087 return NULL;
00088 }
00089
00090 Intersection::~Intersection()
00091 {
00092 }
00093
00096 bool Intersection::isSupported(core::CollisionElementIterator elem1, core::CollisionElementIterator elem2)
00097 {
00098 bool swap;
00099 ElementIntersector* i = findIntersector(elem1.getCollisionModel(), elem2.getCollisionModel(), swap);
00100 return i != NULL;
00101 }
00102
00103 }
00104
00105 }
00106
00107 }
00108
00109 }
00110