00001 #ifndef COLLISIONHANDLER_H_INCLUDED
00002 #define COLLISIONHANDLER_H_INCLUDED
00003
00004
00005 #include <CGLA/Vec3f.h>
00006 #include <vector>
00007
00008
00009 class Collider;
00010 class SphereCollider;
00011 class BoxCollider;
00012 class PlaneCollider;
00013 struct Ray;
00014 struct RayCastHit;
00015 struct CollisionHit;
00016
00017 using namespace CGLA;
00018 using namespace std;
00019
00023 inline float clamp(float a, float b, float c){
00024 if( a < b )
00025 return b;
00026 else if( a > c )
00027 return c;
00028 else
00029 return a;
00030 }
00031
00035 class CollisionHandler{
00036 public:
00037 typedef vector<Collider*>::iterator ColliderIter;
00038
00039 protected:
00043 vector<Collider*> colliders;
00044
00045 public:
00046 CollisionHandler();
00047 ~CollisionHandler();
00051 void clear();
00052 void addCollider(Collider* collider);
00053 void removeCollider(Collider* collider);
00054
00059 void detectCollisions();
00060 ColliderIter colliderIteratorBegin();
00061 ColliderIter colliderIteratorEnd();
00062
00068 bool rayCast(const Ray& ray, RayCastHit& hit,Collider* ignore = NULL)const;
00069
00070 protected:
00074 bool detectSphereSphereCollision(const SphereCollider* const col1, const SphereCollider* const col2, CollisionHit& hit);
00078 bool detectSphereBoxCollision(const SphereCollider* const col1, const BoxCollider* const col2, CollisionHit& hit);
00082 bool detectSpherePlaneCollision(const SphereCollider* const col1, const PlaneCollider* const col2, CollisionHit& hit);
00086 bool detectBoxBoxCollision(const BoxCollider* const col1, const BoxCollider* const col2, CollisionHit& hit);
00090 bool detectBoxPlaneCollision(const BoxCollider* const col1, const PlaneCollider* const col2, CollisionHit& hit);
00091
00095 bool detectPlanePlaneCollision(const PlaneCollider* const col1, const PlaneCollider* const col2, CollisionHit& hit);
00096 };
00097
00098 #endif