00001 #pragma once
00002 #include "../../core/src/bvolumes.h"
00003 #include "../../core/src/geometry.h"
00004 #include "../../core/src/evtstructs.h"
00005
00006
00007
00008
00009 using namespace VRUT;
00010
00011 namespace CollisionDetectionNamespace
00012 {
00013 struct CollisionArea
00014 {
00015 std::vector<Triangle> Triangles;
00016 std::vector<VECTOR3> collisionPoints;
00017 };
00018
00020 class Collison_Detector_IFace
00021 {
00022 public:
00027 virtual CollisionReport FindCollision(void* pNode1, void* pNode2) = 0;
00028
00029 };
00030
00032 class CollisionDetector
00033 {
00034 public:
00036 enum DetectorType
00037 {
00038 DT_AABB,DT_Triangle, DT_Triangle_Distance
00039 };
00040
00046 static CollisionReport DetectCollision(void* pNode1, void* pNode2, DetectorType type);
00047
00048
00052 static Collison_Detector_IFace* GetColisionDetector(DetectorType type);
00053 };
00054
00055
00056
00057
00058
00060 class Collision_detector_AABB : public Collison_Detector_IFace
00061 {
00062 public:
00064 Collision_detector_AABB(){;}
00065
00070 CollisionReport FindCollision(void* pNode1, void* pNode2);
00071 };
00072
00073
00074
00075
00076
00078 class Collision_detector_Triangles : public Collison_Detector_IFace
00079 {
00080 public:
00082 Collision_detector_Triangles(){;}
00083
00088 CollisionReport FindCollision(void* pNode1, void* pNode2);
00089
00090 private:
00097 bool intersectSegmentTriangle(VECTOR3 p, VECTOR3 q, Triangle* triangle, VECTOR3& C);
00098 };
00099
00101 class Collision_detector_Triangles_Distance : public Collison_Detector_IFace
00102 {
00103 public:
00105 Collision_detector_Triangles_Distance(){;}
00106
00107
00112 CollisionReport FindCollision(void* pNode1, void* pNode2);
00113 private:
00114
00123 float closestPointsSegmentSegment(VECTOR3 p1,VECTOR3 q1,VECTOR3 p2,VECTOR3 q2, VECTOR3& C1, VECTOR3& C2);
00124
00125
00132 float distanceSegmentSegment(VECTOR3 p1,VECTOR3 q1,VECTOR3 p2,VECTOR3 q2);
00133
00138 float distanceVertexTriangle(VECTOR3 P, Triangle triangle);
00139
00140
00145 VECTOR3 closestPointVertexTriangle(VECTOR3 p, Triangle triangle);
00146
00152 float clamp(float n, float min, float max);
00153 };
00154
00155 };