Index: code/branches/main_reto/src/orxonox.cc
===================================================================
--- code/branches/main_reto/src/orxonox.cc	(revision 155)
+++ code/branches/main_reto/src/orxonox.cc	(revision 171)
@@ -20,5 +20,5 @@
  *
  *   Author:
- *      Benjamin Knecht <beni_at_orxonox.net>, (C) 2007
+ *      Reto Grieder
  *   Co-authors:
  *      ...
@@ -27,236 +27,94 @@
 
 /**
- @file  orxonox.cc
- @brief Orxonox Main File
- */
+* Basic part of the game.
+* It sets up Ogre and most important of all: Orxonox is the master of the
+* main loop and therefore time itself.
+*/
 
-#include <Ogre.h>
-#include <OIS/OIS.h>
-#include <CEGUI/CEGUI.h>
-#include <OgreCEGUIRenderer.h>
+#include "OgreRoot.h"
+#include "OgreTimer.h"
+#include "OgreWindowEventUtilities.h"
 
-// some tests to see if enet works without includsion
-//#include <enet/enet.h>
-//#include <enet/protocol.h>
+#include "ogre_control.h"
+#include "run_manager.h"
+#include "orxonox.h"
 
-#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
-#include <CoreFoundation/CoreFoundation.h>
 
