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