Changeset 2908 for code/branches/questsystem5/src/orxonox/gamestates
- Timestamp:
- Apr 8, 2009, 12:58:47 AM (16 years ago)
- Location:
- code/branches/questsystem5
- Files:
-
- 2 added
- 2 deleted
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/questsystem5
- Property svn:mergeinfo changed
-
code/branches/questsystem5/src/orxonox/gamestates/CMakeLists.txt
r2907 r2908 1 1 ADD_SOURCE_FILES(ORXONOX_SRC_FILES 2 GSDedicated.cc 2 3 GSClient.cc 3 GSDedicated.cc4 4 GSGraphics.cc 5 GSGUI.cc 5 6 GSIOConsole.cc 6 7 GSLevel.cc 7 GSMainMenu.cc8 8 GSRoot.cc 9 9 GSServer.cc -
code/branches/questsystem5/src/orxonox/gamestates/GSClient.cc
r2907 r2908 31 31 32 32 #include "core/input/InputManager.h" 33 #include "core/Clock.h"34 33 #include "core/CommandLine.h" 35 #include "core/Game.h" 36 #include "core/GameMode.h" 34 #include "core/Core.h" 37 35 #include "network/Client.h" 38 36 39 37 namespace orxonox 40 38 { 41 AddGameState(GSClient, "client");42 43 39 SetCommandLineArgument(ip, "127.0.0.1").information("#.#.#.#"); 44 40 45 GSClient::GSClient( const std::string& name)46 : GameState (name)41 GSClient::GSClient() 42 : GameState<GSGraphics>("client") 47 43 , client_(0) 48 44 { … … 53 49 } 54 50 55 void GSClient:: activate()51 void GSClient::enter() 56 52 { 57 GameMode::setIsClient(true);53 Core::setIsClient(true); 58 54 59 55 this->client_ = new Client(CommandLine::getValue("ip").getString(), CommandLine::getValue("port")); … … 62 58 ThrowException(InitialisationFailed, "Could not establish connection with server."); 63 59 64 client_->update(Game::getInstance().getGameClock()); 60 GSLevel::enter(this->getParent()->getViewport()); 61 62 client_->tick(0); 65 63 } 66 64 67 void GSClient:: deactivate()65 void GSClient::leave() 68 66 { 67 GSLevel::leave(); 68 69 69 client_->closeConnection(); 70 70 … … 72 72 delete this->client_; 73 73 74 GameMode::setIsClient(false);74 Core::setIsClient(false); 75 75 } 76 76 77 void GSClient:: update(const Clock& time)77 void GSClient::ticked(const Clock& time) 78 78 { 79 client_->update(time); 79 GSLevel::ticked(time); 80 client_->tick(time.getDeltaTime()); 81 82 this->tickChild(time); 80 83 } 81 84 } -
code/branches/questsystem5/src/orxonox/gamestates/GSClient.h
r2907 r2908 31 31 32 32 #include "OrxonoxPrereqs.h" 33 #include "core/GameState.h"34 33 #include "network/NetworkPrereqs.h" 34 #include "GSLevel.h" 35 #include "GSGraphics.h" 35 36 36 37 namespace orxonox 37 38 { 38 class _OrxonoxExport GSClient : public GameState 39 class _OrxonoxExport GSClient : public GameState<GSGraphics>, public GSLevel 39 40 { 40 41 public: 41 GSClient( const std::string& name);42 GSClient(); 42 43 ~GSClient(); 43 44 44 void activate();45 void deactivate();46 void update(const Clock& time);47 45 48 46 private: 47 void enter(); 48 void leave(); 49 void ticked(const Clock& time); 50 49 51 Client* client_; 50 52 }; -
code/branches/questsystem5/src/orxonox/gamestates/GSDedicated.cc
r2907 r2908 30 30 #include "GSDedicated.h" 31 31 32 #include "core/Clock.h"33 32 #include "core/CommandLine.h" 34 #include "core/Game.h" 35 #include "core/GameMode.h" 33 #include "core/Core.h" 36 34 #include "core/Iterator.h" 37 35 #include "network/Server.h" … … 41 39 namespace orxonox 42 40 { 43 AddGameState(GSDedicated, "dedicated"); 44 45 GSDedicated::GSDedicated(const std::string& name) 46 : GameState(name) 41 GSDedicated::GSDedicated() 42 : GameState<GSRoot>("dedicated") 47 43 , server_(0) 48 44 , timeSinceLastUpdate_(0) … … 54 50 } 55 51 56 void GSDedicated:: activate()52 void GSDedicated::enter() 57 53 { 58 GameMode::setHasServer(true);54 Core::setHasServer(true); 59 55 60 56 this->server_ = new Server(CommandLine::getValue("port")); 61 57 COUT(0) << "Loading scene in server mode" << std::endl; 62 58 59 GSLevel::enter(0); 60 63 61 server_->open(); 64 62 } 65 63 66 void GSDedicated:: deactivate()64 void GSDedicated::leave() 67 65 { 66 GSLevel::leave(); 67 68 68 this->server_->close(); 69 69 delete this->server_; 70 70 71 GameMode::setHasServer(false);71 Core::setHasServer(false); 72 72 } 73 73 74 void GSDedicated:: update(const Clock& time)74 void GSDedicated::ticked(const Clock& time) 75 75 { 76 76 // static float startTime = time.getSecondsPrecise(); … … 82 82 // COUT(0) << "estimated ticks/sec: " << nrOfTicks/(time.getSecondsPrecise()-startTime) << endl; 83 83 timeSinceLastUpdate_ -= static_cast<unsigned int>(timeSinceLastUpdate_ / NETWORK_PERIOD) * NETWORK_PERIOD; 84 server_->update(time); 84 GSLevel::ticked(time); 85 server_->tick(time.getDeltaTime()); 86 this->tickChild(time); 85 87 } 86 88 else -
code/branches/questsystem5/src/orxonox/gamestates/GSDedicated.h
r2907 r2908 31 31 32 32 #include "OrxonoxPrereqs.h" 33 #include "core/GameState.h"34 33 #include "network/NetworkPrereqs.h" 34 #include "GSLevel.h" 35 #include "GSRoot.h" 35 36 36 37 namespace orxonox 37 38 { 38 class _OrxonoxExport GSDedicated : public GameState 39 class _OrxonoxExport GSDedicated : public GameState<GSRoot>, public GSLevel 39 40 { 40 41 public: 41 GSDedicated( const std::string& name);42 GSDedicated(); 42 43 ~GSDedicated(); 43 44 44 void activate(); 45 void deactivate(); 46 void update(const Clock& time); 45 private: 46 void enter(); 47 void leave(); 48 void ticked(const Clock& time); 47 49 48 private: 49 Server* server_; 50 float timeSinceLastUpdate_; 50 Server* server_; 51 float timeSinceLastUpdate_; 51 52 }; 52 53 } -
code/branches/questsystem5/src/orxonox/gamestates/GSGraphics.cc
r2907 r2908 23 23 * Reto Grieder 24 24 * Co-authors: 25 * Benjamin Knecht 26 * 27 */ 28 29 /** 30 @file 31 @brief Implementation of Graphics GameState class. 25 * ... 26 * 32 27 */ 33 28 … … 35 30 #include "GSGraphics.h" 36 31 32 #include <fstream> 37 33 #include <boost/filesystem.hpp> 34 35 #include <OgreCompositorManager.h> 36 #include <OgreConfigFile.h> 37 #include <OgreFrameListener.h> 38 #include <OgreRoot.h> 39 #include <OgreLogManager.h> 40 #include <OgreException.h> 38 41 #include <OgreRenderWindow.h> 39 42 #include <OgreRenderSystem.h> 43 #include <OgreTextureManager.h> 44 #include <OgreViewport.h> 45 #include <OgreWindowEventUtilities.h> 46 47 #include "SpecialConfig.h" 40 48 #include "util/Debug.h" 49 #include "util/Exception.h" 50 #include "util/String.h" 51 #include "util/SubString.h" 52 #include "core/ConsoleCommand.h" 41 53 #include "core/ConfigValueIncludes.h" 42 #include "core/Clock.h" 43 #include "core/ConsoleCommand.h" 54 #include "core/CoreIncludes.h" 44 55 #include "core/Core.h" 45 #include "core/CoreIncludes.h"46 #include "core/Game.h"47 #include "core/GameMode.h"48 56 #include "core/input/InputManager.h" 49 57 #include "core/input/KeyBinder.h" 50 #include "core/input/ SimpleInputState.h"58 #include "core/input/ExtendedInputState.h" 51 59 #include "core/Loader.h" 52 60 #include "core/XMLFile.h" 53 61 #include "overlays/console/InGameConsole.h" 54 62 #include "gui/GUIManager.h" 55 #include "GraphicsManager.h" 63 #include "tools/WindowEventListener.h" 64 65 // for compatibility 66 #include "GraphicsEngine.h" 56 67 57 68 namespace orxonox 58 69 { 59 AddGameState(GSGraphics, "graphics"); 60 61 GSGraphics::GSGraphics(const std::string& name) 62 : GameState(name) 70 GSGraphics::GSGraphics() 71 : GameState<GSRoot>("graphics") 72 , renderWindow_(0) 73 , viewport_(0) 74 , bWindowEventListenerUpdateRequired_(false) 63 75 , inputManager_(0) 64 76 , console_(0) 65 77 , guiManager_(0) 66 , graphicsManager_(0) 78 , ogreRoot_(0) 79 , ogreLogger_(0) 80 , graphicsEngine_(0) 67 81 , masterKeyBinder_(0) 68 , masterInputState_(0)69 82 , debugOverlay_(0) 70 83 { 71 84 RegisterRootObject(GSGraphics); 85 setConfigValues(); 72 86 } 73 87 … … 76 90 } 77 91 78 /**79 @brief80 this function does nothing81 82 Indeed. Here goes nothing.83 */84 92 void GSGraphics::setConfigValues() 85 93 { 86 } 87 88 /** 89 @brief 90 This function is called when we enter this game state. 91 92 Since graphics is very important for our game this function does quite a lot: 93 \li starts graphics manager 94 \li loads debug overlay 95 \li manages render window 96 \li creates input manager 97 \li loads master key bindings 98 \li loads ingame console 99 \li loads GUI interface (GUIManager) 100 \li creates console command to toggle GUI 101 */ 102 void GSGraphics::activate() 103 { 104 GameMode::setShowsGraphics(true); 105 106 setConfigValues(); 107 108 // initialise graphics manager. Doesn't load the render window yet! 109 this->graphicsManager_ = new GraphicsManager(); 110 this->graphicsManager_->initialise(); 94 SetConfigValue(resourceFile_, "resources.cfg") 95 .description("Location of the resources file in the data path."); 96 SetConfigValue(ogreConfigFile_, "ogre.cfg") 97 .description("Location of the Ogre config file"); 98 SetConfigValue(ogrePluginsFolder_, ORXONOX_OGRE_PLUGINS_FOLDER) 99 .description("Folder where the Ogre plugins are located."); 100 SetConfigValue(ogrePlugins_, ORXONOX_OGRE_PLUGINS) 101 .description("Comma separated list of all plugins to load."); 102 SetConfigValue(ogreLogFile_, "ogre.log") 103 .description("Logfile for messages from Ogre. Use \"\" to suppress log file creation."); 104 SetConfigValue(ogreLogLevelTrivial_ , 5) 105 .description("Corresponding orxonox debug level for ogre Trivial"); 106 SetConfigValue(ogreLogLevelNormal_ , 4) 107 .description("Corresponding orxonox debug level for ogre Normal"); 108 SetConfigValue(ogreLogLevelCritical_, 2) 109 .description("Corresponding orxonox debug level for ogre Critical"); 110 } 111 112 void GSGraphics::enter() 113 { 114 Core::setShowsGraphics(true); 115 116 // initialise graphics engine. Doesn't load the render window yet! 117 graphicsEngine_ = new GraphicsEngine(); 118 119 // Ogre setup procedure 120 setupOgre(); 121 // load all the required plugins for Ogre 122 loadOgrePlugins(); 123 // read resource declaration file 124 this->declareResources(); 125 // Reads ogre config and creates the render window 126 this->loadRenderer(); 127 128 // TODO: Spread this so that this call only initialises things needed for the Console and GUI 129 this->initialiseResources(); 130 131 // We want to get informed whenever an object of type WindowEventListener is created 132 // in order to later update the window size. 133 bWindowEventListenerUpdateRequired_ = false; 134 RegisterConstructionCallback(GSGraphics, orxonox::WindowEventListener, requestWindowEventListenerUpdate); 111 135 112 136 // load debug overlay … … 115 139 Loader::open(debugOverlay_); 116 140 141 // Calls the InputManager which sets up the input devices. 117 142 // The render window width and height are used to set up the mouse movement. 143 inputManager_ = new InputManager(); 118 144 size_t windowHnd = 0; 119 Ogre::RenderWindow* renderWindow = GraphicsManager::getInstance().getRenderWindow(); 120 renderWindow->getCustomAttribute("WINDOW", &windowHnd); 121 122 // Calls the InputManager which sets up the input devices. 123 inputManager_ = new InputManager(); 124 inputManager_->initialise(windowHnd, renderWindow->getWidth(), renderWindow->getHeight(), true); 125 126 // load master key bindings 127 masterInputState_ = InputManager::getInstance().createInputState<SimpleInputState>("master", true); 145 this->renderWindow_->getCustomAttribute("WINDOW", &windowHnd); 146 inputManager_->initialise(windowHnd, renderWindow_->getWidth(), renderWindow_->getHeight(), true); 147 // Configure master input state with a KeyBinder 128 148 masterKeyBinder_ = new KeyBinder(); 129 149 masterKeyBinder_->loadBindings("masterKeybindings.ini"); 130 masterInputState_->setKeyHandler(masterKeyBinder_);150 inputManager_->getMasterInputState()->addKeyHandler(masterKeyBinder_); 131 151 132 152 // Load the InGameConsole 133 153 console_ = new InGameConsole(); 134 console_->initialise( renderWindow->getWidth(), renderWindow->getHeight());154 console_->initialise(this->renderWindow_->getWidth(), this->renderWindow_->getHeight()); 135 155 136 156 // load the CEGUI interface 137 157 guiManager_ = new GUIManager(); 138 guiManager_->initialise(renderWindow); 139 140 // add console command to toggle GUI 141 FunctorMember<GSGraphics>* functor = createFunctor(&GSGraphics::toggleGUI); 142 functor->setObject(this); 143 this->ccToggleGUI_ = createConsoleCommand(functor, "toggleGUI"); 144 CommandExecutor::addConsoleCommandShortcut(this->ccToggleGUI_); 145 146 // enable master input 147 InputManager::getInstance().requestEnterState("master"); 148 } 149 150 /** 151 @brief 152 This function is called when the game state is left 153 154 Created references, input states and console commands are deleted. 155 */ 156 void GSGraphics::deactivate() 157 { 158 159 if (this->ccToggleGUI_) 160 { 161 delete this->ccToggleGUI_; 162 this->ccToggleGUI_ = 0; 163 } 164 165 masterInputState_->setHandler(0); 166 InputManager::getInstance().requestDestroyState("master"); 158 guiManager_->initialise(this->renderWindow_); 159 160 // add console commands 161 FunctorMember<GSGraphics>* functor1 = createFunctor(&GSGraphics::printScreen); 162 functor1->setObject(this); 163 ccPrintScreen_ = createConsoleCommand(functor1, "printScreen"); 164 CommandExecutor::addConsoleCommandShortcut(ccPrintScreen_); 165 } 166 167 void GSGraphics::leave() 168 { 169 using namespace Ogre; 170 171 delete this->ccPrintScreen_; 172 173 // remove our WindowEventListener first to avoid bad calls after the window has been destroyed 174 Ogre::WindowEventUtilities::removeWindowEventListener(this->renderWindow_, this); 175 176 delete this->guiManager_; 177 178 delete this->console_; 179 180 //inputManager_->getMasterInputState()->removeKeyHandler(this->masterKeyBinder_); 167 181 delete this->masterKeyBinder_; 168 169 delete this->guiManager_; 170 delete this->console_; 182 delete this->inputManager_; 171 183 172 184 Loader::unload(this->debugOverlay_); 173 185 delete this->debugOverlay_; 174 186 175 delete this->inputManager_; 176 this->inputManager_ = 0; 177 178 delete graphicsManager_; 179 180 GameMode::setShowsGraphics(false); 181 } 182 183 /** 184 @brief 185 Toggles the visibility of the current GUI 186 187 This function just executes a Lua function in the main script of the GUI by accessing the GUIManager. 188 For more details on this function check out the Lua code. 189 */ 190 void GSGraphics::toggleGUI() 191 { 192 GUIManager::getInstance().executeCode("toggleGUI()"); 187 // unload all compositors 188 Ogre::CompositorManager::getSingleton().removeAll(); 189 190 // destroy render window 191 RenderSystem* renderer = this->ogreRoot_->getRenderSystem(); 192 renderer->destroyRenderWindow("Orxonox"); 193 194 /*** CODE SNIPPET, UNUSED ***/ 195 // Does the opposite of initialise() 196 //ogreRoot_->shutdown(); 197 // Remove all resources and resource groups 198 //StringVector groups = ResourceGroupManager::getSingleton().getResourceGroups(); 199 //for (StringVector::iterator it = groups.begin(); it != groups.end(); ++it) 200 //{ 201 // ResourceGroupManager::getSingleton().destroyResourceGroup(*it); 202 //} 203 204 //ParticleSystemManager::getSingleton().removeAllTemplates(); 205 206 // Shutdown the render system 207 //this->ogreRoot_->setRenderSystem(0); 208 209 delete this->ogreRoot_; 210 211 // delete the ogre log and the logManager (since we have created it). 212 this->ogreLogger_->getDefaultLog()->removeListener(this); 213 this->ogreLogger_->destroyLog(Ogre::LogManager::getSingleton().getDefaultLog()); 214 delete this->ogreLogger_; 215 216 delete graphicsEngine_; 217 218 Core::setShowsGraphics(false); 193 219 } 194 220 … … 201 227 need the time. So we shouldn't run into problems. 202 228 */ 203 void GSGraphics::update(const Clock& time) 204 { 205 if (this->getActivity().topState) 206 { 207 // This state can not 'survive' on its own. 208 // Load a user interface therefore 209 Game::getInstance().requestState("mainMenu"); 210 } 211 229 void GSGraphics::ticked(const Clock& time) 230 { 212 231 uint64_t timeBeforeTick = time.getRealMicroseconds(); 213 232 214 this->inputManager_->update(time); // tick console 215 this->console_->update(time); 216 this->guiManager_->update(time); 233 float dt = time.getDeltaTime(); 234 235 this->inputManager_->tick(dt); 236 // tick console 237 this->console_->tick(dt); 238 this->tickChild(time); 239 240 if (this->bWindowEventListenerUpdateRequired_) 241 { 242 // Update all WindowEventListeners for the case a new one was created. 243 this->windowResized(this->renderWindow_); 244 this->bWindowEventListenerUpdateRequired_ = false; 245 } 217 246 218 247 uint64_t timeAfterTick = time.getRealMicroseconds(); 219 248 220 // Also add our tick time 221 Game::getInstance().addTickTime(timeAfterTick - timeBeforeTick); 222 223 // Render 224 this->graphicsManager_->update(time); 249 // Also add our tick time to the list in GSRoot 250 this->getParent()->addTickTime(timeAfterTick - timeBeforeTick); 251 252 // Update statistics overlay. Note that the values only change periodically in GSRoot. 253 GraphicsEngine::getInstance().setAverageFramesPerSecond(this->getParent()->getAvgFPS()); 254 GraphicsEngine::getInstance().setAverageTickTime(this->getParent()->getAvgTickTime()); 255 256 // don't forget to call _fireFrameStarted in ogre to make sure 257 // everything goes smoothly 258 Ogre::FrameEvent evt; 259 evt.timeSinceLastFrame = dt; 260 evt.timeSinceLastEvent = dt; // note: same time, but shouldn't matter anyway 261 ogreRoot_->_fireFrameStarted(evt); 262 263 // Pump messages in all registered RenderWindows 264 // This calls the WindowEventListener objects. 265 Ogre::WindowEventUtilities::messagePump(); 266 // make sure the window stays active even when not focused 267 // (probably only necessary on windows) 268 this->renderWindow_->setActive(true); 269 270 // render 271 ogreRoot_->_updateAllRenderTargets(); 272 273 // again, just to be sure ogre works fine 274 ogreRoot_->_fireFrameEnded(evt); // note: uses the same time as _fireFrameStarted 275 } 276 277 /** 278 @brief 279 Creates the Ogre Root object and sets up the ogre log. 280 */ 281 void GSGraphics::setupOgre() 282 { 283 COUT(3) << "Setting up Ogre..." << std::endl; 284 285 if (ogreConfigFile_ == "") 286 { 287 COUT(2) << "Warning: Ogre config file set to \"\". Defaulting to config.cfg" << std::endl; 288 ModifyConfigValue(ogreConfigFile_, tset, "config.cfg"); 289 } 290 if (ogreLogFile_ == "") 291 { 292 COUT(2) << "Warning: Ogre log file set to \"\". Defaulting to ogre.log" << std::endl; 293 ModifyConfigValue(ogreLogFile_, tset, "ogre.log"); 294 } 295 296 boost::filesystem::path ogreConfigFilepath(Core::getConfigPath() / this->ogreConfigFile_); 297 boost::filesystem::path ogreLogFilepath(Core::getLogPath() / this->ogreLogFile_); 298 299 // create a new logManager 300 // Ogre::Root will detect that we've already created a Log 301 ogreLogger_ = new Ogre::LogManager(); 302 COUT(4) << "Ogre LogManager created" << std::endl; 303 304 // create our own log that we can listen to 305 Ogre::Log *myLog; 306 myLog = ogreLogger_->createLog(ogreLogFilepath.string(), true, false, false); 307 COUT(4) << "Ogre Log created" << std::endl; 308 309 myLog->setLogDetail(Ogre::LL_BOREME); 310 myLog->addListener(this); 311 312 COUT(4) << "Creating Ogre Root..." << std::endl; 313 314 // check for config file existence because Ogre displays (caught) exceptions if not 315 if (!boost::filesystem::exists(ogreConfigFilepath)) 316 { 317 // create a zero sized file 318 std::ofstream creator; 319 creator.open(ogreConfigFilepath.string().c_str()); 320 creator.close(); 321 } 322 323 // Leave plugins file empty. We're going to do that part manually later 324 ogreRoot_ = new Ogre::Root("", ogreConfigFilepath.string(), ogreLogFilepath.string()); 325 326 COUT(3) << "Ogre set up done." << std::endl; 327 } 328 329 void GSGraphics::loadOgrePlugins() 330 { 331 // just to make sure the next statement doesn't segfault 332 if (ogrePluginsFolder_ == "") 333 ogrePluginsFolder_ = "."; 334 335 boost::filesystem::path folder(ogrePluginsFolder_); 336 // Do some SubString magic to get the comma separated list of plugins 337 SubString plugins(ogrePlugins_, ",", " ", false, 92, false, 34, false, 40, 41, false, '\0'); 338 // Use backslash paths on Windows! file_string() already does that though. 339 for (unsigned int i = 0; i < plugins.size(); ++i) 340 ogreRoot_->loadPlugin((folder / plugins[i]).file_string()); 341 } 342 343 void GSGraphics::declareResources() 344 { 345 CCOUT(4) << "Declaring Resources" << std::endl; 346 //TODO: Specify layout of data file and maybe use xml-loader 347 //TODO: Work with ressource groups (should be generated by a special loader) 348 349 if (resourceFile_ == "") 350 { 351 COUT(2) << "Warning: Ogre resource file set to \"\". Defaulting to resources.cfg" << std::endl; 352 ModifyConfigValue(resourceFile_, tset, "resources.cfg"); 353 } 354 355 // Load resource paths from data file using configfile ressource type 356 Ogre::ConfigFile cf; 357 try 358 { 359 cf.load((Core::getMediaPath() / resourceFile_).string()); 360 } 361 catch (...) 362 { 363 //COUT(1) << ex.getFullDescription() << std::endl; 364 COUT(0) << "Have you forgotten to set the data path in orxnox.ini?" << std::endl; 365 throw; 366 } 367 368 // Go through all sections & settings in the file 369 Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator(); 370 371 std::string secName, typeName, archName; 372 while (seci.hasMoreElements()) 373 { 374 try 375 { 376 secName = seci.peekNextKey(); 377 Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext(); 378 Ogre::ConfigFile::SettingsMultiMap::iterator i; 379 for (i = settings->begin(); i != settings->end(); ++i) 380 { 381 typeName = i->first; // for instance "FileSystem" or "Zip" 382 archName = i->second; // name (and location) of archive 383 384 Ogre::ResourceGroupManager::getSingleton().addResourceLocation( 385 (Core::getMediaPath() / archName).string(), typeName, secName); 386 } 387 } 388 catch (Ogre::Exception& ex) 389 { 390 COUT(1) << ex.getFullDescription() << std::endl; 391 } 392 } 393 } 394 395 void GSGraphics::loadRenderer() 396 { 397 CCOUT(4) << "Configuring Renderer" << std::endl; 398 399 if (!ogreRoot_->restoreConfig()) 400 if (!ogreRoot_->showConfigDialog()) 401 ThrowException(InitialisationFailed, "Could not show Ogre configuration dialogue."); 402 403 CCOUT(4) << "Creating render window" << std::endl; 404 405 this->renderWindow_ = ogreRoot_->initialise(true, "Orxonox"); 406 407 Ogre::WindowEventUtilities::addWindowEventListener(this->renderWindow_, this); 408 409 Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(0); 410 411 // create a full screen default viewport 412 this->viewport_ = this->renderWindow_->addViewport(0, 0); 413 414 if (this->graphicsEngine_) 415 this->graphicsEngine_->setViewport(this->viewport_); 416 } 417 418 void GSGraphics::initialiseResources() 419 { 420 CCOUT(4) << "Initialising resources" << std::endl; 421 //TODO: Do NOT load all the groups, why are we doing that? And do we really do that? initialise != load... 422 //try 423 //{ 424 Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); 425 /*Ogre::StringVector str = Ogre::ResourceGroupManager::getSingleton().getResourceGroups(); 426 for (unsigned int i = 0; i < str.size(); i++) 427 { 428 Ogre::ResourceGroupManager::getSingleton().loadResourceGroup(str[i]); 429 }*/ 430 //} 431 //catch (...) 432 //{ 433 // CCOUT(2) << "Error: There was a serious error when initialising the resources." << std::endl; 434 // throw; 435 //} 436 } 437 438 /** 439 @brief 440 Method called by the LogListener interface from Ogre. 441 We use it to capture Ogre log messages and handle it ourselves. 442 @param message 443 The message to be logged 444 @param lml 445 The message level the log is using 446 @param maskDebug 447 If we are printing to the console or not 448 @param logName 449 The name of this log (so you can have several listeners 450 for different logs, and identify them) 451 */ 452 void GSGraphics::messageLogged(const std::string& message, 453 Ogre::LogMessageLevel lml, bool maskDebug, const std::string& logName) 454 { 455 int orxonoxLevel; 456 switch (lml) 457 { 458 case Ogre::LML_TRIVIAL: 459 orxonoxLevel = this->ogreLogLevelTrivial_; 460 break; 461 case Ogre::LML_NORMAL: 462 orxonoxLevel = this->ogreLogLevelNormal_; 463 break; 464 case Ogre::LML_CRITICAL: 465 orxonoxLevel = this->ogreLogLevelCritical_; 466 break; 467 default: 468 orxonoxLevel = 0; 469 } 470 OutputHandler::getOutStream().setOutputLevel(orxonoxLevel) 471 << "Ogre: " << message << std::endl; 472 } 473 474 /** 475 @brief 476 Window has moved. 477 @param rw 478 The render window it occured in 479 */ 480 void GSGraphics::windowMoved(Ogre::RenderWindow *rw) 481 { 482 for (ObjectList<orxonox::WindowEventListener>::iterator it = ObjectList<orxonox::WindowEventListener>::begin(); it; ++it) 483 it->windowMoved(); 225 484 } 226 485 … … 231 490 The render window it occured in 232 491 @note 233 Graphics Managerhas a render window stored itself. This is the same492 GraphicsEngine has a render window stored itself. This is the same 234 493 as rw. But we have to be careful when using multiple render windows! 235 494 */ 236 void GSGraphics::windowResized(unsigned int newWidth, unsigned int newHeight) 237 { 495 void GSGraphics::windowResized(Ogre::RenderWindow *rw) 496 { 497 for (ObjectList<orxonox::WindowEventListener>::iterator it = ObjectList<orxonox::WindowEventListener>::begin(); it; ++it) 498 it->windowResized(this->renderWindow_->getWidth(), this->renderWindow_->getHeight()); 499 238 500 // OIS needs this under linux even if we only use relative input measurement. 239 501 if (this->inputManager_) 240 this->inputManager_->setWindowExtents( newWidth, newHeight);502 this->inputManager_->setWindowExtents(renderWindow_->getWidth(), renderWindow_->getHeight()); 241 503 } 242 504 … … 247 509 The render window it occured in 248 510 */ 249 void GSGraphics::windowFocusChanged() 250 { 511 void GSGraphics::windowFocusChange(Ogre::RenderWindow *rw) 512 { 513 for (ObjectList<orxonox::WindowEventListener>::iterator it = ObjectList<orxonox::WindowEventListener>::begin(); it; ++it) 514 it->windowFocusChanged(); 515 251 516 // instruct InputManager to clear the buffers (core library so we cannot use the interface) 252 517 if (this->inputManager_) … … 254 519 } 255 520 521 /** 522 @brief 523 Window was closed. 524 @param rw 525 The render window it occured in 526 */ 527 void GSGraphics::windowClosed(Ogre::RenderWindow *rw) 528 { 529 this->requestState("root"); 530 } 531 532 void GSGraphics::printScreen() 533 { 534 if (this->renderWindow_) 535 { 536 this->renderWindow_->writeContentsToTimestampedFile("shot_", ".jpg"); 537 } 538 } 256 539 } -
code/branches/questsystem5/src/orxonox/gamestates/GSGraphics.h
r2907 r2908 23 23 * Reto Grieder 24 24 * Co-authors: 25 * Benjamin Knecht (documentation)25 * ... 26 26 * 27 27 */ 28 29 /**30 @file31 @brief Declaration of the Graphics GameState class.32 */33 28 34 29 #ifndef _GSGraphics_H__ … … 36 31 37 32 #include "OrxonoxPrereqs.h" 33 #include <OgrePrerequisites.h> 34 #define NOMINMAX // required to stop windows.h screwing up std::min definition 35 #include <OgreWindowEventUtilities.h> 38 36 #include "core/GameState.h" 39 #include "tools/WindowEventListener.h" 37 #include "core/OrxonoxClass.h" 38 #include "GSRoot.h" 40 39 41 40 namespace orxonox 42 41 { 43 /**44 @class GSGraphics45 @brief46 Game state used when displaying graphics of any kind42 class _OrxonoxExport GSGraphics : public GameState<GSRoot>, public OrxonoxClass, 43 public Ogre::WindowEventListener, public Ogre::LogListener 44 { 45 friend class ClassIdentifier<GSGraphics>; 47 46 48 This game state is only left out if we start a dedicated server where no graphics are present.49 */50 class _OrxonoxExport GSGraphics : public GameState, public WindowEventListener51 {52 47 public: 53 GSGraphics( const std::string& name);48 GSGraphics(); 54 49 ~GSGraphics(); 50 51 Ogre::Root* getOgreRoot() { return this->ogreRoot_ ; } 52 Ogre::Viewport* getViewport() { return this->viewport_ ; } 53 GUIManager* getGUIManager() { return this->guiManager_; } 54 55 private: // functions 56 void enter(); 57 void leave(); 58 void ticked(const Clock& time); 59 55 60 void setConfigValues(); 56 61 57 void activate(); 58 void deactivate(); 59 void update(const Clock& time); 62 void setupOgre(); 63 void loadOgrePlugins(); 64 void declareResources(); 65 void loadRenderer(); 66 void initialiseResources(); 60 67 61 void toggleGUI(); 68 // console commands 69 void printScreen(); 62 70 63 private: 64 // Window events from WindowEventListener 65 void windowResized(unsigned int newWidth, unsigned int newHeight); 66 void windowFocusChanged(); 71 // event from Ogre::LogListener 72 void messageLogged(const std::string& message, Ogre::LogMessageLevel lml, 73 bool maskDebug, const std::string& logName); 74 75 // window events from Ogre::WindowEventListener 76 void windowMoved (Ogre::RenderWindow* rw); 77 void windowResized (Ogre::RenderWindow* rw); 78 void windowFocusChange (Ogre::RenderWindow* rw); 79 void windowClosed (Ogre::RenderWindow* rw); 80 81 void requestWindowEventListenerUpdate() { this->bWindowEventListenerUpdateRequired_ = true; } 82 83 private: // variables 84 Ogre::RenderWindow* renderWindow_; //!< the current render window 85 Ogre::Viewport* viewport_; //!< default full size viewport 86 bool bWindowEventListenerUpdateRequired_; //!< True if a new WindowEventListener was created but not yet updated. 67 87 68 88 // managed singletons 69 InputManager* inputManager_; //!< Reference to input management89 InputManager* inputManager_; 70 90 InGameConsole* console_; 71 GUIManager* guiManager_; //!< Interface to GUI 72 GraphicsManager* graphicsManager_; //!< Interface to Ogre 91 GUIManager* guiManager_; 92 Ogre::Root* ogreRoot_; //!< Ogre's root 93 Ogre::LogManager* ogreLogger_; 94 GraphicsEngine* graphicsEngine_; //!< Interface to Ogre 73 95 74 KeyBinder* masterKeyBinder_; //!< Key binder for master key bindings 75 SimpleInputState* masterInputState_; //!< Special input state for master input 96 KeyBinder* masterKeyBinder_; 76 97 XMLFile* debugOverlay_; 77 ConsoleCommand* ccToggleGUI_; //!< Console command to toggle GUI 98 99 // config values 100 std::string resourceFile_; //!< resources file name 101 std::string ogreConfigFile_; //!< ogre config file name 102 std::string ogrePluginsFolder_; //!< Folder where the Ogre plugins are located 103 std::string ogrePlugins_; //!< Comma separated list of all plugins to load 104 std::string ogreLogFile_; //!< log file name for Ogre log messages 105 int ogreLogLevelTrivial_; //!< Corresponding Orxonx debug level for LL_TRIVIAL 106 int ogreLogLevelNormal_; //!< Corresponding Orxonx debug level for LL_NORMAL 107 int ogreLogLevelCritical_; //!< Corresponding Orxonx debug level for LL_CRITICAL 108 109 // console commands 110 ConsoleCommand* ccPrintScreen_; 78 111 }; 79 112 } -
code/branches/questsystem5/src/orxonox/gamestates/GSIOConsole.cc
r2907 r2908 36 36 37 37 #include "core/ConsoleCommand.h" 38 #include "core/Game.h"39 38 40 39 namespace orxonox 41 40 { 42 AddGameState(GSIOConsole, "ioConsole"); 43 44 GSIOConsole::GSIOConsole(const std::string& name) 45 : GameState(name) 41 GSIOConsole::GSIOConsole() 42 : GameState<GSRoot>("ioConsole") 46 43 { 47 44 } … … 51 48 } 52 49 53 void GSIOConsole:: activate()50 void GSIOConsole::enter() 54 51 { 55 {56 FunctorMember<GSIOConsole>* functor = createFunctor(&GSIOConsole::loadMenu);57 functor->setObject(this);58 this->ccLoadMenu_ = createConsoleCommand(functor, "loadMenu");59 CommandExecutor::addConsoleCommandShortcut(this->ccLoadMenu_);60 }61 52 } 62 53 63 void GSIOConsole:: deactivate()54 void GSIOConsole::leave() 64 55 { 65 if (this->ccLoadMenu_)66 {67 delete this->ccLoadMenu_;68 this->ccLoadMenu_ = 0;69 }70 56 } 71 57 72 void GSIOConsole:: update(const Clock& time)58 void GSIOConsole::ticked(const Clock& time) 73 59 { 74 std::cout << ">";75 60 std::string command; 76 61 std::getline(std::cin, command); 77 62 CommandExecutor::execute(command, true); 78 } 79 80 void GSIOConsole::loadMenu() 81 { 82 Game::getInstance().popState(); 83 Game::getInstance().requestStates("graphics, mainMenu"); 63 64 tickChild(time); 84 65 } 85 66 } -
code/branches/questsystem5/src/orxonox/gamestates/GSIOConsole.h
r2907 r2908 31 31 32 32 #include "OrxonoxPrereqs.h" 33 #include <OgrePrerequisites.h> 33 34 #include "core/GameState.h" 35 #include "GSRoot.h" 34 36 35 37 namespace orxonox 36 38 { 37 class _OrxonoxExport GSIOConsole : public GameState 39 class _OrxonoxExport GSIOConsole : public GameState<GSRoot> 38 40 { 39 41 public: 40 GSIOConsole( const std::string& name);42 GSIOConsole(); 41 43 ~GSIOConsole(); 42 44 43 void activate();44 void deactivate();45 void update(const Clock& time);46 47 45 private: 48 void loadMenu(); 49 50 // console commands 51 ConsoleCommand* ccLoadMenu_; 46 void enter(); 47 void leave(); 48 void ticked(const Clock& time); 52 49 }; 53 50 } -
code/branches/questsystem5/src/orxonox/gamestates/GSLevel.cc
r2907 r2908 24 24 * Co-authors: 25 25 * Fabian 'x3n' Landau 26 * Benjamin Knecht27 26 * 28 27 */ … … 40 39 #include "core/CommandLine.h" 41 40 #include "core/ConfigValueIncludes.h" 41 #include "core/CoreIncludes.h" 42 42 #include "core/Core.h" 43 #include "core/CoreIncludes.h"44 #include "core/Game.h"45 #include "core/GameMode.h"46 43 #include "objects/Tickable.h" 47 44 #include "objects/Radar.h" 48 45 #include "CameraManager.h" 49 #include "GraphicsManager.h"50 46 #include "LevelManager.h" 51 47 #include "PlayerManager.h" 52 #include "orxonox/objects/quest/QuestManager.h" 53 #include "orxonox/overlays/notifications/NotificationManager.h" 54 #include "gui/GUIManager.h" 48 #include "objects/quest/QuestManager.h" 49 #include "overlays/notifications/NotificationManager.h" 55 50 56 51 namespace orxonox 57 52 { 58 AddGameState(GSLevel, "level"); 59 60 SetCommandLineArgument(level, "presentation_dm.oxw").shortcut("l"); 61 SetConsoleCommand(GSLevel, showIngameGUI, true); 62 63 GSLevel::GSLevel(const std::string& name) 64 : GameState(name) 65 , keyBinder_(0) 66 , gameInputState_(0) 67 , guiMouseOnlyInputState_(0) 68 , guiKeysOnlyInputState_(0) 53 SetCommandLineArgument(level, "presentation.oxw").shortcut("l"); 54 55 GSLevel::GSLevel() 56 // : GameState<GSGraphics>(name) 57 : keyBinder_(0) 58 , inputState_(0) 69 59 , radar_(0) 70 60 , startFile_(0) … … 76 66 this->ccKeybind_ = 0; 77 67 this->ccTkeybind_ = 0; 68 69 setConfigValues(); 78 70 } 79 71 … … 87 79 } 88 80 89 void GSLevel::activate() 90 { 91 setConfigValues(); 92 93 if (GameMode::showsGraphics()) 94 { 95 gameInputState_ = InputManager::getInstance().createInputState<SimpleInputState>("game"); 81 void GSLevel::enter(Ogre::Viewport* viewport) 82 { 83 if (Core::showsGraphics()) 84 { 85 inputState_ = InputManager::getInstance().createInputState<SimpleInputState>("game", 20); 96 86 keyBinder_ = new KeyBinder(); 97 87 keyBinder_->loadBindings("keybindings.ini"); 98 gameInputState_->setHandler(keyBinder_); 99 100 guiMouseOnlyInputState_ = InputManager::getInstance().createInputState<SimpleInputState>("guiMouseOnly"); 101 guiMouseOnlyInputState_->setMouseHandler(GUIManager::getInstancePtr()); 102 103 guiKeysOnlyInputState_ = InputManager::getInstance().createInputState<SimpleInputState>("guiKeysOnly"); 104 guiKeysOnlyInputState_->setKeyHandler(GUIManager::getInstancePtr()); 88 inputState_->setHandler(keyBinder_); 105 89 106 90 // create the global CameraManager 107 this->cameraManager_ = new CameraManager(GraphicsManager::getInstance().getViewport()); 91 assert(viewport); 92 this->cameraManager_ = new CameraManager(viewport); 108 93 109 94 // Start the Radar … … 117 102 this->notificationManager_ = new NotificationManager(); 118 103 119 if ( GameMode::isMaster())104 if (Core::isMaster()) 120 105 { 121 106 // create the global LevelManager … … 125 110 } 126 111 127 if (GameMode::showsGraphics()) 128 { 112 if (Core::showsGraphics()) 113 { 114 // TODO: insert slomo console command with 115 // .accessLevel(AccessLevel::Offline).defaultValue(0, 1.0).axisParamIndex(0).isAxisRelative(false); 116 129 117 // keybind console command 130 118 FunctorMember<GSLevel>* functor1 = createFunctor(&GSLevel::keybind); … … 144 132 } 145 133 146 void GSLevel::showIngameGUI(bool show) 147 { 148 if (show) 149 { 150 GUIManager::getInstancePtr()->showGUI("inGameTest"); 151 GUIManager::getInstancePtr()->executeCode("showCursor()"); 152 InputManager::getInstance().requestEnterState("guiMouseOnly"); 153 } 154 else 155 { 156 GUIManager::getInstancePtr()->executeCode("hideGUI(\"inGameTest\")"); 157 GUIManager::getInstancePtr()->executeCode("hideCursor()"); 158 InputManager::getInstance().requestLeaveState("guiMouseOnly"); 159 } 160 } 161 162 void GSLevel::deactivate() 134 void GSLevel::leave() 163 135 { 164 136 // destroy console commands … … 173 145 this->ccTkeybind_ = 0; 174 146 } 175 176 147 177 148 // this call will delete every BaseObject! … … 181 152 //Loader::close(); 182 153 183 if ( GameMode::showsGraphics())154 if (Core::showsGraphics()) 184 155 InputManager::getInstance().requestLeaveState("game"); 185 156 186 if ( GameMode::isMaster())157 if (Core::isMaster()) 187 158 this->unloadLevel(); 188 159 … … 223 194 } 224 195 225 if (GameMode::showsGraphics()) 226 { 227 gameInputState_->setHandler(0); 228 guiMouseOnlyInputState_->setHandler(0); 229 guiKeysOnlyInputState_->setHandler(0); 196 if (Core::showsGraphics()) 197 { 198 inputState_->setHandler(0); 230 199 InputManager::getInstance().requestDestroyState("game"); 231 200 if (this->keyBinder_) … … 237 206 } 238 207 239 void GSLevel:: update(const Clock& time)240 { 241 // Note: Temporarily moved to GSGraphics.208 void GSLevel::ticked(const Clock& time) 209 { 210 // Commented by 1337: Temporarily moved to GSGraphics. 242 211 //// Call the scene objects 243 212 //for (ObjectList<Tickable>::iterator it = ObjectList<Tickable>::begin(); it; ++it) … … 282 251 Command string that can be executed by the CommandExecutor 283 252 OR: Internal string "KeybindBindingStringKeyName=" used for the second call to identify 284 the key/button/axis that has been activated. This is configured above in activate().253 the key/button/axis that has been activated. This is configured above in enter(). 285 254 */ 286 255 void GSLevel::keybindInternal(const std::string& command, bool bTemporary) 287 256 { 288 if ( GameMode::showsGraphics())257 if (Core::showsGraphics()) 289 258 { 290 259 static std::string bindingString = ""; -
code/branches/questsystem5/src/orxonox/gamestates/GSLevel.h
r2907 r2908 23 23 * Reto Grieder 24 24 * Co-authors: 25 * Benjamin Knecht25 * ... 26 26 * 27 27 */ … … 31 31 32 32 #include "OrxonoxPrereqs.h" 33 #include <OgrePrerequisites.h> 33 34 #include "core/OrxonoxClass.h" 34 #include "core/GameState.h"35 35 36 36 namespace orxonox 37 37 { 38 class _OrxonoxExport GSLevel : public GameState, publicOrxonoxClass38 class _OrxonoxExport GSLevel : public OrxonoxClass 39 39 { 40 friend class ClassIdentifier<GSLevel>; 40 41 public: 41 GSLevel( const std::string& name);42 GSLevel(); 42 43 ~GSLevel(); 43 void setConfigValues();44 45 void activate();46 void deactivate();47 void update(const Clock& time);48 49 static void showIngameGUI(bool show);50 44 51 45 protected: 46 void enter(Ogre::Viewport* viewport); 47 void leave(); 48 void ticked(const Clock& time); 49 52 50 void loadLevel(); 53 51 void unloadLevel(); … … 58 56 void keybindInternal(const std::string& command, bool bTemporary); 59 57 60 KeyBinder* keyBinder_; //!< tool that loads and manages the input bindings 61 SimpleInputState* gameInputState_; //!< input state for normal ingame playing 62 SimpleInputState* guiMouseOnlyInputState_; //!< input state if we only need the mouse to use the GUI 63 SimpleInputState* guiKeysOnlyInputState_; //!< input state if we only need the keys to use the GUI 64 Radar* radar_; //!< represents the Radar (not the HUD part) 65 XMLFile* startFile_; //!< current hard coded default level 66 CameraManager* cameraManager_; //!< camera manager for this level 67 LevelManager* levelManager_; //!< global level manager 68 PlayerManager* playerManager_; //!< player manager for this level 69 QuestManager* questManager_; //!< quest manager for this level 70 NotificationManager* notificationManager_; //!< notification manager for this level 58 KeyBinder* keyBinder_; //!< tool that loads and manages the input bindings 59 SimpleInputState* inputState_; 60 Radar* radar_; //!< represents the Radar (not the HUD part) 61 XMLFile* startFile_; //!< current hard coded default level 62 CameraManager* cameraManager_; 63 LevelManager* levelManager_; 64 PlayerManager* playerManager_; 65 QuestManager* questManager_; 66 NotificationManager* notificationManager_; 71 67 72 68 //##### ConfigValues ##### … … 76 72 ConsoleCommand* ccKeybind_; 77 73 ConsoleCommand* ccTkeybind_; 74 75 private: 76 void setConfigValues(); 77 78 78 }; 79 79 } -
code/branches/questsystem5/src/orxonox/gamestates/GSRoot.cc
r2907 r2908 32 32 #include "util/Exception.h" 33 33 #include "util/Debug.h" 34 #include "core/Clock.h" 35 #include "core/Game.h" 36 #include "core/GameMode.h" 34 #include "core/Core.h" 35 #include "core/Factory.h" 36 #include "core/ConfigValueIncludes.h" 37 #include "core/CoreIncludes.h" 38 #include "core/ConsoleCommand.h" 37 39 #include "core/CommandLine.h" 38 #include "core/ConsoleCommand.h" 39 #include "tools/TimeFactorListener.h" 40 #include "core/Shell.h" 41 #include "core/TclBind.h" 42 #include "core/TclThreadManager.h" 43 #include "core/LuaBind.h" 40 44 #include "tools/Timer.h" 41 45 #include "objects/Tickable.h" 42 46 47 #ifdef ORXONOX_PLATFORM_WINDOWS 48 # ifndef WIN32_LEAN_AND_MEAN 49 # define WIN32_LEAN_AND_MEAN 50 # endif 51 # define NOMINMAX // required to stop windows.h screwing up std::min definition 52 # include "windows.h" 53 #endif 54 43 55 namespace orxonox 44 56 { 45 AddGameState(GSRoot, "root"); 46 SetCommandLineSwitch(console); 47 // Shortcuts for easy direct loading 48 SetCommandLineSwitch(server); 49 SetCommandLineSwitch(client); 50 SetCommandLineSwitch(dedicated); 51 SetCommandLineSwitch(standalone); 52 53 GSRoot::GSRoot(const std::string& name) 54 : GameState(name) 57 SetCommandLineArgument(limitToCPU, 1).information("0: off | #cpu"); 58 59 GSRoot::GSRoot() 60 : RootGameState("root") 55 61 , timeFactor_(1.0f) 56 62 , bPaused_(false) 57 63 , timeFactorPauseBackup_(1.0f) 58 { 64 , tclBind_(0) 65 , tclThreadManager_(0) 66 , shell_(0) 67 { 68 RegisterRootObject(GSRoot); 69 setConfigValues(); 70 59 71 this->ccSetTimeFactor_ = 0; 60 72 this->ccPause_ = 0; … … 65 77 } 66 78 67 void GSRoot::activate() 68 { 79 void GSRoot::setConfigValues() 80 { 81 SetConfigValue(statisticsRefreshCycle_, 250000) 82 .description("Sets the time in microseconds interval at which average fps, etc. get updated."); 83 SetConfigValue(statisticsAvgLength_, 1000000) 84 .description("Sets the time in microseconds interval at which average fps, etc. gets calculated."); 85 } 86 87 void GSRoot::enter() 88 { 89 // creates the class hierarchy for all classes with factories 90 Factory::createClassHierarchy(); 91 69 92 // reset game speed to normal 70 this->timeFactor_ = 1.0f; 93 timeFactor_ = 1.0f; 94 95 // reset frame counter 96 this->statisticsStartTime_ = 0; 97 this->statisticsTickTimes_.clear(); 98 this->periodTickTime_ = 0; 99 this->avgFPS_ = 0.0f; 100 this->avgTickTime_ = 0.0f; 101 102 // Create the lua interface 103 this->luaBind_ = new LuaBind(); 104 105 // initialise TCL 106 this->tclBind_ = new TclBind(Core::getMediaPathString()); 107 this->tclThreadManager_ = new TclThreadManager(tclBind_->getTclInterpreter()); 108 109 // create a shell 110 this->shell_ = new Shell(); 111 112 // limit the main thread to the first core so that QueryPerformanceCounter doesn't jump 113 // do this after ogre has initialised. Somehow Ogre changes the settings again (not through 114 // the timer though). 115 int limitToCPU = CommandLine::getValue("limitToCPU"); 116 if (limitToCPU > 0) 117 setThreadAffinity((unsigned int)(limitToCPU - 1)); 118 119 { 120 // add console commands 121 FunctorMember<GSRoot>* functor = createFunctor(&GSRoot::exitGame); 122 functor->setObject(this); 123 this->ccExit_ = createConsoleCommand(functor, "exit"); 124 CommandExecutor::addConsoleCommandShortcut(this->ccExit_); 125 } 126 127 { 128 // add console commands 129 FunctorMember01<GameStateBase, const std::string&>* functor = createFunctor(&GameStateBase::requestState); 130 functor->setObject(this); 131 this->ccSelectGameState_ = createConsoleCommand(functor, "selectGameState"); 132 CommandExecutor::addConsoleCommandShortcut(this->ccSelectGameState_); 133 } 71 134 72 135 { … … 85 148 CommandExecutor::addConsoleCommandShortcut(this->ccPause_).accessLevel(AccessLevel::Offline); 86 149 } 87 88 // Load level directly? 89 bool loadLevel = false; 90 if (CommandLine::getValue("standalone").getBool()) 91 { 92 Game::getInstance().requestStates("graphics, standalone, level"); 93 loadLevel = true; 94 } 95 if (CommandLine::getValue("server").getBool()) 96 { 97 Game::getInstance().requestStates("graphics, server, level"); 98 loadLevel = true; 99 } 100 if (CommandLine::getValue("client").getBool()) 101 { 102 Game::getInstance().requestStates("graphics, client, level"); 103 loadLevel = true; 104 } 105 if (CommandLine::getValue("dedicated").getBool()) 106 { 107 Game::getInstance().requestStates("dedicated, level"); 108 loadLevel = true; 109 } 110 111 // Determine where to start otherwise 112 if (!loadLevel && !CommandLine::getValue("console").getBool()) 113 { 114 // Also load graphics 115 Game::getInstance().requestState("graphics"); 116 } 117 } 118 119 void GSRoot::deactivate() 120 { 150 } 151 152 void GSRoot::leave() 153 { 154 // destroy console commands 155 delete this->ccExit_; 156 delete this->ccSelectGameState_; 157 158 delete this->shell_; 159 delete this->tclThreadManager_; 160 delete this->tclBind_; 161 162 delete this->luaBind_; 163 121 164 if (this->ccSetTimeFactor_) 122 165 { … … 132 175 } 133 176 134 void GSRoot::update(const Clock& time) 135 { 136 if (this->getActivity().topState) 137 { 138 // This state can not 'survive' on its own. 139 // Load a user interface therefore 140 Game::getInstance().requestState("ioConsole"); 141 } 142 177 void GSRoot::ticked(const Clock& time) 178 { 143 179 uint64_t timeBeforeTick = time.getRealMicroseconds(); 180 181 TclThreadManager::getInstance().tick(time.getDeltaTime()); 144 182 145 183 for (ObjectList<TimerBase>::iterator it = ObjectList<TimerBase>::begin(); it; ++it) … … 160 198 uint64_t timeAfterTick = time.getRealMicroseconds(); 161 199 162 // Also add our tick time 163 Game::getInstance().addTickTime(timeAfterTick - timeBeforeTick); 200 // STATISTICS 201 assert(timeAfterTick - timeBeforeTick >= 0 ); 202 statisticsTickInfo tickInfo = {timeAfterTick, timeAfterTick - timeBeforeTick}; 203 statisticsTickTimes_.push_back(tickInfo); 204 assert(statisticsTickTimes_.back().tickLength==tickInfo.tickLength); 205 this->periodTickTime_ += tickInfo.tickLength; 206 207 // Ticks GSGraphics or GSDedicated 208 this->tickChild(time); 209 210 if (timeAfterTick > statisticsStartTime_ + statisticsRefreshCycle_) 211 { 212 std::list<statisticsTickInfo>::iterator it = this->statisticsTickTimes_.begin(); 213 assert(it != this->statisticsTickTimes_.end()); 214 int64_t lastTime = timeAfterTick - statisticsAvgLength_; 215 if ((int64_t)it->tickTime < lastTime) 216 { 217 do 218 { 219 assert(this->periodTickTime_ > it->tickLength); 220 this->periodTickTime_ -= it->tickLength; 221 ++it; 222 assert(it != this->statisticsTickTimes_.end()); 223 } while ((int64_t)it->tickTime < lastTime); 224 this->statisticsTickTimes_.erase(this->statisticsTickTimes_.begin(), it); 225 } 226 227 uint32_t framesPerPeriod = this->statisticsTickTimes_.size(); 228 this->avgFPS_ = (float)framesPerPeriod / (timeAfterTick - this->statisticsTickTimes_.front().tickTime) * 1000000.0; 229 this->avgTickTime_ = (float)this->periodTickTime_ / framesPerPeriod / 1000.0; 230 231 statisticsStartTime_ = timeAfterTick; 232 } 233 234 } 235 236 /** 237 @note 238 The code of this function has been copied and adjusted from OGRE, an open source graphics engine. 239 (Object-oriented Graphics Rendering Engine) 240 For the latest info, see http://www.ogre3d.org/ 241 242 Copyright (c) 2000-2008 Torus Knot Software Ltd 243 244 OGRE is licensed under the LGPL. For more info, see OGRE license. 245 */ 246 void GSRoot::setThreadAffinity(unsigned int limitToCPU) 247 { 248 #ifdef ORXONOX_PLATFORM_WINDOWS 249 // Get the current process core mask 250 DWORD procMask; 251 DWORD sysMask; 252 # if _MSC_VER >= 1400 && defined (_M_X64) 253 GetProcessAffinityMask(GetCurrentProcess(), (PDWORD_PTR)&procMask, (PDWORD_PTR)&sysMask); 254 # else 255 GetProcessAffinityMask(GetCurrentProcess(), &procMask, &sysMask); 256 # endif 257 258 // If procMask is 0, consider there is only one core available 259 // (using 0 as procMask will cause an infinite loop below) 260 if (procMask == 0) 261 procMask = 1; 262 263 // if the core specified with limitToCPU is not available, take the lowest one 264 if (!(procMask & (1 << limitToCPU))) 265 limitToCPU = 0; 266 267 // Find the lowest core that this process uses and limitToCPU suggests 268 DWORD threadMask = 1; 269 while ((threadMask & procMask) == 0 || (threadMask < (1u << limitToCPU))) 270 threadMask <<= 1; 271 272 // Set affinity to the first core 273 SetThreadAffinityMask(GetCurrentThread(), threadMask); 274 #endif 164 275 } 165 276 … … 170 281 void GSRoot::setTimeFactor(float factor) 171 282 { 172 if ( GameMode::isMaster())283 if (Core::isMaster()) 173 284 { 174 285 if (!this->bPaused_) … … 188 299 void GSRoot::pause() 189 300 { 190 if ( GameMode::isMaster())301 if (Core::isMaster()) 191 302 { 192 303 if (!this->bPaused_) … … 203 314 } 204 315 } 316 317 //////////////////////// 318 // TimeFactorListener // 319 //////////////////////// 320 float TimeFactorListener::timefactor_s = 1.0f; 321 322 TimeFactorListener::TimeFactorListener() 323 { 324 RegisterRootObject(TimeFactorListener); 325 } 205 326 } -
code/branches/questsystem5/src/orxonox/gamestates/GSRoot.h
r2907 r2908 31 31 32 32 #include "OrxonoxPrereqs.h" 33 #include "core/GameState.h" 33 34 #include <list> 35 #include <OgreLog.h> 36 #include "core/RootGameState.h" 34 37 #include "core/OrxonoxClass.h" 35 38 36 39 namespace orxonox 37 40 { 38 class _OrxonoxExport GSRoot : public GameState41 class _OrxonoxExport GSRoot : public RootGameState, public OrxonoxClass 39 42 { 43 friend class ClassIdentifier<GSRoot>; 44 40 45 public: 41 GSRoot(const std::string& name); 46 struct statisticsTickInfo 47 { 48 uint64_t tickTime; 49 uint32_t tickLength; 50 }; 51 52 public: 53 GSRoot(); 42 54 ~GSRoot(); 43 55 44 void activate(); 45 void deactivate(); 46 void update(const Clock& time); 56 void exitGame() 57 { requestState("root"); } 47 58 48 59 // this has to be public because proteced triggers a bug in msvc … … 52 63 float getTimeFactor() { return this->timeFactor_; } 53 64 65 float getAvgTickTime() { return this->avgTickTime_; } 66 float getAvgFPS() { return this->avgFPS_; } 67 68 inline void addTickTime(uint32_t length) 69 { assert(!this->statisticsTickTimes_.empty()); this->statisticsTickTimes_.back().tickLength += length; 70 this->periodTickTime_+=length; } 71 54 72 private: 73 void enter(); 74 void leave(); 75 void ticked(const Clock& time); 76 77 void setConfigValues(); 78 void setThreadAffinity(unsigned int limitToCPU); 79 55 80 float timeFactor_; //!< A factor that sets the gamespeed. 1 is normal. 56 81 bool bPaused_; 57 82 float timeFactorPauseBackup_; 83 TclBind* tclBind_; 84 TclThreadManager* tclThreadManager_; 85 Shell* shell_; 86 LuaBind* luaBind_; 87 88 // variables for time statistics 89 uint64_t statisticsStartTime_; 90 std::list<statisticsTickInfo> 91 statisticsTickTimes_; 92 uint32_t periodTickTime_; 93 float avgFPS_; 94 float avgTickTime_; 95 96 // config values 97 unsigned int statisticsRefreshCycle_; 98 unsigned int statisticsAvgLength_; 58 99 59 100 // console commands 101 ConsoleCommand* ccExit_; 102 ConsoleCommand* ccSelectGameState_; 60 103 ConsoleCommand* ccSetTimeFactor_; 61 104 ConsoleCommand* ccPause_; 105 }; 106 107 class _OrxonoxExport TimeFactorListener : virtual public OrxonoxClass 108 { 109 friend class GSRoot; 110 111 public: 112 TimeFactorListener(); 113 virtual ~TimeFactorListener() {} 114 115 protected: 116 virtual void changedTimeFactor(float factor_new, float factor_old) {} 117 inline float getTimeFactor() const 118 { return TimeFactorListener::timefactor_s; } 119 120 private: 121 static float timefactor_s; 62 122 }; 63 123 } -
code/branches/questsystem5/src/orxonox/gamestates/GSServer.cc
r2907 r2908 31 31 32 32 #include "core/CommandLine.h" 33 #include "core/Game.h" 34 #include "core/GameMode.h" 33 #include "core/Core.h" 35 34 #include "network/Server.h" 36 35 37 36 namespace orxonox 38 37 { 39 AddGameState(GSServer, "server");40 41 38 SetCommandLineArgument(port, 55556).shortcut("p").information("0-65535"); 42 39 43 GSServer::GSServer( const std::string& name)44 : GameState (name)40 GSServer::GSServer() 41 : GameState<GSGraphics>("server") 45 42 , server_(0) 46 43 { … … 51 48 } 52 49 53 void GSServer:: activate()50 void GSServer::enter() 54 51 { 55 GameMode::setHasServer(true);52 Core::setHasServer(true); 56 53 57 54 this->server_ = new Server(CommandLine::getValue("port")); 58 55 COUT(0) << "Loading scene in server mode" << std::endl; 59 56 57 GSLevel::enter(this->getParent()->getViewport()); 58 60 59 server_->open(); 61 60 } 62 61 63 void GSServer:: deactivate()62 void GSServer::leave() 64 63 { 64 GSLevel::leave(); 65 65 66 this->server_->close(); 66 67 delete this->server_; 67 68 68 GameMode::setHasServer(false);69 Core::setHasServer(false); 69 70 } 70 71 71 void GSServer:: update(const Clock& time)72 void GSServer::ticked(const Clock& time) 72 73 { 73 server_->update(time); 74 GSLevel::ticked(time); 75 server_->tick(time.getDeltaTime()); 76 this->tickChild(time); 74 77 } 75 78 } -
code/branches/questsystem5/src/orxonox/gamestates/GSServer.h
r2907 r2908 31 31 32 32 #include "OrxonoxPrereqs.h" 33 #include "core/GameState.h"34 33 #include "network/NetworkPrereqs.h" 34 #include "GSLevel.h" 35 #include "GSGraphics.h" 35 36 36 37 namespace orxonox 37 38 { 38 class _OrxonoxExport GSServer : public GameState 39 class _OrxonoxExport GSServer : public GameState<GSGraphics>, public GSLevel 39 40 { 40 41 public: 41 GSServer( const std::string& name);42 GSServer(); 42 43 ~GSServer(); 43 44 44 void activate(); 45 void deactivate(); 46 void update(const Clock& time); 45 private: 46 void enter(); 47 void leave(); 48 void ticked(const Clock& time); 47 49 48 private: 49 Server* server_; 50 Server* server_; 50 51 }; 51 52 } -
code/branches/questsystem5/src/orxonox/gamestates/GSStandalone.cc
r2907 r2908 30 30 #include "GSStandalone.h" 31 31 32 #include <OgreViewport.h> 33 #include <OgreCamera.h> 34 #include "core/Game.h" 35 #include "core/GameMode.h" 36 #include "core/ConsoleCommand.h" 37 #include "gui/GUIManager.h" 38 #include "GraphicsManager.h" 32 #include "core/Core.h" 39 33 40 34 namespace orxonox 41 35 { 42 AddGameState(GSStandalone, "standalone"); 43 44 GSStandalone::GSStandalone(const std::string& name) 45 : GameState(name) 36 GSStandalone::GSStandalone() 37 : GameState<GSGraphics>("standalone") 46 38 { 47 39 } … … 51 43 } 52 44 45 void GSStandalone::enter() 46 { 47 Core::setIsStandalone(true); 53 48 54 void GSStandalone::activate() 55 { 56 GameMode::setIsStandalone(true); 49 GSLevel::enter(this->getParent()->getViewport()); 57 50 } 58 51 59 void GSStandalone:: deactivate()52 void GSStandalone::leave() 60 53 { 61 GameMode::setIsStandalone(false); 54 GSLevel::leave(); 55 56 Core::setIsStandalone(false); 62 57 } 63 58 64 void GSStandalone:: update(const Clock& time)59 void GSStandalone::ticked(const Clock& time) 65 60 { 61 GSLevel::ticked(time); 62 this->tickChild(time); 66 63 } 67 64 } -
code/branches/questsystem5/src/orxonox/gamestates/GSStandalone.h
r2907 r2908 31 31 32 32 #include "OrxonoxPrereqs.h" 33 #include "core/GameState.h" 33 #include "GSLevel.h" 34 #include "GSGraphics.h" 34 35 35 36 namespace orxonox 36 37 { 37 class _OrxonoxExport GSStandalone : public GameState 38 class _OrxonoxExport GSStandalone : public GameState<GSGraphics>, public GSLevel 38 39 { 39 40 public: 40 GSStandalone( const std::string& name);41 GSStandalone(); 41 42 ~GSStandalone(); 42 43 43 void activate();44 void deactivate();45 void update(const Clock& time);46 47 44 private: 45 void enter(); 46 void leave(); 47 void ticked(const Clock& time); 48 48 }; 49 49 }
Note: See TracChangeset
for help on using the changeset viewer.