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 #include <physics/Collider>
00026
00027 using physics::Collider;
00028
00029 using base::dynamic_cast_ref;
00030 using physics::Collidable;
00031 using physics::CollidableGroup;
00032
00033
00034
00035 Collider::Collider()
00036 : enabled(true)
00037 {
00038 }
00039
00040
00041 Collider::~Collider()
00042 {
00043 }
00044
00045
00046 void Collider::collide(ref<const Collidable> collidable)
00047 {
00048 if (!isCollisionEnabled()) return;
00049
00050 if (!instanceof(*collidable, const CollidableGroup))
00051 return;
00052
00053 ref<const CollidableGroup> group(narrow_ref<const CollidableGroup>(collidable));
00054
00055 if (!group->isChildIntercollisionEnabled()) return;
00056
00057 CollidableGroup::const_iterator_const c1 = group->const_begin();
00058 CollidableGroup::const_iterator_const end = group->const_end();
00059 while (c1 != end) {
00060 ref<const Collidable> collidable1(*c1);
00061
00062 CollidableGroup::const_iterator_const c2 = group->const_begin();
00063 while (c2 != end) {
00064 ref<const Collidable> collidable2(*c2);
00065
00066 if (&(*collidable1) < &(*collidable2))
00067 collide(collidable1, collidable2);
00068
00069 ++c2;
00070 }
00071
00072 ++c1;
00073 }
00074 }
00075
00076
00077 void Collider::notifyListeners(ref<const Collidable> collidable1, ref<const Collidable> collidable2)
00078 {
00079 if (!isCollisionEnabled()) return;
00080
00081 ListenerList::const_iterator l = listeners.begin();
00082 ListenerList::const_iterator end = listeners.end();
00083 while (l != end) {
00084 (*l)->potentialCollision(collidable1, collidable2);
00085 ++l;
00086 }
00087 }
00088
00089
00090 void Collider::resetListeners()
00091 {
00092 if (!isCollisionEnabled()) return;
00093
00094 ListenerList::const_iterator l = listeners.begin();
00095 ListenerList::const_iterator end = listeners.end();
00096 while (l != end) {
00097 (*l)->reset();
00098 ++l;
00099 }
00100 }
00101