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/CollidableGroup>
00026
00027 using physics::CollidableGroup;
00028
00029 using physics::Collidable;
00030
00031
00032 ref<const Collidable> CollidableGroup::findNamed(const String& name, bool recurse) const
00033 {
00034 const_iterator_const c = const_begin();
00035 const_iterator_const cend = const_end();
00036 while (c != cend) {
00037 if ((*c)->getName() == name)
00038 return *c;
00039
00040 if (instanceof(**c, const CollidableGroup)) {
00041 ref<const CollidableGroup> group(narrow_ref<const CollidableGroup>(*c));
00042 ref<const Collidable> found = recurse?group->findNamed(name, recurse):ref<const Collidable>(0);
00043 if (found) return found;
00044 }
00045
00046 ++c;
00047 }
00048 return ref<Collidable>(0);
00049 }
00050
00051
00052 ref<Collidable> CollidableGroup::findNamed(const String& name, bool recurse)
00053 {
00054 const_iterator c = begin();
00055 const_iterator cend = end();
00056 while (c != cend) {
00057 if ((*c)->getName() == name)
00058 return *c;
00059
00060 if (instanceof(**c, CollidableGroup)) {
00061 ref<CollidableGroup> group(narrow_ref<CollidableGroup>(*c));
00062 ref<Collidable> found = recurse?group->findNamed(name, recurse):ref<Collidable>(0);
00063 if (found) return found;
00064 }
00065
00066 ++c;
00067 }
00068 return ref<Collidable>(0);
00069 }
00070
00071
00072 bool CollidableGroup::find(ref<const Collidable> collidable, bool recurse) const
00073 {
00074 const_iterator_const c = const_begin();
00075 const_iterator_const cend = const_end();
00076 while (c != cend) {
00077 if ((*c) == collidable)
00078 return true;
00079
00080 if (instanceof(**c, const CollidableGroup)) {
00081 ref<const CollidableGroup> group(base::narrow_ref<const CollidableGroup>(*c));
00082 bool found = recurse?group->find(collidable,recurse):false;
00083 if (found) return true;
00084 }
00085
00086 ++c;
00087 }
00088 return false;
00089 }