00001 /**************************************************************************** 00002 Copyright (C)1996 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: Universe 1029 2004-02-11 20:45:54Z jungd $ 00019 $Revision: 1.4 $ 00020 $Date: 2004-02-11 15:45:54 -0500 (Wed, 11 Feb 2004) $ 00021 $Author: jungd $ 00022 00023 ****************************************************************************/ 00024 00025 #ifndef _BASE_UNIVERSE_ 00026 #define _BASE_UNIVERSE_ 00027 00028 #include <base/base> 00029 #include <base/reflist> 00030 #include <base/Object> 00031 #include <base/Simulatable> 00032 #include <base/VFileSystem> 00033 #include <base/Cache> 00034 #include <base/PathName> 00035 #include <base/World> 00036 00037 #include <list> 00038 00039 00040 namespace base { 00041 00042 00043 class Universe : public Simulatable 00044 { 00045 public: 00046 Universe(ref<VFileSystem> fs, const String& resourceDirectoryName, const String& cacheDirectoryName="cache"); 00047 virtual ~Universe(); 00048 00049 virtual String className() const { return String("Universe"); } 00050 virtual Object& clone() const { return *(Object*)this; } // singelton, just return THE instance 00051 00052 00053 // Simulatable 00054 virtual void preSimulate(); 00055 virtual void simulateForSimTime(const Time& dt); 00056 virtual void simulateForRealTime(const Time& dt, Real simTimeStepSize = minSimStepSize); 00057 00058 void setResourceDirectory(const PathName& resourceDirectory); 00059 void setCacheDirectory(const PathName& cacheDirectory); 00060 ref<Cache> cache() { return masterCache; } 00061 ref<VFileSystem> filesystem() { return vfilesystem; } 00062 00063 void addWorld(ref<World> world); 00064 ref<World> removeWorld(ref<World> world); 00065 00066 void renderWorlds(); ///< render a single frame of all Worlds ( renderFrame() ) 00067 00068 long renderedFrameCount() const { return frameCount; } 00069 static const int maxDisplayFrameRate = 30; // Hz 00070 00071 void enableSimulationRendering(bool renderWorlds) { renderWorldsDuringSim=renderWorlds; } 00072 00073 void addSimulatable(ref<Simulatable> simulatable); 00074 ref<Simulatable> removeSimulatable(ref<Simulatable> simulatable); 00075 00076 Time simTime; 00077 00078 protected: 00079 00080 private: 00081 Universe(Universe& u) 00082 : vfilesystem(u.vfilesystem), 00083 renderWorldsDuringSim(true) 00084 { 00085 masterCache = ref<Cache>( NewNamedObj("masterCache") Cache(u.vfilesystem, u.masterCache->resourceDirectory(), u.masterCache->cacheDirectory() ) ); 00086 } 00087 00088 00089 ref<VFileSystem> vfilesystem; 00090 ref<Cache> masterCache; 00091 00092 bool renderWorldsDuringSim; // render Worlds during simulation? 00093 00094 reflist<World> worlds; 00095 reflist<Simulatable> simulatables; 00096 00097 Time startRealTime; 00098 long frameCount; 00099 00100 }; 00101 00102 00103 } // base 00104 00105 #endif