Intersection.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_COMPONENTMODEL_COLLISION_INTERSECTION_H
00028 #define SOFA_CORE_COMPONENTMODEL_COLLISION_INTERSECTION_H
00029
00030 #include <sofa/core/CollisionModel.h>
00031 #include <sofa/core/componentmodel/collision/DetectionOutput.h>
00032 #include <sofa/helper/FnDispatcher.h>
00033
00034 namespace sofa
00035 {
00036
00037 namespace core
00038 {
00039
00040 namespace componentmodel
00041 {
00042
00043 namespace collision
00044 {
00045
00046 class ElementIntersector
00047 {
00048 protected:
00049 virtual ~ElementIntersector() {}
00050 public:
00051
00053 virtual bool canIntersect(core::CollisionElementIterator elem1, core::CollisionElementIterator elem2) = 0;
00054
00057 virtual int beginIntersect(core::CollisionModel* model1, core::CollisionModel* model2, DetectionOutputVector*& contacts) = 0;
00058
00060 virtual int intersect(core::CollisionElementIterator elem1, core::CollisionElementIterator elem2, DetectionOutputVector* contacts) = 0;
00061
00063 virtual int endIntersect(core::CollisionModel* model1, core::CollisionModel* model2, DetectionOutputVector* contacts) = 0;
00064
00065 virtual std::string name() const = 0;
00066 };
00067
00072 class IntersectorMap : public std::map< std::pair< helper::TypeInfo, helper::TypeInfo >, ElementIntersector* >
00073 {
00074 public:
00075
00076 template<class Model1, class Model2, class T>
00077 void add(T* ptr);
00078
00079 template<class Model1, class Model2>
00080 void ignore();
00081
00082 helper::TypeInfo getType(core::CollisionModel* model);
00083
00084 ElementIntersector* get(core::CollisionModel* model1, core::CollisionModel* model2, bool& swapModels);
00085
00086 protected:
00087 std::map< helper::TypeInfo, helper::TypeInfo > castMap;
00088 std::set< const objectmodel::ClassInfo* > classes;
00089 };
00090
00094 class Intersection : public virtual objectmodel::BaseObject
00095 {
00096 public:
00097
00098 virtual ~Intersection();
00099
00102 virtual ElementIntersector* findIntersector(core::CollisionModel* object1, core::CollisionModel* object2, bool& swapModels) = 0;
00103
00106 virtual bool isSupported(core::CollisionElementIterator elem1, core::CollisionElementIterator elem2);
00107
00109 virtual bool useProximity() const { return false; }
00110
00112 virtual bool useContinuous() const { return false; }
00113
00115 virtual double getAlarmDistance() const { return 0.0; }
00116
00118 virtual double getContactDistance() const { return 0.0; }
00119
00120 };
00121
00122 }
00123
00124 }
00125
00126 }
00127
00128 }
00129
00130 #endif