00001 /* **-*-c++-*-************************************************************** 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 1031 2004-02-11 20:46:36Z jungd $ 00019 $Revision: 1.2 $ 00020 $Date: 2004-02-11 15:46:36 -0500 (Wed, 11 Feb 2004) $ 00021 $Author: jungd $ 00022 00023 ****************************************************************************/ 00024 00025 #ifndef _PHYSICS_COLLIDABLEGROUP_ 00026 #define _PHYSICS_COLLIDABLEGROUP_ 00027 00028 #include <physics/physics> 00029 00030 #include <physics/Collidable> 00031 00032 00033 namespace physics { 00034 00035 00036 class CollidableGroup : public Collidable 00037 { 00038 public: 00039 CollidableGroup() : childIntercollisionsEnabled(true) {} 00040 virtual ~CollidableGroup() {} 00041 00042 virtual String className() const { return String("CollidableGroup"); } 00043 00044 virtual BoundingBox getBoundingBox() const 00045 { 00046 // combine bounding boxes of all group members 00047 BoundingBox bb; bb.setEmpty(); 00048 const_iterator_const c = const_begin(); 00049 const_iterator_const end = const_end(); 00050 while (c != end) { 00051 ref<const Collidable> collidable(*c); 00052 bb.include( collidable->getBoundingBox() ); 00053 ++c; 00054 } 00055 return bb; 00056 } 00057 00058 virtual void addCollidable(ref<Collidable> c) { Assert(c); collidables.push_back(c); } ///< add Collidable to the group 00059 virtual void removeCollidable(ref<Collidable> c) { collidables.remove(c); } ///< remove collidable from the group 00060 virtual void clear() { collidables.clear(); } ///< remove all Collidables from group 00061 00062 virtual ref<const Collidable> findNamed(const String& name, bool recurse=true) const; 00063 virtual ref<Collidable> findNamed(const String& name, bool recurse=true); 00064 00065 virtual bool find(ref<const Collidable> collidable, bool recurse=true) const; 00066 00067 virtual void setChildIntercollisionEnabled(bool enabled) 00068 { childIntercollisionsEnabled = enabled; } 00069 00070 virtual bool isChildIntercollisionEnabled() const 00071 { return childIntercollisionsEnabled; } 00072 00073 00074 typedef base::reflist<Collidable> Collidables; 00075 typedef Collidables::iterator iterator; 00076 typedef Collidables::iterator_const iterator_const; 00077 typedef Collidables::const_iterator const_iterator; 00078 typedef Collidables::const_iterator_const const_iterator_const; 00079 00080 iterator begin() { return collidables.begin(); } 00081 const_iterator begin() const { return collidables.begin(); } 00082 const_iterator_const const_begin() const { return collidables.const_begin(); } 00083 iterator end() { return collidables.end(); } 00084 const_iterator end() const { return collidables.end(); } 00085 const_iterator_const const_end() const { return collidables.const_end(); } 00086 00087 00088 protected: 00089 CollidableGroup(const CollidableGroup& cg) 00090 : Collidable(cg), childIntercollisionsEnabled(cg.childIntercollisionsEnabled), 00091 collidables(cg.collidables) {} 00092 00093 bool childIntercollisionsEnabled; 00094 Collidables collidables; 00095 }; 00096 00097 00098 00099 } // physics 00100 00101 #endif