-// This function will locate the path to our application on OS X,
-// unlike windows you can not rely on the curent working directory
-// for locating your configuration files and resources.
-std::string macBundlePath()
-{
-  char path[1024];
-  CFBundleRef mainBundle = CFBundleGetMainBundle();
-  assert(mainBundle);
+namespace orxonox {
 
-  CFURLRef mainBundleURL = CFBundleCopyBundleURL(mainBundle);
-  assert(mainBundleURL);
-
-  CFStringRef cfStringRef = CFURLCopyFileSystemPath( mainBundleURL, kCFURLPOSIXPathStyle);
-  assert(cfStringRef);
-
-  CFStringGetCString(cfStringRef, path, 1024, kCFStringEncodingASCII);
-
-  CFRelease(mainBundleURL);
-  CFRelease(cfStringRef);
-
-  return std::string(path);
-}
-#endif
-
-using namespace Ogre;
-
-class OrxExitListener : public FrameListener
-{
-  public:
-    OrxExitListener(OIS::Keyboard *keyboard)
-  : mKeyboard(keyboard)
-    {
-    }
-
-    bool frameStarted(const FrameEvent& evt)
-    {
-      mKeyboard->capture();
-      return !mKeyboard->isKeyDown(OIS::KC_ESCAPE);
-    }
-
-  private:
-    OIS::Keyboard *mKeyboard;
-};
-
-class OrxApplication
-{
-  public:
-    void go()
-    {
-      createRoot();
-      defineResources();
-      setupRenderSystem();
-      createRenderWindow();
-      initializeResourceGroups();
-      setupScene();
-      setupInputSystem();
-      setupCEGUI();
-      createFrameListener();
-      startRenderLoop();
-    }
-
-    ~OrxApplication()
-    {
-      mInputManager->destroyInputObject(mKeyboard);
-      OIS::InputManager::destroyInputSystem(mInputManager);
-
-//       delete mRenderer;
-//       delete mSystem;
-
-      delete mListener;
-      delete mRoot;
-    }
-
-  private:
-    Root *mRoot;
-    OIS::Keyboard *mKeyboard;
-    OIS::Mouse *mMouse;
-    OIS::InputManager *mInputManager;
-    CEGUI::OgreCEGUIRenderer *mRenderer;
-    CEGUI::System *mSystem;
-    OrxExitListener *mListener;
-
-    void createRoot()
-    {
-#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
-      mRoot = new Root(macBundlePath() + "/Contents/Resources/plugins.cfg");
-#else
-      mRoot = new Root();
-#endif
-    }
-
-    void defineResources()
-    {
-      String secName, typeName, archName;
-      ConfigFile cf;
-#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
-      cf.load(macBundlePath() + "/Contents/Resources/resources.cfg");
-#else
-      cf.load("resources.cfg");
-#endif
-
-      ConfigFile::SectionIterator seci = cf.getSectionIterator();
-      while (seci.hasMoreElements())
-      {
-        secName = seci.peekNextKey();
-        ConfigFile::SettingsMultiMap *settings = seci.getNext();
-        ConfigFile::SettingsMultiMap::iterator i;
-        for (i = settings->begin(); i != settings->end(); ++i)
-        {
-          typeName = i->first;
-          archName = i->second;
-#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
-          ResourceGroupManager::getSingleton().addResourceLocation( String(macBundlePath() + "/" + archName), typeName, secName);
-#else
-          ResourceGroupManager::getSingleton().addResourceLocation( archName, typeName, secName);
-#endif
-        }
-      }
-    }
-
-    void setupRenderSystem()
-    {
-      if (!mRoot->restoreConfig() && !mRoot->showConfigDialog())
-        throw Exception(52, "User canceled the config dialog!", "OrxApplication::setupRenderSystem()");
-    }
-
-    void createRenderWindow()
-    {
-      mRoot->initialise(true, "Ogre Render Window");
-    }
-
-    void initializeResourceGroups()
-    {
-      TextureManager::getSingleton().setDefaultNumMipmaps(5);
-      ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
-    }
-
-    void setupScene()
-    {
-      SceneManager *mgr = mRoot->createSceneManager(ST_GENERIC, "Default SceneManager");
-      Camera *cam = mgr->createCamera("Camera");
-      Viewport *vp = mRoot->getAutoCreatedWindow()->addViewport(cam);
-    }
-
-    void setupInputSystem()
-    {
-      size_t windowHnd = 0;
-      std::ostringstream windowHndStr;
-      OIS::ParamList pl;
-      RenderWindow *win = mRoot->getAutoCreatedWindow();
-
-      win->getCustomAttribute("WINDOW", &windowHnd);
-      windowHndStr << windowHnd;
-      pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
-      mInputManager = OIS::InputManager::createInputSystem(pl);
-
-      try
-      {
-        mKeyboard = static_cast<OIS::Keyboard*>(mInputManager->createInputObject(OIS::OISKeyboard, false));
-        mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject(OIS::OISMouse, false));
-      }
-      catch (const OIS::Exception &e)
-      {
-        throw new Exception(42, e.eText, "OrxApplication::setupInputSystem");
-      }
-    }
-
-    void setupCEGUI()
-    {
-      SceneManager *mgr = mRoot->getSceneManager("Default SceneManager");
-      RenderWindow *win = mRoot->getAutoCreatedWindow();
-
-      // CEGUI setup
-//       mRenderer = new CEGUI::OgreCEGUIRenderer(win, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, mgr);
-//       mSystem = new CEGUI::System(mRenderer);
-
-      // Other CEGUI setup here.
-    }
-
-    void createFrameListener()
-    {
-      mListener = new OrxExitListener(mKeyboard);
-      mRoot->addFrameListener(mListener);
-    }
-
-    void startRenderLoop()
-    {
-      mRoot->startRendering();
-    }
-};
-
-#if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32
-#define WIN32_LEAN_AND_MEAN
-#include "windows.h"
-
-             INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT)
-#else
-             int main(int argc, char **argv)
-#endif
-{
-  try
+  /**
+  * Empty Constructor.
+  */
+  Orxonox::Orxonox()
   {
-    OrxApplication orxonox;
-    orxonox.go();
-  }
-  catch(Exception& e)
-  {
-#if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32
-    MessageBoxA(NULL, e.getFullDescription().c_str(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
-#else
-    fprintf(stderr, "An exception has occurred: %s\n",
-            e.getFullDescription().c_str());
-#endif
   }
 
-  return 0;
+
+  /**
+  * Empty Destructor.
+  */
+  Orxonox::~Orxonox()
+  {
+  }
+
+
+  /**
+  * Starts and runs the game
+  */
+  void Orxonox::go(void)
+  {
+	  if (!setup())
+		  return;
+
+    timer_ = new Ogre::Timer();
+
+	  unsigned long lastTime = timer_->getMilliseconds();
+
+	  while (true)
+	  {
+		  //Pump messages in all registered RenderWindow windows
+      Ogre::WindowEventUtilities::messagePump();
+
+		  ogre_->getRoot()->renderOneFrame();
+
+		  if (!runMgr_->tick(timer_->getMilliseconds(),
+              (timer_->getMilliseconds() - lastTime) / 1000.0))
+			  break;
+		  lastTime = timer_->getMilliseconds();
+	  }
+
+	  // clean up
+	  destroy();
+  }
+
+
+  /**
+  * Create render engine, render window and the Run manager.
+  * @return False if failed.
+  */
+  bool Orxonox::setup(void)
+  {
+	  // create new 3D ogre render engine
+	  ogre_ = new OgreControl();
+	  ogre_->initialise();
+
+	  runMgr_ = new RunManager(ogre_);
+
+	  return true;
+  }
+
+
+  /**
+  * Clean everything up.
+  */
+  void Orxonox::destroy()
+  {
+	  if (timer_)
+		  delete timer_;
+	  if (runMgr_)
+		  delete runMgr_;
+	  if (ogre_)
+		  delete ogre_;
+  }
+
 }
-
