Changeset 2907 for code/branches/questsystem5/src/orxonox/gamestates
- Timestamp:
- Apr 8, 2009, 12:36:08 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
r2710 r2907 1 1 ADD_SOURCE_FILES(ORXONOX_SRC_FILES 2 GSClient.cc 2 3 GSDedicated.cc 3 GSClient.cc4 4 GSGraphics.cc 5 GSGUI.cc6 5 GSIOConsole.cc 7 6 GSLevel.cc 7 GSMainMenu.cc 8 8 GSRoot.cc 9 9 GSServer.cc -
code/branches/questsystem5/src/orxonox/gamestates/GSClient.cc
r2171 r2907 31 31 32 32 #include "core/input/InputManager.h" 33 #include "core/Clock.h" 33 34 #include "core/CommandLine.h" 34 #include "core/Core.h" 35 #include "core/Game.h" 36 #include "core/GameMode.h" 35 37 #include "network/Client.h" 36 38 37 39 namespace orxonox 38 40 { 41 AddGameState(GSClient, "client"); 42 39 43 SetCommandLineArgument(ip, "127.0.0.1").information("#.#.#.#"); 40 44 41 GSClient::GSClient( )42 : GameState <GSGraphics>("client")45 GSClient::GSClient(const std::string& name) 46 : GameState(name) 43 47 , client_(0) 44 48 { … … 49 53 } 50 54 51 void GSClient:: enter()55 void GSClient::activate() 52 56 { 53 Core::setIsClient(true);57 GameMode::setIsClient(true); 54 58 55 59 this->client_ = new Client(CommandLine::getValue("ip").getString(), CommandLine::getValue("port")); … … 58 62 ThrowException(InitialisationFailed, "Could not establish connection with server."); 59 63 60 GSLevel::enter(this->getParent()->getViewport()); 61 62 client_->tick(0); 64 client_->update(Game::getInstance().getGameClock()); 63 65 } 64 66 65 void GSClient:: leave()67 void GSClient::deactivate() 66 68 { 67 GSLevel::leave();68 69 69 client_->closeConnection(); 70 70 … … 72 72 delete this->client_; 73 73 74 Core::setIsClient(false);74 GameMode::setIsClient(false); 75 75 } 76 76 77 void GSClient:: ticked(const Clock& time)77 void GSClient::update(const Clock& time) 78 78 { 79 GSLevel::ticked(time); 80 client_->tick(time.getDeltaTime()); 81 82 this->tickChild(time); 79 client_->update(time); 83 80 } 84 81 } -
code/branches/questsystem5/src/orxonox/gamestates/GSClient.h
r2171 r2907 31 31 32 32 #include "OrxonoxPrereqs.h" 33 #include "core/GameState.h" 33 34 #include "network/NetworkPrereqs.h" 34 #include "GSLevel.h"35 #include "GSGraphics.h"36 35 37 36 namespace orxonox 38 37 { 39 class _OrxonoxExport GSClient : public GameState <GSGraphics>, public GSLevel38 class _OrxonoxExport GSClient : public GameState 40 39 { 41 40 public: 42 GSClient( );41 GSClient(const std::string& name); 43 42 ~GSClient(); 44 43 44 void activate(); 45 void deactivate(); 46 void update(const Clock& time); 45 47 46 48 private: 47 void enter();48 void leave();49 void ticked(const Clock& time);50 51 49 Client* client_; 52 50 }; -
code/branches/questsystem5/src/orxonox/gamestates/GSDedicated.cc
r2662 r2907 30 30 #include "GSDedicated.h" 31 31 32 #include "core/Clock.h" 32 33 #include "core/CommandLine.h" 33 #include "core/Core.h" 34 #include "core/Game.h" 35 #include "core/GameMode.h" 34 36 #include "core/Iterator.h" 35 37 #include "network/Server.h" … … 39 41 namespace orxonox 40 42 { 41 GSDedicated::GSDedicated() 42 : GameState<GSRoot>("dedicated") 43 AddGameState(GSDedicated, "dedicated"); 44 45 GSDedicated::GSDedicated(const std::string& name) 46 : GameState(name) 43 47 , server_(0) 44 48 , timeSinceLastUpdate_(0) … … 50 54 } 51 55 52 void GSDedicated:: enter()56 void GSDedicated::activate() 53 57 { 54 Core::setHasServer(true);58 GameMode::setHasServer(true); 55 59 56 60 this->server_ = new Server(CommandLine::getValue("port")); 57 61 COUT(0) << "Loading scene in server mode" << std::endl; 58 62 59 GSLevel::enter(0);60 61 63 server_->open(); 62 64 } 63 65 64 void GSDedicated:: leave()66 void GSDedicated::deactivate() 65 67 { 66 GSLevel::leave();67 68 68 this->server_->close(); 69 69 delete this->server_; 70 70 71 Core::setHasServer(false);71 GameMode::setHasServer(false); 72 72 } 73 73 74 void GSDedicated:: ticked(const Clock& time)74 void GSDedicated::update(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 GSLevel::ticked(time); 85 server_->tick(time.getDeltaTime()); 86 this->tickChild(time); 84 server_->update(time); 87 85 } 88 86 else -
code/branches/questsystem5/src/orxonox/gamestates/GSDedicated.h
r2662 r2907 31 31 32 32 #include "OrxonoxPrereqs.h" 33 #include "core/GameState.h" 33 34 #include "network/NetworkPrereqs.h" 34 #include "GSLevel.h"35 #include "GSRoot.h"36 35 37 36 namespace orxonox 38 37 { 39 class _OrxonoxExport GSDedicated : public GameState <GSRoot>, public GSLevel38 class _OrxonoxExport GSDedicated : public GameState 40 39 { 41 40 public: 42 GSDedicated( );41 GSDedicated(const std::string& name); 43 42 ~GSDedicated(); 44 43 44 void activate(); 45 void deactivate(); 46 void update(const Clock& time); 47 45 48 private: 46 void enter(); 47 void leave(); 48 void ticked(const Clock& time); 49 50 Server* server_; 51 float timeSinceLastUpdate_; 49 Server* server_; 50 float timeSinceLastUpdate_; 52 51 }; 53 52 } -
code/branches/questsystem5/src/orxonox/gamestates/GSGraphics.cc
r2759 r2907 23 23 * Reto Grieder 24 24 * Co-authors: 25 * ... 26 * 25 * Benjamin Knecht 26 * 27 */ 28 29 /** 30 @file 31 @brief Implementation of Graphics GameState class. 27 32 */ 28 33 … … 30 35 #include "GSGraphics.h" 31 36 32 #include <fstream>33 37 #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>41 38 #include <OgreRenderWindow.h> 42 #include <OgreRenderSystem.h> 43 #include <OgreTextureManager.h> 44 #include <OgreViewport.h> 45 #include <OgreWindowEventUtilities.h> 46 47 #include "SpecialConfig.h" 39 48 40 #include "util/Debug.h" 49 #include "util/Exception.h" 50 #include "util/String.h" 51 #include "util/SubString.h" 41 #include "core/ConfigValueIncludes.h" 42 #include "core/Clock.h" 52 43 #include "core/ConsoleCommand.h" 53 #include "core/Co nfigValueIncludes.h"44 #include "core/Core.h" 54 45 #include "core/CoreIncludes.h" 55 #include "core/Core.h" 46 #include "core/Game.h" 47 #include "core/GameMode.h" 56 48 #include "core/input/InputManager.h" 57 49 #include "core/input/KeyBinder.h" 58 #include "core/input/ ExtendedInputState.h"50 #include "core/input/SimpleInputState.h" 59 51 #include "core/Loader.h" 60 52 #include "core/XMLFile.h" 61 53 #include "overlays/console/InGameConsole.h" 62 54 #include "gui/GUIManager.h" 63 #include "tools/WindowEventListener.h" 64 65 // for compatibility 66 #include "GraphicsEngine.h" 55 #include "GraphicsManager.h" 67 56 68 57 namespace orxonox 69 58 { 70 GSGraphics::GSGraphics() 71 : GameState<GSRoot>("graphics") 72 , renderWindow_(0) 73 , viewport_(0) 74 , bWindowEventListenerUpdateRequired_(false) 59 AddGameState(GSGraphics, "graphics"); 60 61 GSGraphics::GSGraphics(const std::string& name) 62 : GameState(name) 75 63 , inputManager_(0) 76 64 , console_(0) 77 65 , guiManager_(0) 78 , ogreRoot_(0) 79 , ogreLogger_(0) 80 , graphicsEngine_(0) 66 , graphicsManager_(0) 81 67 , masterKeyBinder_(0) 68 , masterInputState_(0) 82 69 , debugOverlay_(0) 83 70 { 84 71 RegisterRootObject(GSGraphics); 72 } 73 74 GSGraphics::~GSGraphics() 75 { 76 } 77 78 /** 79 @brief 80 this function does nothing 81 82 Indeed. Here goes nothing. 83 */ 84 void GSGraphics::setConfigValues() 85 { 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 85 106 setConfigValues(); 86 } 87 88 GSGraphics::~GSGraphics() 89 { 90 } 91 92 void GSGraphics::setConfigValues() 93 { 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); 107 108 // initialise graphics manager. Doesn't load the render window yet! 109 this->graphicsManager_ = new GraphicsManager(); 110 this->graphicsManager_->initialise(); 135 111 136 112 // load debug overlay … … 139 115 Loader::open(debugOverlay_); 140 116 117 // The render window width and height are used to set up the mouse movement. 118 size_t windowHnd = 0; 119 Ogre::RenderWindow* renderWindow = GraphicsManager::getInstance().getRenderWindow(); 120 renderWindow->getCustomAttribute("WINDOW", &windowHnd); 121 141 122 // Calls the InputManager which sets up the input devices. 142 // The render window width and height are used to set up the mouse movement.143 123 inputManager_ = new InputManager(); 144 size_t windowHnd = 0;145 this->renderWindow_->getCustomAttribute("WINDOW", &windowHnd); 146 inputManager_->initialise(windowHnd, renderWindow_->getWidth(), renderWindow_->getHeight(), true);147 // Configure master input state with a KeyBinder124 inputManager_->initialise(windowHnd, renderWindow->getWidth(), renderWindow->getHeight(), true); 125 126 // load master key bindings 127 masterInputState_ = InputManager::getInstance().createInputState<SimpleInputState>("master", true); 148 128 masterKeyBinder_ = new KeyBinder(); 149 129 masterKeyBinder_->loadBindings("masterKeybindings.ini"); 150 inputManager_->getMasterInputState()->addKeyHandler(masterKeyBinder_);130 masterInputState_->setKeyHandler(masterKeyBinder_); 151 131 152 132 // Load the InGameConsole 153 133 console_ = new InGameConsole(); 154 console_->initialise( this->renderWindow_->getWidth(), this->renderWindow_->getHeight());134 console_->initialise(renderWindow->getWidth(), renderWindow->getHeight()); 155 135 156 136 // load the CEGUI interface 157 137 guiManager_ = new GUIManager(); 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); 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"); 167 delete this->masterKeyBinder_; 175 168 176 169 delete this->guiManager_; 177 178 170 delete this->console_; 179 180 //inputManager_->getMasterInputState()->removeKeyHandler(this->masterKeyBinder_);181 delete this->masterKeyBinder_;182 delete this->inputManager_;183 171 184 172 Loader::unload(this->debugOverlay_); 185 173 delete this->debugOverlay_; 186 174 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); 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()"); 219 193 } 220 194 … … 227 201 need the time. So we shouldn't run into problems. 228 202 */ 229 void GSGraphics::ticked(const Clock& time) 230 { 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 231 212 uint64_t timeBeforeTick = time.getRealMicroseconds(); 232 213 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 } 214 this->inputManager_->update(time); // tick console 215 this->console_->update(time); 216 this->guiManager_->update(time); 246 217 247 218 uint64_t timeAfterTick = time.getRealMicroseconds(); 248 219 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(); 220 // Also add our tick time 221 Game::getInstance().addTickTime(timeAfterTick - timeBeforeTick); 222 223 // Render 224 this->graphicsManager_->update(time); 484 225 } 485 226 … … 490 231 The render window it occured in 491 232 @note 492 Graphics Enginehas a render window stored itself. This is the same233 GraphicsManager has a render window stored itself. This is the same 493 234 as rw. But we have to be careful when using multiple render windows! 494 235 */ 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 236 void GSGraphics::windowResized(unsigned int newWidth, unsigned int newHeight) 237 { 500 238 // OIS needs this under linux even if we only use relative input measurement. 501 239 if (this->inputManager_) 502 this->inputManager_->setWindowExtents( renderWindow_->getWidth(), renderWindow_->getHeight());240 this->inputManager_->setWindowExtents(newWidth, newHeight); 503 241 } 504 242 … … 509 247 The render window it occured in 510 248 */ 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 249 void GSGraphics::windowFocusChanged() 250 { 516 251 // instruct InputManager to clear the buffers (core library so we cannot use the interface) 517 252 if (this->inputManager_) … … 519 254 } 520 255 521 /**522 @brief523 Window was closed.524 @param rw525 The render window it occured in526 */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 }539 256 } -
code/branches/questsystem5/src/orxonox/gamestates/GSGraphics.h
r2756 r2907 23 23 * Reto Grieder 24 24 * Co-authors: 25 * ...25 * Benjamin Knecht (documentation) 26 26 * 27 27 */ 28 29 /** 30 @file 31 @brief Declaration of the Graphics GameState class. 32 */ 28 33 29 34 #ifndef _GSGraphics_H__ … … 31 36 32 37 #include "OrxonoxPrereqs.h" 33 #include <OgrePrerequisites.h>34 #define NOMINMAX // required to stop windows.h screwing up std::min definition35 #include <OgreWindowEventUtilities.h>36 38 #include "core/GameState.h" 37 #include "core/OrxonoxClass.h" 38 #include "GSRoot.h" 39 #include "tools/WindowEventListener.h" 39 40 40 41 namespace orxonox 41 42 { 42 class _OrxonoxExport GSGraphics : public GameState<GSRoot>, public OrxonoxClass, 43 public Ogre::WindowEventListener, public Ogre::LogListener 43 /** 44 @class GSGraphics 45 @brief 46 Game state used when displaying graphics of any kind 47 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 WindowEventListener 44 51 { 45 friend class ClassIdentifier<GSGraphics>;46 47 52 public: 48 GSGraphics( );53 GSGraphics(const std::string& name); 49 54 ~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: // functions56 void enter();57 void leave();58 void ticked(const Clock& time);59 60 55 void setConfigValues(); 61 56 62 void setupOgre(); 63 void loadOgrePlugins(); 64 void declareResources(); 65 void loadRenderer(); 66 void initialiseResources(); 57 void activate(); 58 void deactivate(); 59 void update(const Clock& time); 67 60 68 // console commands 69 void printScreen(); 61 void toggleGUI(); 70 62 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. 63 private: 64 // Window events from WindowEventListener 65 void windowResized(unsigned int newWidth, unsigned int newHeight); 66 void windowFocusChanged(); 87 67 88 68 // managed singletons 89 InputManager* inputManager_; 69 InputManager* inputManager_; //!< Reference to input management 90 70 InGameConsole* console_; 91 GUIManager* guiManager_; 92 Ogre::Root* ogreRoot_; //!< Ogre's root 93 Ogre::LogManager* ogreLogger_; 94 GraphicsEngine* graphicsEngine_; //!< Interface to Ogre 71 GUIManager* guiManager_; //!< Interface to GUI 72 GraphicsManager* graphicsManager_; //!< Interface to Ogre 95 73 96 KeyBinder* masterKeyBinder_; 74 KeyBinder* masterKeyBinder_; //!< Key binder for master key bindings 75 SimpleInputState* masterInputState_; //!< Special input state for master input 97 76 XMLFile* debugOverlay_; 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_; 77 ConsoleCommand* ccToggleGUI_; //!< Console command to toggle GUI 111 78 }; 112 79 } -
code/branches/questsystem5/src/orxonox/gamestates/GSIOConsole.cc
r2087 r2907 36 36 37 37 #include "core/ConsoleCommand.h" 38 #include "core/Game.h" 38 39 39 40 namespace orxonox 40 41 { 41 GSIOConsole::GSIOConsole() 42 : GameState<GSRoot>("ioConsole") 42 AddGameState(GSIOConsole, "ioConsole"); 43 44 GSIOConsole::GSIOConsole(const std::string& name) 45 : GameState(name) 43 46 { 44 47 } … … 48 51 } 49 52 50 void GSIOConsole:: enter()53 void GSIOConsole::activate() 51 54 { 55 { 56 FunctorMember<GSIOConsole>* functor = createFunctor(&GSIOConsole::loadMenu); 57 functor->setObject(this); 58 this->ccLoadMenu_ = createConsoleCommand(functor, "loadMenu"); 59 CommandExecutor::addConsoleCommandShortcut(this->ccLoadMenu_); 60 } 52 61 } 53 62 54 void GSIOConsole:: leave()63 void GSIOConsole::deactivate() 55 64 { 65 if (this->ccLoadMenu_) 66 { 67 delete this->ccLoadMenu_; 68 this->ccLoadMenu_ = 0; 69 } 56 70 } 57 71 58 void GSIOConsole:: ticked(const Clock& time)72 void GSIOConsole::update(const Clock& time) 59 73 { 74 std::cout << ">"; 60 75 std::string command; 61 76 std::getline(std::cin, command); 62 77 CommandExecutor::execute(command, true); 63 64 tickChild(time); 78 } 79 80 void GSIOConsole::loadMenu() 81 { 82 Game::getInstance().popState(); 83 Game::getInstance().requestStates("graphics, mainMenu"); 65 84 } 66 85 } -
code/branches/questsystem5/src/orxonox/gamestates/GSIOConsole.h
r1755 r2907 31 31 32 32 #include "OrxonoxPrereqs.h" 33 #include <OgrePrerequisites.h>34 33 #include "core/GameState.h" 35 #include "GSRoot.h"36 34 37 35 namespace orxonox 38 36 { 39 class _OrxonoxExport GSIOConsole : public GameState <GSRoot>37 class _OrxonoxExport GSIOConsole : public GameState 40 38 { 41 39 public: 42 GSIOConsole( );40 GSIOConsole(const std::string& name); 43 41 ~GSIOConsole(); 44 42 43 void activate(); 44 void deactivate(); 45 void update(const Clock& time); 46 45 47 private: 46 void enter(); 47 void leave(); 48 void ticked(const Clock& time); 48 void loadMenu(); 49 50 // console commands 51 ConsoleCommand* ccLoadMenu_; 49 52 }; 50 53 } -
code/branches/questsystem5/src/orxonox/gamestates/GSLevel.cc
r2788 r2907 24 24 * Co-authors: 25 25 * Fabian 'x3n' Landau 26 * Benjamin Knecht 26 27 * 27 28 */ … … 39 40 #include "core/CommandLine.h" 40 41 #include "core/ConfigValueIncludes.h" 42 #include "core/Core.h" 41 43 #include "core/CoreIncludes.h" 42 #include "core/Core.h" 44 #include "core/Game.h" 45 #include "core/GameMode.h" 43 46 #include "objects/Tickable.h" 44 47 #include "objects/Radar.h" 45 48 #include "CameraManager.h" 49 #include "GraphicsManager.h" 46 50 #include "LevelManager.h" 47 51 #include "PlayerManager.h" 48 #include "objects/quest/QuestManager.h" 49 #include "overlays/notifications/NotificationManager.h" 52 #include "orxonox/objects/quest/QuestManager.h" 53 #include "orxonox/overlays/notifications/NotificationManager.h" 54 #include "gui/GUIManager.h" 50 55 51 56 namespace orxonox 52 57 { 53 SetCommandLineArgument(level, "presentation.oxw").shortcut("l"); 54 55 GSLevel::GSLevel() 56 // : GameState<GSGraphics>(name) 57 : keyBinder_(0) 58 , inputState_(0) 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) 59 69 , radar_(0) 60 70 , startFile_(0) … … 66 76 this->ccKeybind_ = 0; 67 77 this->ccTkeybind_ = 0; 68 78 } 79 80 GSLevel::~GSLevel() 81 { 82 } 83 84 void GSLevel::setConfigValues() 85 { 86 SetConfigValue(keyDetectorCallbackCode_, "KeybindBindingStringKeyName="); 87 } 88 89 void GSLevel::activate() 90 { 69 91 setConfigValues(); 70 } 71 72 GSLevel::~GSLevel() 73 { 74 } 75 76 void GSLevel::setConfigValues() 77 { 78 SetConfigValue(keyDetectorCallbackCode_, "KeybindBindingStringKeyName="); 79 } 80 81 void GSLevel::enter(Ogre::Viewport* viewport) 82 { 83 if (Core::showsGraphics()) 84 { 85 inputState_ = InputManager::getInstance().createInputState<SimpleInputState>("game", 20); 92 93 if (GameMode::showsGraphics()) 94 { 95 gameInputState_ = InputManager::getInstance().createInputState<SimpleInputState>("game"); 86 96 keyBinder_ = new KeyBinder(); 87 97 keyBinder_->loadBindings("keybindings.ini"); 88 inputState_->setHandler(keyBinder_); 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()); 89 105 90 106 // create the global CameraManager 91 assert(viewport); 92 this->cameraManager_ = new CameraManager(viewport); 107 this->cameraManager_ = new CameraManager(GraphicsManager::getInstance().getViewport()); 93 108 94 109 // Start the Radar … … 102 117 this->notificationManager_ = new NotificationManager(); 103 118 104 if ( Core::isMaster())119 if (GameMode::isMaster()) 105 120 { 106 121 // create the global LevelManager … … 110 125 } 111 126 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 127 if (GameMode::showsGraphics()) 128 { 117 129 // keybind console command 118 130 FunctorMember<GSLevel>* functor1 = createFunctor(&GSLevel::keybind); … … 132 144 } 133 145 134 void GSLevel::leave() 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() 135 163 { 136 164 // destroy console commands … … 145 173 this->ccTkeybind_ = 0; 146 174 } 175 147 176 148 177 // this call will delete every BaseObject! … … 152 181 //Loader::close(); 153 182 154 if ( Core::showsGraphics())183 if (GameMode::showsGraphics()) 155 184 InputManager::getInstance().requestLeaveState("game"); 156 185 157 if ( Core::isMaster())186 if (GameMode::isMaster()) 158 187 this->unloadLevel(); 159 188 … … 194 223 } 195 224 196 if (Core::showsGraphics()) 197 { 198 inputState_->setHandler(0); 225 if (GameMode::showsGraphics()) 226 { 227 gameInputState_->setHandler(0); 228 guiMouseOnlyInputState_->setHandler(0); 229 guiKeysOnlyInputState_->setHandler(0); 199 230 InputManager::getInstance().requestDestroyState("game"); 200 231 if (this->keyBinder_) … … 206 237 } 207 238 208 void GSLevel:: ticked(const Clock& time)209 { 210 // Commented by 1337: Temporarily moved to GSGraphics.239 void GSLevel::update(const Clock& time) 240 { 241 // Note: Temporarily moved to GSGraphics. 211 242 //// Call the scene objects 212 243 //for (ObjectList<Tickable>::iterator it = ObjectList<Tickable>::begin(); it; ++it) … … 251 282 Command string that can be executed by the CommandExecutor 252 283 OR: Internal string "KeybindBindingStringKeyName=" used for the second call to identify 253 the key/button/axis that has been activated. This is configured above in enter().284 the key/button/axis that has been activated. This is configured above in activate(). 254 285 */ 255 286 void GSLevel::keybindInternal(const std::string& command, bool bTemporary) 256 287 { 257 if ( Core::showsGraphics())288 if (GameMode::showsGraphics()) 258 289 { 259 290 static std::string bindingString = ""; -
code/branches/questsystem5/src/orxonox/gamestates/GSLevel.h
r2786 r2907 23 23 * Reto Grieder 24 24 * Co-authors: 25 * ...25 * Benjamin Knecht 26 26 * 27 27 */ … … 31 31 32 32 #include "OrxonoxPrereqs.h" 33 #include <OgrePrerequisites.h>34 33 #include "core/OrxonoxClass.h" 34 #include "core/GameState.h" 35 35 36 36 namespace orxonox 37 37 { 38 class _OrxonoxExport GSLevel : public OrxonoxClass38 class _OrxonoxExport GSLevel : public GameState, public OrxonoxClass 39 39 { 40 friend class ClassIdentifier<GSLevel>;41 40 public: 42 GSLevel( );41 GSLevel(const std::string& name); 43 42 ~GSLevel(); 43 void setConfigValues(); 44 45 void activate(); 46 void deactivate(); 47 void update(const Clock& time); 48 49 static void showIngameGUI(bool show); 44 50 45 51 protected: 46 void enter(Ogre::Viewport* viewport);47 void leave();48 void ticked(const Clock& time);49 50 52 void loadLevel(); 51 53 void unloadLevel(); … … 56 58 void keybindInternal(const std::string& command, bool bTemporary); 57 59 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_; 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 67 71 68 72 //##### ConfigValues ##### … … 72 76 ConsoleCommand* ccKeybind_; 73 77 ConsoleCommand* ccTkeybind_; 74 75 private:76 void setConfigValues();77 78 78 }; 79 79 } -
code/branches/questsystem5/src/orxonox/gamestates/GSRoot.cc
r2759 r2907 32 32 #include "util/Exception.h" 33 33 #include "util/Debug.h" 34 #include "core/C ore.h"35 #include "core/ Factory.h"36 #include "core/ ConfigValueIncludes.h"37 #include "core/Co reIncludes.h"34 #include "core/Clock.h" 35 #include "core/Game.h" 36 #include "core/GameMode.h" 37 #include "core/CommandLine.h" 38 38 #include "core/ConsoleCommand.h" 39 #include "core/CommandLine.h" 40 #include "core/Shell.h" 41 #include "core/TclBind.h" 42 #include "core/TclThreadManager.h" 43 #include "core/LuaBind.h" 39 #include "tools/TimeFactorListener.h" 44 40 #include "tools/Timer.h" 45 41 #include "objects/Tickable.h" 46 42 47 #ifdef ORXONOX_PLATFORM_WINDOWS48 # ifndef WIN32_LEAN_AND_MEAN49 # define WIN32_LEAN_AND_MEAN50 # endif51 # define NOMINMAX // required to stop windows.h screwing up std::min definition52 # include "windows.h"53 #endif54 55 43 namespace orxonox 56 44 { 57 SetCommandLineArgument(limitToCPU, 1).information("0: off | #cpu"); 58 59 GSRoot::GSRoot() 60 : RootGameState("root") 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) 61 55 , timeFactor_(1.0f) 62 56 , bPaused_(false) 63 57 , timeFactorPauseBackup_(1.0f) 64 , tclBind_(0) 65 , tclThreadManager_(0) 66 , shell_(0) 67 { 68 RegisterRootObject(GSRoot); 69 setConfigValues(); 70 58 { 71 59 this->ccSetTimeFactor_ = 0; 72 60 this->ccPause_ = 0; … … 77 65 } 78 66 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 67 void GSRoot::activate() 68 { 92 69 // reset game speed to normal 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 } 70 this->timeFactor_ = 1.0f; 134 71 135 72 { … … 148 85 CommandExecutor::addConsoleCommandShortcut(this->ccPause_).accessLevel(AccessLevel::Offline); 149 86 } 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 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 { 164 121 if (this->ccSetTimeFactor_) 165 122 { … … 175 132 } 176 133 177 void GSRoot::ticked(const Clock& time) 178 { 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 179 143 uint64_t timeBeforeTick = time.getRealMicroseconds(); 180 181 TclThreadManager::getInstance().tick(time.getDeltaTime());182 144 183 145 for (ObjectList<TimerBase>::iterator it = ObjectList<TimerBase>::begin(); it; ++it) … … 198 160 uint64_t timeAfterTick = time.getRealMicroseconds(); 199 161 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 162 // Also add our tick time 163 Game::getInstance().addTickTime(timeAfterTick - timeBeforeTick); 275 164 } 276 165 … … 281 170 void GSRoot::setTimeFactor(float factor) 282 171 { 283 if ( Core::isMaster())172 if (GameMode::isMaster()) 284 173 { 285 174 if (!this->bPaused_) … … 299 188 void GSRoot::pause() 300 189 { 301 if ( Core::isMaster())190 if (GameMode::isMaster()) 302 191 { 303 192 if (!this->bPaused_) … … 314 203 } 315 204 } 316 317 ////////////////////////318 // TimeFactorListener //319 ////////////////////////320 float TimeFactorListener::timefactor_s = 1.0f;321 322 TimeFactorListener::TimeFactorListener()323 {324 RegisterRootObject(TimeFactorListener);325 }326 205 } -
code/branches/questsystem5/src/orxonox/gamestates/GSRoot.h
r2710 r2907 31 31 32 32 #include "OrxonoxPrereqs.h" 33 34 #include <list> 35 #include <OgreLog.h> 36 #include "core/RootGameState.h" 33 #include "core/GameState.h" 37 34 #include "core/OrxonoxClass.h" 38 35 39 36 namespace orxonox 40 37 { 41 class _OrxonoxExport GSRoot : public RootGameState, public OrxonoxClass38 class _OrxonoxExport GSRoot : public GameState 42 39 { 43 friend class ClassIdentifier<GSRoot>;44 45 40 public: 46 struct statisticsTickInfo 47 { 48 uint64_t tickTime; 49 uint32_t tickLength; 50 }; 51 52 public: 53 GSRoot(); 41 GSRoot(const std::string& name); 54 42 ~GSRoot(); 55 43 56 void exitGame() 57 { requestState("root"); } 44 void activate(); 45 void deactivate(); 46 void update(const Clock& time); 58 47 59 48 // this has to be public because proteced triggers a bug in msvc … … 63 52 float getTimeFactor() { return this->timeFactor_; } 64 53 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 72 54 private: 73 void enter();74 void leave();75 void ticked(const Clock& time);76 77 void setConfigValues();78 void setThreadAffinity(unsigned int limitToCPU);79 80 55 float timeFactor_; //!< A factor that sets the gamespeed. 1 is normal. 81 56 bool bPaused_; 82 57 float timeFactorPauseBackup_; 83 TclBind* tclBind_;84 TclThreadManager* tclThreadManager_;85 Shell* shell_;86 LuaBind* luaBind_;87 88 // variables for time statistics89 uint64_t statisticsStartTime_;90 std::list<statisticsTickInfo>91 statisticsTickTimes_;92 uint32_t periodTickTime_;93 float avgFPS_;94 float avgTickTime_;95 96 // config values97 unsigned int statisticsRefreshCycle_;98 unsigned int statisticsAvgLength_;99 58 100 59 // console commands 101 ConsoleCommand* ccExit_;102 ConsoleCommand* ccSelectGameState_;103 60 ConsoleCommand* ccSetTimeFactor_; 104 61 ConsoleCommand* ccPause_; 105 };106 107 class _OrxonoxExport TimeFactorListener : virtual public OrxonoxClass108 {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() const118 { return TimeFactorListener::timefactor_s; }119 120 private:121 static float timefactor_s;122 62 }; 123 63 } -
code/branches/questsystem5/src/orxonox/gamestates/GSServer.cc
r2171 r2907 31 31 32 32 #include "core/CommandLine.h" 33 #include "core/Core.h" 33 #include "core/Game.h" 34 #include "core/GameMode.h" 34 35 #include "network/Server.h" 35 36 36 37 namespace orxonox 37 38 { 39 AddGameState(GSServer, "server"); 40 38 41 SetCommandLineArgument(port, 55556).shortcut("p").information("0-65535"); 39 42 40 GSServer::GSServer( )41 : GameState <GSGraphics>("server")43 GSServer::GSServer(const std::string& name) 44 : GameState(name) 42 45 , server_(0) 43 46 { … … 48 51 } 49 52 50 void GSServer:: enter()53 void GSServer::activate() 51 54 { 52 Core::setHasServer(true);55 GameMode::setHasServer(true); 53 56 54 57 this->server_ = new Server(CommandLine::getValue("port")); 55 58 COUT(0) << "Loading scene in server mode" << std::endl; 56 59 57 GSLevel::enter(this->getParent()->getViewport());58 59 60 server_->open(); 60 61 } 61 62 62 void GSServer:: leave()63 void GSServer::deactivate() 63 64 { 64 GSLevel::leave();65 66 65 this->server_->close(); 67 66 delete this->server_; 68 67 69 Core::setHasServer(false);68 GameMode::setHasServer(false); 70 69 } 71 70 72 void GSServer:: ticked(const Clock& time)71 void GSServer::update(const Clock& time) 73 72 { 74 GSLevel::ticked(time); 75 server_->tick(time.getDeltaTime()); 76 this->tickChild(time); 73 server_->update(time); 77 74 } 78 75 } -
code/branches/questsystem5/src/orxonox/gamestates/GSServer.h
r2171 r2907 31 31 32 32 #include "OrxonoxPrereqs.h" 33 #include "core/GameState.h" 33 34 #include "network/NetworkPrereqs.h" 34 #include "GSLevel.h"35 #include "GSGraphics.h"36 35 37 36 namespace orxonox 38 37 { 39 class _OrxonoxExport GSServer : public GameState <GSGraphics>, public GSLevel38 class _OrxonoxExport GSServer : public GameState 40 39 { 41 40 public: 42 GSServer( );41 GSServer(const std::string& name); 43 42 ~GSServer(); 44 43 44 void activate(); 45 void deactivate(); 46 void update(const Clock& time); 47 45 48 private: 46 void enter(); 47 void leave(); 48 void ticked(const Clock& time); 49 50 Server* server_; 49 Server* server_; 51 50 }; 52 51 } -
code/branches/questsystem5/src/orxonox/gamestates/GSStandalone.cc
r2087 r2907 30 30 #include "GSStandalone.h" 31 31 32 #include "core/Core.h" 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" 33 39 34 40 namespace orxonox 35 41 { 36 GSStandalone::GSStandalone() 37 : GameState<GSGraphics>("standalone") 42 AddGameState(GSStandalone, "standalone"); 43 44 GSStandalone::GSStandalone(const std::string& name) 45 : GameState(name) 38 46 { 39 47 } … … 43 51 } 44 52 45 void GSStandalone::enter() 53 54 void GSStandalone::activate() 46 55 { 47 Core::setIsStandalone(true); 48 49 GSLevel::enter(this->getParent()->getViewport()); 56 GameMode::setIsStandalone(true); 50 57 } 51 58 52 void GSStandalone:: leave()59 void GSStandalone::deactivate() 53 60 { 54 GSLevel::leave(); 55 56 Core::setIsStandalone(false); 61 GameMode::setIsStandalone(false); 57 62 } 58 63 59 void GSStandalone:: ticked(const Clock& time)64 void GSStandalone::update(const Clock& time) 60 65 { 61 GSLevel::ticked(time);62 this->tickChild(time);63 66 } 64 67 } -
code/branches/questsystem5/src/orxonox/gamestates/GSStandalone.h
r2087 r2907 31 31 32 32 #include "OrxonoxPrereqs.h" 33 #include "GSLevel.h" 34 #include "GSGraphics.h" 33 #include "core/GameState.h" 35 34 36 35 namespace orxonox 37 36 { 38 class _OrxonoxExport GSStandalone : public GameState <GSGraphics>, public GSLevel37 class _OrxonoxExport GSStandalone : public GameState 39 38 { 40 39 public: 41 GSStandalone( );40 GSStandalone(const std::string& name); 42 41 ~GSStandalone(); 43 42 43 void activate(); 44 void deactivate(); 45 void update(const Clock& time); 46 44 47 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.