Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/orxonox.cc @ 263

Last change on this file since 263 was 263, checked in by landauf, 17 years ago

removed "using namespace Ogre"
added "namespace orxonox{}"
added all needed Ogre:: tokens

File size: 7.8 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *
4 *
5 *   License notice:
6 *
7 *   This program is free software: you can redistribute it and/or modify
8 *   it under the terms of the GNU General Public License as published by
9 *   the Free Software Foundation, either version 3 of the License, or
10 *   (at your option) any later version.
11 *
12 *   This program is distributed in the hope that it will be useful,
13 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
14 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 *   GNU General Public License for more details.
16 *
17 *   You should have received a copy of the GNU General Public License
18 *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 *
20 *
21 *   Author:
22 *      Benjamin Knecht <beni_at_orxonox.net>, (C) 2007
23 *   Co-authors:
24 *      ...
25 *
26 */
27
28/**
29 @file  orxonox.cc
30 @brief Orxonox Main File
31 */
32
33#include <Ogre.h>
34#include <OIS/OIS.h>
35#include <CEGUI/CEGUI.h>
36#include <OgreCEGUIRenderer.h>
37
38#include <string>
39#include <iostream>
40
41#include "../xml/xmlParser.h"
42#include "../loader/LevelLoader.h"
43
44
45// some tests to see if enet works without includsion
46//#include <enet/enet.h>
47//#include <enet/protocol.h>
48
49#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
50#include <CoreFoundation/CoreFoundation.h>
51
52// This function will locate the path to our application on OS X,
53// unlike windows you can not rely on the curent working directory
54// for locating your configuration files and resources.
55std::string macBundlePath()
56{
57  char path[1024];
58  CFBundleRef mainBundle = CFBundleGetMainBundle();
59  assert(mainBundle);
60
61  CFURLRef mainBundleURL = CFBundleCopyBundleURL(mainBundle);
62  assert(mainBundleURL);
63
64  CFStringRef cfStringRef = CFURLCopyFileSystemPath( mainBundleURL, kCFURLPOSIXPathStyle);
65  assert(cfStringRef);
66
67  CFStringGetCString(cfStringRef, path, 1024, kCFStringEncodingASCII);
68
69  CFRelease(mainBundleURL);
70  CFRelease(cfStringRef);
71
72  return std::string(path);
73}
74#endif
75
76namespace orxonox
77{
78    class OrxExitListener : public Ogre::FrameListener
79    {
80      public:
81        OrxExitListener(OIS::Keyboard *keyboard)
82      : mKeyboard(keyboard)
83        {
84        }
85
86        bool frameStarted(const Ogre::FrameEvent& evt)
87        {
88          mKeyboard->capture();
89          return !mKeyboard->isKeyDown(OIS::KC_ESCAPE);
90        }
91
92      private:
93        OIS::Keyboard *mKeyboard;
94    };
95
96    class OrxApplication
97    {
98      public:
99        void go()
100        {
101          createRoot();
102          defineResources();
103          setupRenderSystem();
104          createRenderWindow();
105          initializeResourceGroups();
106          createScene();
107          setupScene();
108          setupInputSystem();
109          setupCEGUI();
110          createFrameListener();
111          startRenderLoop();
112        }
113
114        ~OrxApplication()
115        {
116          mInputManager->destroyInputObject(mKeyboard);
117          OIS::InputManager::destroyInputSystem(mInputManager);
118
119    //       delete mRenderer;
120    //       delete mSystem;
121
122          delete mListener;
123          delete mRoot;
124        }
125
126      private:
127        Ogre::Root *mRoot;
128        OIS::Keyboard *mKeyboard;
129        OIS::Mouse *mMouse;
130        OIS::InputManager *mInputManager;
131        CEGUI::OgreCEGUIRenderer *mRenderer;
132        CEGUI::System *mSystem;
133        OrxExitListener *mListener;
134
135        void createRoot()
136        {
137    #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
138          mRoot = new Ogre::Root(macBundlePath() + "/Contents/Resources/plugins.cfg");
139    #else
140          mRoot = new Ogre::Root();
141    #endif
142        }
143
144        void defineResources()
145        {
146          Ogre::String secName, typeName, archName;
147          Ogre::ConfigFile cf;
148    #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
149          cf.load(macBundlePath() + "/Contents/Resources/resources.cfg");
150    #else
151          cf.load("resources.cfg");
152    #endif
153
154          Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
155          while (seci.hasMoreElements())
156          {
157            secName = seci.peekNextKey();
158            Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
159            Ogre::ConfigFile::SettingsMultiMap::iterator i;
160            for (i = settings->begin(); i != settings->end(); ++i)
161            {
162              typeName = i->first;
163              archName = i->second;
164    #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
165              Ogre::ResourceGroupManager::getSingleton().addResourceLocation( String(macBundlePath() + "/" + archName), typeName, secName);
166    #else
167              Ogre::ResourceGroupManager::getSingleton().addResourceLocation( archName, typeName, secName);
168    #endif
169            }
170          }
171        }
172
173        void setupRenderSystem()
174        {
175          if (!mRoot->restoreConfig() && !mRoot->showConfigDialog())
176            throw Ogre::Exception(52, "User canceled the config dialog!", "OrxApplication::setupRenderSystem()");
177        }
178
179        void createRenderWindow()
180        {
181          mRoot->initialise(true, "Ogre Render Window");
182        }
183
184        void initializeResourceGroups()
185        {
186          Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5);
187          Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
188        }
189
190        void createScene(void)
191        {
192
193          string levelFile = "sp_level_moonstation.oxw";
194          loader::LevelLoader* loader = new loader::LevelLoader(levelFile);
195        }
196
197        void setupScene()
198        {
199          Ogre::SceneManager *mgr = mRoot->createSceneManager(Ogre::ST_GENERIC, "Default SceneManager");
200          Ogre::Camera *cam = mgr->createCamera("Camera");
201          Ogre::Viewport *vp = mRoot->getAutoCreatedWindow()->addViewport(cam);
202        }
203
204        void setupInputSystem()
205        {
206          size_t windowHnd = 0;
207          std::ostringstream windowHndStr;
208          OIS::ParamList pl;
209          Ogre::RenderWindow *win = mRoot->getAutoCreatedWindow();
210
211          win->getCustomAttribute("WINDOW", &windowHnd);
212          windowHndStr << windowHnd;
213          pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
214          mInputManager = OIS::InputManager::createInputSystem(pl);
215
216          try
217          {
218            mKeyboard = static_cast<OIS::Keyboard*>(mInputManager->createInputObject(OIS::OISKeyboard, false));
219            mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject(OIS::OISMouse, false));
220          }
221          catch (const OIS::Exception &e)
222          {
223            throw new Ogre::Exception(42, e.eText, "OrxApplication::setupInputSystem");
224          }
225        }
226
227        void setupCEGUI()
228        {
229          Ogre::SceneManager *mgr = mRoot->getSceneManager("Default SceneManager");
230          Ogre::RenderWindow *win = mRoot->getAutoCreatedWindow();
231
232          // CEGUI setup
233    //       mRenderer = new CEGUI::OgreCEGUIRenderer(win, Ogre::RENDER_QUEUE_OVERLAY, false, 3000, mgr);
234    //       mSystem = new CEGUI::System(mRenderer);
235
236          // Other CEGUI setup here.
237        }
238
239        void createFrameListener()
240        {
241          mListener = new OrxExitListener(mKeyboard);
242          mRoot->addFrameListener(mListener);
243        }
244
245        void startRenderLoop()
246        {
247          mRoot->startRendering();
248        }
249    };
250}
251
252using namespace Ogre;
253
254#if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32
255#define WIN32_LEAN_AND_MEAN
256#include "windows.h"
257
258             INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT)
259#else
260             int main(int argc, char **argv)
261#endif
262{
263  try
264  {
265    orxonox::OrxApplication orxonox;
266    orxonox.go();
267  }
268  catch(Exception& e)
269  {
270#if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32
271    MessageBoxA(NULL, e.getFullDescription().c_str(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
272#else
273    fprintf(stderr, "An exception has occurred: %s\n",
274            e.getFullDescription().c_str());
275#endif
276  }
277
278  return 0;
279}
280
Note: See TracBrowser for help on using the repository browser.