Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

physics/CollidableGroup.cpp

Go to the documentation of this file.
00001 /****************************************************************************
00002   Copyright (C)2003 David Jung <opensim@pobox.com>
00003 
00004   This program/file is free software; you can redistribute it and/or modify
00005   it under the terms of the GNU General Public License as published by
00006   the Free Software Foundation; either version 2 of the License, or
00007   (at your option) any later version.
00008   
00009   This program is distributed in the hope that it will be useful,
00010   but WITHOUT ANY WARRANTY; without even the implied warranty of
00011   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012   GNU General Public License for more details. (http://www.gnu.org)
00013   
00014   You should have received a copy of the GNU General Public License
00015   along with this program; if not, write to the Free Software
00016   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00017   
00018   $Id: CollidableGroup.cpp 1031 2004-02-11 20:46:36Z jungd $
00019   $Revision: 1.3 $
00020   $Date: 2004-02-11 15:46:36 -0500 (Wed, 11 Feb 2004) $
00021   $Author: jungd $
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 }

Generated on Thu Jul 29 15:56:22 2004 for OpenSim by doxygen 1.3.6