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 #ifndef _PHYSICS_COLLISIONCULLER_
00026 #define _PHYSICS_COLLISIONCULLER_
00027
00028 #include <physics/physics>
00029
00030 #include <physics/Collider>
00031 #include <physics/CollidableGroup>
00032
00033
00034 namespace physics {
00035
00036
00037 class CollisionCuller : public Collider
00038 {
00039 public:
00040 virtual ~CollisionCuller() {}
00041
00042 virtual void collisionEnable(bool enabled, ref<const Collidable> collidable1, ref<const Collidable> collidable2)
00043 {
00044 if (&(*collidable1) > &(*collidable2))
00045 base::swap(collidable1,collidable2);
00046
00047 CollidablePair collidablePair = std::make_pair(collidable1, collidable2);
00048 collisionDisabledMap[collidablePair] = enabled;
00049 }
00050
00051 virtual bool isCollisionEnabled(ref<const Collidable> collidable1, ref<const Collidable> collidable2)
00052 {
00053 if (&(*collidable1) > &(*collidable2))
00054 base::swap(collidable1,collidable2);
00055
00056 CollidablePair collidablePair = std::make_pair(collidable1, collidable2);
00057
00058
00059 CollisionDisabledMap::iterator entry = collisionDisabledMap.find(collidablePair);
00060 if (entry != collisionDisabledMap.end()) {
00061
00062 return entry->second;
00063 }
00064 else
00065 return true;
00066
00067 }
00068
00069 virtual void collisionEnable(bool enabled) { Collider::collisionEnable(enabled); }
00070 virtual bool isCollisionEnabled() const { return Collider::isCollisionEnabled(); }
00071
00072 virtual ref<CollidableGroup> createCollidableGroup() const = 0;
00073
00074 protected:
00075 CollisionCuller() {}
00076 CollisionCuller(const CollisionCuller& cc) : Collider(cc) {}
00077
00078 typedef std::pair< ref<const Collidable>, ref<const Collidable> > CollidablePair;
00079 typedef std::map< CollidablePair, bool > CollisionDisabledMap;
00080
00081 CollisionDisabledMap collisionDisabledMap;
00082 };
00083
00084
00085 inline bool operator<(ref<const Collidable> c1, const Collidable* c2)
00086 { return &(*c1) < c2; }
00087
00088
00089 }
00090
00091 #endif