Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/FICN/src/orxonox/orxonox.cc @ 489

Last change on this file since 489 was 487, checked in by nicolasc, 17 years ago

fix

File size: 11.9 KB
RevLine 
[74]1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *
4 *
5 *   License notice:
6 *
[462]7 *   This program is free software; you can redistribute it and/or
8 *   modify it under the terms of the GNU General Public License
9 *   as published by the Free Software Foundation; either version 2
10 *   of the License, or (at your option) any later version.
[74]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
[462]18 *   along with this program; if not, write to the Free Software
19 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
[74]20 *
21 *   Author:
22 *      Benjamin Knecht <beni_at_orxonox.net>, (C) 2007
23 *   Co-authors:
24 *      ...
25 *
26 */
27
[142]28/**
29 @file  orxonox.cc
[462]30 @brief Orxonox Main Class
[142]31 */
32
[462]33#include "orxonox.h"
34#include "graphicsEngine.h"
35
[379]36//#include <Ogre.h>
37// 40% speed up: (instead of Ogre.h)
38#include <OgreSceneNode.h>
39#include <OgreSceneManager.h>
40#include <OgreRoot.h>
41#include <OgreFrameListener.h>
42#include <OgreConfigFile.h>
43#include <OgreTextureManager.h>
44#include <OgreEntity.h>
45#include <OgreRenderWindow.h>
46
[137]47#include <OIS/OIS.h>
[346]48//#include <CEGUI/CEGUI.h>
49//#include <OgreCEGUIRenderer.h>
[74]50
[164]51#include <string>
52#include <iostream>
53
[462]54#include "../xml/xmlParser.h"
55#include "../loader/LevelLoader.h"
56#include "../audio/AudioManager.h"
[164]57
[337]58#include "spaceship_steering.h"
59SpaceshipSteering* steering;
[164]60
[337]61
[459]62//network stuff
[462]63#include "../network/Server.h"
64#include "../network/Client.h"
[473]65#include "../network/NetworkFrameListener.h"
[459]66
[151]67// some tests to see if enet works without includsion
68//#include <enet/enet.h>
69//#include <enet/protocol.h>
[142]70
[74]71
[337]72namespace orxonox
73{
[462]74  using namespace Ogre;
[74]75
[462]76   // put this in seperate Class or solve the problem in another fashion
77  class OrxListener : public FrameListener, public OIS::MouseListener
78  {
79    public:
80      OrxListener(OIS::Keyboard *keyboard, OIS::Mouse *mouse, audio::AudioManager*  auMan)
81      : mKeyboard(keyboard), mMouse(mouse)
82      {
83        speed = 250;
84        loop = 100;
85        rotate = 10;
86        mouseX = 0;
87        mouseY = 0;
88        maxMouseX = 0;
89        minMouseX = 0;
[337]90        moved = false;
[462]91        steering->brakeRotate(rotate*10);
92        steering->brakeLoop(loop);
93        mMouse->setEventCallback(this);
94        auMan_ = auMan;
[265]95      }
[462]96      bool frameStarted(const FrameEvent& evt)
97      {
[135]98
[462]99        auMan_->update();
[74]100
[462]101        mKeyboard->capture();
102        mMouse->capture();
103        if (mKeyboard->isKeyDown(OIS::KC_UP) || mKeyboard->isKeyDown(OIS::KC_W))
104          steering->moveForward(speed);
105        else
106          steering->moveForward(0);
107        if(mKeyboard->isKeyDown(OIS::KC_DOWN) || mKeyboard->isKeyDown(OIS::KC_S))
108          steering->brakeForward(speed);
109        else
110          steering->brakeForward(speed/10);
111        if (mKeyboard->isKeyDown(OIS::KC_RIGHT) || mKeyboard->isKeyDown(OIS::KC_D))
112          steering->loopRight(loop);
113        else
114          steering->loopRight(0);
115        if (mKeyboard->isKeyDown(OIS::KC_LEFT) || mKeyboard->isKeyDown(OIS::KC_A))
116          steering->loopLeft(loop);
117        else
118          steering->loopLeft(0);
[337]119
[462]120        if(moved) {
121          if (mouseY<0)
122            steering->rotateUp(-mouseY*rotate);
123          if (mouseY>0)
124            steering->rotateDown(mouseY*rotate);
125          if (mouseX>0)
126            steering->rotateRight(mouseX*rotate);
127          if (mouseX<0)
128            steering->rotateLeft(-mouseX*rotate);
129          moved = false;
130        }
131        else {
132          steering->rotateUp(0);
133          steering->rotateDown(0);
134          steering->rotateRight(0);
135          steering->rotateLeft(0);
136        }
[337]137
[462]138        steering->tick(evt.timeSinceLastFrame);
139//      scenemanager->spacehip->tick(evt.timesincelastframe);
140        if(mKeyboard->isKeyDown(OIS::KC_ESCAPE))
141          cout << "maximal MouseX: " << maxMouseX << "\tminMouseX: " << minMouseX << endl;
142        return !mKeyboard->isKeyDown(OIS::KC_ESCAPE);
143      }
[337]144
[462]145      bool mouseMoved(const OIS::MouseEvent &e)
[265]146      {
[462]147        mouseX = e.state.X.rel;
148        mouseY = e.state.Y.rel;
149        if(mouseX>maxMouseX) maxMouseX = mouseX;
150        if(mouseX<minMouseX) minMouseX = mouseX;
151        cout << "mouseX: " << mouseX << "\tmouseY: " << mouseY << endl;
152        moved = true;
153        return true;
[265]154      }
[74]155
[462]156      bool mousePressed(const OIS::MouseEvent &e, OIS::MouseButtonID id) { return true; }
157      bool mouseReleased(const OIS::MouseEvent &e, OIS::MouseButtonID id) { return true; }
[137]158
[265]159    private:
[462]160      float speed;
161      float rotate;
162      float loop;
163      float mouseY;
164      float mouseX;
165      float maxMouseX;
166      float minMouseX;
167      bool moved;
[265]168      OIS::Keyboard *mKeyboard;
169      OIS::Mouse *mMouse;
[462]170      audio::AudioManager*  auMan_;
171  };
172  // init static singleton reference of Orxonox
173  Orxonox* Orxonox::singletonRef_ = NULL;
[137]174
[462]175  /**
176   * create a new instance of Orxonox
177   */
178  Orxonox::Orxonox()
179  {
180    ogre_ = new GraphicsEngine();
181  }
[74]182
[462]183  /**
184   * destruct Orxonox
185   */
186  Orxonox::~Orxonox()
187  {
188    // nothing to delete as for now
189  }
[265]190
[462]191  /**
192   * initialization of Orxonox object
193   * @param argc argument counter
194   * @param argv list of arguments
195   * @param path path to config (in home dir or something)
196   */
197  void Orxonox::init(int argc, char **argv, std::string path)
198  {
199    //TODO: initialization with command line parameters
200    //TODO: find config file (assuming executable directory)
201    //TODO: read config file
202    //TODO: give config file to Ogre
203    if(argc >=2 && strcmp(argv[1], "server")==0)
204    {
205      serverInit(path);
206    }
207    else if(argc >=2 && strcmp(argv[1], "client")==0)
208    {
209      clientInit(path);
210    }
211    standalone(path);
212  }
[263]213
[462]214  /**
215   * start modules
216   */
217  void Orxonox::start()
218  {
219    //TODO: start modules
[480]220
[462]221    //TODO: run engine
222  }
[74]223
[462]224  /**
225   * @return singleton object
226   */
227  Orxonox* Orxonox::getSingleton()
228  {
229    if (!singletonRef_)
230      singletonRef_ = new Orxonox();
231    return singletonRef_;
232  }
[74]233
[462]234  /**
235   * error kills orxonox
236   */
237  void Orxonox::die(/* some error code */)
238  {
239    //TODO: destroy and destruct everything and print nice error msg
240  }
[74]241
[462]242  void Orxonox::standalone(std::string path)
243  {
244    ogre_->setConfigPath(path);
245    ogre_->setup();
[473]246    root_ = ogre_->getRoot();
247    //if(!ogre_->load()) die(/* unable to load */);
248
249    defineResources();
250    setupRenderSystem();
251    createRenderWindow();
252    initializeResourceGroups();
253    createScene();
254    setupScene();
255    setupInputSystem();
256    createFrameListener();
257    startRenderLoop();
[462]258  }
[74]259
[462]260  void Orxonox::serverInit(std::string path)
261  {
262    ogre_->setConfigPath(path);
263    ogre_->setup();
[473]264    server_g = new network::Server(); // add some settings if wanted
[462]265    if(!ogre_->load()) die(/* unable to load */);
266    //ogre_->getRoot()->addFrameListener(new network::ServerFrameListener());
267    ogre_->startRender();
[389]268
[462]269    createScene();
270    setupScene();
271  }
[164]272
[462]273  void Orxonox::clientInit(std::string path)
274  {
275    ogre_->setConfigPath(path);
276    ogre_->setup();
[473]277    client_g = new network::Client(); // address here
[462]278    if(!ogre_->load()) die(/* unable to load */);
279    //ogre_->getRoot()->addFrameListener(new network::ClientFrameListener());
280    ogre_->startRender();
[389]281
[462]282    createScene();
283    setupScene();
284    setupInputSystem();
285    createFrameListener();
286    startRenderLoop();
287  }
[258]288
[473]289  void Orxonox::defineResources()
290  {
291    Ogre::String secName, typeName, archName;
292    Ogre::ConfigFile cf;
293#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
294    cf.load(macBundlePath() + "/Contents/Resources/resources.cfg");
295#else
296    cf.load("resources.cfg");
297#endif
298
299    Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
300    while (seci.hasMoreElements())
301    {
302      secName = seci.peekNextKey();
303      Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
304      Ogre::ConfigFile::SettingsMultiMap::iterator i;
305      for (i = settings->begin(); i != settings->end(); ++i)
306      {
307        typeName = i->first;
308        archName = i->second;
309#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
310        Ogre::ResourceGroupManager::getSingleton().addResourceLocation( String(macBundlePath() + "/" + archName), typeName, secName);
311#else
312        Ogre::ResourceGroupManager::getSingleton().addResourceLocation( archName, typeName, secName);
313#endif
314      }
315    }
316  }
317
318  void Orxonox::setupRenderSystem()
319  {
320    if (!root_->restoreConfig() && !root_->showConfigDialog())
321      throw Exception(52, "User canceled the config dialog!", "OrxApplication::setupRenderSystem()");
322  }
323
324  void Orxonox::createRenderWindow()
325  {
326    root_->initialise(true, "OrxonoxV2");
327  }
328
329  void Orxonox::initializeResourceGroups()
330  {
331    TextureManager::getSingleton().setDefaultNumMipmaps(5);
332    ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
333  }
334
[462]335  void Orxonox::createScene(void)
336  {
[480]337        // Init audio
[462]338    auMan_ = new audio::AudioManager();
[487]339
[480]340    // load this file from config
341    loader_ = new loader::LevelLoader("sample.oxw");
342    loader_->loadLevel();
[337]343
[480]344        /*
[462]345    auMan_->ambientAdd("a1");
346    auMan_->ambientAdd("a2");
347    auMan_->ambientAdd("a3");
348                                //auMan->ambientAdd("ambient1");
349    auMan_->ambientStart();
[480]350        */
[462]351  }
[337]352
353
[462]354  void Orxonox::setupScene()
355  {
356    SceneManager *mgr = ogre_->getSceneManager();
357    Camera *cam = mgr->createCamera("Camera");
358    cam->setPosition(Vector3(0,0,-250));
359    cam->lookAt(Vector3(0,0,0));
360    Viewport *vp = ogre_->getRoot()->getAutoCreatedWindow()->addViewport(cam);
[337]361
[487]362
363    Entity* head = mgr->createEntity("ASSF", "assf2.mesh");
[462]364    SceneNode *node = mgr->getRootSceneNode()->createChildSceneNode("OgreHeadNode", Vector3(0,0,0));
365    node->attachObject(head);
366    node->attachObject(cam);
367    mgr->setSkyBox(true, "Examples/SceneSkyBox2");
[74]368
[462]369    Entity* head1 = mgr->createEntity("head1", "ogrehead.mesh");
370    SceneNode *node1 = mgr->getRootSceneNode()->createChildSceneNode("OgreHeadNode1", Vector3(200,0,0));
371    node1->attachObject(head1);
372    Entity* head2 = mgr->createEntity("head2", "ogrehead.mesh");
373    SceneNode *node2 = mgr->getRootSceneNode()->createChildSceneNode("OgreHeadNode2", Vector3(200,400,-100));
374    node2->attachObject(head2);
375    Entity* head3 = mgr->createEntity("head3", "ogrehead.mesh");
376    SceneNode *node3 = mgr->getRootSceneNode()->createChildSceneNode("OgreHeadNode3", Vector3(0,400,200));
377    node3->attachObject(head3);
378    Entity* head4 = mgr->createEntity("head4", "ogrehead.mesh");
379    SceneNode *node4 = mgr->getRootSceneNode()->createChildSceneNode("OgreHeadNode4", Vector3(-400,-200,600));
380    node4->attachObject(head4);
381    Entity* head5 = mgr->createEntity("head5", "ogrehead.mesh");
382    SceneNode *node5 = mgr->getRootSceneNode()->createChildSceneNode("OgreHeadNode5", Vector3(0,0,-400));
383    node5->attachObject(head5);
[74]384
[462]385    steering = new SpaceshipSteering(500, 200, 200, 200);
386    steering->addNode(node);
[74]387
[482]388
[462]389  }
[137]390
391
[462]392  void Orxonox::setupInputSystem()
393  {
394    size_t windowHnd = 0;
395    std::ostringstream windowHndStr;
396    OIS::ParamList pl;
397    Ogre::RenderWindow *win = ogre_->getRoot()->getAutoCreatedWindow();
[137]398
[462]399    win->getCustomAttribute("WINDOW", &windowHnd);
400    windowHndStr << windowHnd;
401    pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
402    inputManager_ = OIS::InputManager::createInputSystem(pl);
[265]403
[462]404    try
[337]405    {
[462]406      keyboard_ = static_cast<OIS::Keyboard*>(inputManager_->createInputObject(OIS::OISKeyboard, false));
407      mouse_ = static_cast<OIS::Mouse*>(inputManager_->createInputObject(OIS::OISMouse, true));
[337]408    }
[462]409    catch (const OIS::Exception &e)
[459]410    {
[462]411      throw new Ogre::Exception(42, e.eText, "OrxApplication::setupInputSystem");
[459]412    }
[462]413  }
[137]414
[462]415  // we actually want to do this differently...
416  void Orxonox::createFrameListener()
[137]417  {
[462]418    frameListener_ = new OrxListener(keyboard_, mouse_, auMan_);
419    ogre_->getRoot()->addFrameListener(frameListener_);
[137]420  }
[462]421
422  void Orxonox::startRenderLoop()
[137]423  {
[462]424    ogre_->getRoot()->startRendering();
[74]425  }
426}
[137]427
[462]428
Note: See TracBrowser for help on using the repository browser.