Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/orxonox.cc @ 3667

Last change on this file since 3667 was 3662, checked in by patrick, 19 years ago

orxonox/trunk:make

File size: 15.4 KB
RevLine 
[1850]1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program; if not, write to the Free Software Foundation,
18   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
19
[1855]20
21   ### File Specific:
22   main-programmer: Patrick Boenzli
[2190]23   co-programmer: Christian Meyer
[3660]24   co-programmer: Benjamin Grauer: injected ResourceManager/GraphicsEngine
[1850]25*/
26
[2190]27#include "orxonox.h"
[3610]28
[2036]29#include "world.h"
30#include "data_tank.h"
[2190]31#include "command_node.h"
[2636]32#include "game_loader.h"
[3610]33#include "graphics_engine.h"
[3655]34#include "resource_manager.h"
[3610]35
[2190]36#include <string.h>
[3662]37int verbose = 3;
[2036]38
[1803]39using namespace std;
40
[2190]41/**
[2636]42   \brief create a new Orxonox
[2190]43*/
44Orxonox::Orxonox ()
[1872]45{
46  pause = false;
47}
[1803]48
[2190]49/**
[2636]50   \brief remove Orxonox from memory
[2190]51*/
[1875]52Orxonox::~Orxonox () 
[2190]53{
[3226]54  Orxonox::singletonRef = NULL;
[2636]55  if( world != NULL) delete world;
56  if( localinput != NULL) delete world;
57  if( resources != NULL) delete resources;
[3611]58  delete GraphicsEngine::getInstance(); // deleting the Graphics
[3660]59  delete ResourceManager::getInstance(); // deletes the Resource Manager
[2190]60}
[1850]61
[3449]62/** \brief this is a singleton class to prevent duplicates */
[3226]63Orxonox* Orxonox::singletonRef = 0;
[1872]64
[3449]65/**
66   \returns reference or new Object of Orxonox if not existent.
67*/
[1850]68Orxonox* Orxonox::getInstance (void)
[1803]69{
[3226]70  if (singletonRef == NULL)
71    singletonRef = new Orxonox();
72  return singletonRef;
[1850]73}
74
[2190]75/**
[2636]76   \brief this finds the config file
77   
78   Since the config file varies from user to user and since one may want to specify different config files
79   for certain occasions or platforms this function finds the right config file for every occasion and stores
80   it's path and name into configfilename
[2190]81*/
[3226]82void Orxonox::getConfigFile (int argc, char** argv)
[1850]83{
[2636]84  strcpy (configfilename, "orxonox.conf");
[1803]85}
86
[2190]87/**
[2636]88   \brief initialize Orxonox with command line
[2190]89*/
90int Orxonox::init (int argc, char** argv)
[1803]91{
[2636]92  // parse command line
93  // config file
94 
[3226]95  getConfigFile (argc, argv);
[3174]96  SDL_Init (SDL_INIT_TIMER);
[2636]97  // initialize everything
[3226]98  if( initVideo() == -1) return -1;
99  if( initSound() == -1) return -1;
[2190]100  printf("> Initializing input\n");
[3226]101  if( initInput() == -1) return -1;
[2190]102  printf("> Initializing networking\n");
[3226]103  if( initNetworking () == -1) return -1;
[2190]104  printf("> Initializing resources\n");
[3226]105  if( initResources () == -1) return -1;
[2636]106  //printf("> Initializing world\n");
107  //if( init_world () == -1) return -1; PB: world will be initialized when started
108 
109  return 0;
[1850]110}
[1849]111
[2190]112/**
[2636]113   \brief initializes SDL and OpenGL
[2190]114*/
[3226]115int Orxonox::initVideo() 
[2190]116{
[3611]117  PRINTF(3)("> Initializing video\n");
[2190]118 
[3610]119  GraphicsEngine::getInstance();
[2190]120 
121  return 0;
122}
[1850]123
[3214]124
[2190]125/**
[2636]126   \brief initializes the sound engine
[2190]127*/
[3226]128int Orxonox::initSound() 
[2190]129{
[3174]130  printf("> Initializing sound\n");
[3226]131  // SDL_Init(SDL_INIT_AUDIO);
[2636]132  printf("Not yet implemented\n");
133  return 0;
[2190]134}
[1900]135
[3214]136
[2190]137/**
[2636]138   \brief initializes input functions
[2190]139*/
[3226]140int Orxonox::initInput() 
[2190]141{
[2636]142  // create localinput
143  localinput = new CommandNode( configfilename);
144 
145  return 0;
[1803]146}
147
[3214]148
[2190]149/**
[2636]150   \brief initializes network system
[2190]151*/
[3226]152int Orxonox::initNetworking() 
[1897]153{
[2636]154  printf("Not yet implemented\n");
155  return 0;
[1897]156}
157
[3214]158
[2190]159/**
[2636]160   \brief initializes and loads resource files
[2190]161*/
[3226]162int Orxonox::initResources() 
[1858]163{
[3655]164  //  printf("Not yet implemented\n");
165  PRINT(3)("initializing ResourceManager\n");
166  resourceManager = ResourceManager::getInstance();
[3658]167  resourceManager->setDataDir("../data/");
[2636]168  return 0;
[1858]169}
[1849]170
[3214]171
[2190]172/**
[2636]173   \brief initializes the world
[2190]174*/
[3226]175int Orxonox::initWorld() 
[1896]176{
[2636]177  //world = new World();
178 
179  // TO DO: replace this with a menu/intro
180  //world->load_debug_level();
181 
182  return 0;
[1896]183}
184
[2636]185
[2190]186/**
[2636]187   \brief starts the orxonox game or menu
188
189   here is the central orxonox state manager. There are currently two states
190   - menu
191   - game-play
192   both states manage their states themselfs again.
[2190]193*/
[2636]194void Orxonox::start()
195{
196 
197  this->gameLoader = GameLoader::getInstance();
198  this->gameLoader->loadDebugCampaign(DEBUG_CAMPAIGN_0);
199  this->gameLoader->init();
200  this->gameLoader->start();
201}
202
[3214]203
[2636]204/**
205   \brief exits Orxonox
206*/
[1875]207void Orxonox::quitGame() 
208{
[2636]209  bQuitOrxonox = true;
[1875]210}
211
212
[3214]213
[2190]214/**
[2636]215   \brief handles sprecial events from localinput
216   \param event: an event not handled by the CommandNode
[2190]217*/
[3226]218void Orxonox::eventHandler(SDL_Event* event)
[2190]219{
[2636]220  // Handle special events such as reshape, quit, focus changes
[3619]221  switch (event->type)
222    {
223    case SDL_VIDEORESIZE:
224      GraphicsEngine* tmpGEngine = GraphicsEngine::getInstance();
225      tmpGEngine->resolutionChanged(&event->resize);
226      break;
227    }
[2190]228}
[3214]229 
[1875]230
[2190]231/**
[2636]232   \brief handle keyboard commands that are not meant for WorldEntities
233   \param cmd: the command to handle
234   \return true if the command was handled by the system or false if it may be passed to the WorldEntities
[2190]235*/
[3226]236bool Orxonox::systemCommand(Command* cmd)
[2190]237{
[3220]238  /*
[2636]239  if( !strcmp( cmd->cmd, "quit"))
240    {
241      if( !cmd->bUp) this->gameLoader->stop();
242      return true;
243    }
244  return false;
[3220]245  */
246  return false;
[2190]247}
[1803]248
[2190]249/**
[2636]250   \brief retrieve a pointer to the local CommandNode
251   \return a pointer to localinput
[2190]252*/
[3226]253CommandNode* Orxonox::getLocalInput()
[1850]254{
[2636]255  return localinput;
[1803]256}
257
[3214]258
[2190]259/**
[2636]260   \brief retrieve a pointer to the local World
261   \return a pointer to world
[2190]262*/
[3226]263World* Orxonox::getWorld()
[1872]264{
[2636]265  return world;
[1872]266}
[1850]267
[3449]268/**
269   \return The reference of the SDL-screen of orxonox
270*/
[3365]271SDL_Surface* Orxonox::getScreen ()
272{
273  return this->screen;
274}
[3214]275
[3648]276
277
[3449]278/**
279   \brief main function
[3214]280
[3449]281   here the journey begins
282*/
[3226]283int main(int argc, char** argv) 
[1803]284{ 
[3648]285 
286  /* reading arguments
287     
288     currently supported arguments are:
289     <no args>                   ::    just starts orxonox
290     --benchmark                 ::    start the benchmark without starting orxonox
291     
292     this is a preselection: it matches to one of the start* functions, the
293     finetuning is made in those functions.
294  */
295
296
297  int i;
298  for(i = 0; i < argc; ++i)
299    {
300      if(! strcmp( "--help", argv[i])) return startHelp();
301      else if(! strcmp( "--benchmark", argv[i])) return startBenchmarks();
302    }
303
304  PRINTF(2)("Orxonox does not understand the arguments");
305  return startOrxonox(argc, argv);
306}
307
308
309
310int startHelp()
311{
312  printf("orxonox: starts the orxonox game - rules\n");
313  printf("usage: orxonox [arg]\n\n");
314  printf("valid options:\n");
315  printf(" --benchmark\tstarts the orxonox benchmark\n");
316  printf(" --help \tshows this menu\n");
317}
318
[3649]319
[3648]320int startOrxonox(int argc, char** argv)
321{
[2636]322  printf(">>> Starting Orxonox <<<\n");
[1850]323  Orxonox *orx = Orxonox::getInstance();
[2190]324 
[3226]325  if((*orx).init(argc, argv) == -1)
[2636]326    {
327      printf("! Orxonox initialization failed\n");
328      return -1;
329    }
330 
331  orx->start();
332 
[3660]333  //  delete orx;
[2190]334 
[1803]335}
[3648]336
337
[3649]338#include "list.h"
339#include "world_entity.h"
340#include "vector.h"
341#include "player.h"
[3651]342#include "base_object.h"
[3649]343#include "primitive.h"
344#include <asm/msr.h>
345#include <linux/timex.h>
346
347
[3661]348#define LIST_MAX 1000
[3649]349#define VECTOR_MAX 1000000
350#define ITERATIONS 10000
351
352
[3648]353int startBenchmarks()
354{
355
356  printf("===========================================================\n");
357  printf("=                      BENCHMARKS                         =\n");
358  printf("===========================================================\n");
[3650]359  printf(" the author is not paying any attention to cacheing effects\n");
360  printf(" of the CPU.\n\n");
361  printf("[title]\t\t\t\t\t     [cycles]\t[loops]\n\n");
362  //  printf("------------------------------------------------------------\n\n");
[3648]363
364  // first measure the time overhead:
365  unsigned long ini, end, dt, tmp;
366  rdtscl(ini); rdtscl(end);
367  dt = end - ini;
368
[3649]369  int type = -1; 
[3648]370  /* type   -1 == all
371     type    0 == framework
372     type    1 == vector
373     type    2 == quaternion
374  */
375  if(type == 0 || type == -1)
376    {
377      /* framework test*/
[3649]378
[3650]379      printf("Generating Objects:\t\t\t\t\t%i\n", ITERATIONS);
[3649]380      /* ************WorldEntity class test************** */
[3648]381      WorldEntity* w = NULL;
382      int i = 0;
383      unsigned long mittel = 0;
384     
385      for(i = 0; i < ITERATIONS; ++i)
386        {
387          rdtscl(ini);
388         
389          WorldEntity* w = new WorldEntity();
390         
391          rdtscl(end);
[3649]392          delete w;
[3648]393          mittel += (end - ini - dt);
394        }
395      float mi = mittel / (float)ITERATIONS;
[3650]396      printf(" Generate a WorldEntity object:\t\t%11.2f\n", mi);
[3648]397     
398      mittel = 0;
[3649]399      for(i = 0; i < ITERATIONS; ++i)
400        {
401          rdtscl(ini);
402         
403          WorldEntity* w = new Primitive(P_SPHERE);
404         
405          rdtscl(end);
406          delete w;
407          mittel += (end - ini - dt);
408        }
409      mi = mittel / (float)ITERATIONS;
[3650]410      printf(" Generate a Primitive  object:\t\t%11.2f\n", mi);
[3649]411
[3650]412
[3649]413      mittel = 0;
[3650]414      for(i = 0; i < ITERATIONS; ++i)
415        {
416          rdtscl(ini);
417         
418          Vector* v = new Vector();
419         
420          rdtscl(end);
421          delete v;
422          mittel += (end - ini - dt);
423        }
424      mi = mittel / (float)ITERATIONS;
425      printf(" Generate a Vector object:\t\t%11.2f\n", mi);
426
427
428     mittel = 0;
429      for(i = 0; i < ITERATIONS; ++i)
430        {
431          rdtscl(ini);
432         
433          Quaternion* q = new Quaternion();
434         
435          rdtscl(end);
436          delete q;
437          mittel += (end - ini - dt);
438        }
439      mi = mittel / (float)ITERATIONS;
440      printf(" Generate a Quaternion object:\t\t%11.2f\n", mi);
441
442
443
444
445      printf("\nCalling function inline &| virtual, \t\t\t%i\n", ITERATIONS);
446      mittel = 0;
[3648]447      w = new WorldEntity();
448      for(i = 0; i < ITERATIONS; ++i)
449        {
450          rdtscl(ini);
451         
452          w->tick(0.0f);
[3649]453
454          rdtscl(end);
455          mittel += (end - ini - dt);
456          }
457      //delete w;
458      mi = mittel / (float)ITERATIONS;
[3650]459      printf(" Virt funct tick() of WE: \t\t%11.2f\n", mi);
[3649]460
461
462      mittel = 0;
463      WorldEntity wo;
464      for(i = 0; i < ITERATIONS; ++i)
465        {
466          rdtscl(ini);
467         
468          wo.tick(0.0f);
[3648]469           
470          rdtscl(end);
471          mittel += (end - ini - dt);
472          }
[3649]473      //delete w;
[3648]474      mi = mittel / (float)ITERATIONS;
[3650]475      printf(" Inl virt funct tick() of WE v2: \t%11.2f\n", mi);
[3649]476
[3648]477     
[3651]478      mittel = 0;
479      BaseObject* bo = new BaseObject();
480      for(i = 0; i < ITERATIONS; ++i)
481        {
482          rdtscl(ini);
483         
484          bo->isFinalized();
485           
486          rdtscl(end);
487          mittel += (end - ini - dt);
488          }
489      //delete w;
490      mi = mittel / (float)ITERATIONS;
491      printf(" Inl funct BaseObject::isFinazlized(): \t%11.2f\n", mi);
492
493     
[3648]494      tList<WorldEntity>* list = new tList<WorldEntity>();
[3649]495
[3648]496     
[3649]497      /* ************Primitvie class test************** */
498      list = new tList<WorldEntity>();
499 
[3648]500     
501     
[3649]502      mittel = 0;
503      w = new Primitive(P_SPHERE);
504      for(i = 0; i < ITERATIONS; ++i)
[3648]505        {
[3649]506          rdtscl(ini);
507         
[3648]508          w->tick(0.0f);
[3649]509           
510          rdtscl(end);
511          mittel += (end - ini - dt);
512          }
513      mi = mittel / (float)ITERATIONS;
[3650]514      printf(" Call function tick() of Prim:\t\t%11.2f\n", mi);
[3648]515
[3649]516
[3648]517      }
518  if(type == 1 || type == -1)
519    {
[3650]520      printf("\nDoing some simple vector operations: \t\t\t%i\n", VECTOR_MAX);
[3648]521      /* vector test */
522      Vector* a = new Vector(1.3, 5.3, 4.1);
523      Vector* b = new Vector(0.4, 2.5, 6.2);
524      Vector* c = new Vector();
525     
[3650]526      unsigned long mittel, ini, end;
527      float mi;
[3648]528      int i = 0;
529      // addition
[3650]530      mittel = 0;
[3648]531      for(i = 0; i < VECTOR_MAX; ++i)
532        {
[3650]533          rdtscl(ini);
534         
[3648]535          *c = *a + *b;
[3650]536           
537          rdtscl(end);
538          mittel += (end - ini - dt);
[3648]539        }
[3650]540      mi = mittel / (float)VECTOR_MAX;
541      printf(" Addition of two vectors:\t\t%11.2f\n", mi);
[3648]542     
543      // multiplikation
[3650]544
545      mittel = 0;
[3648]546      for(i = 0; i < VECTOR_MAX; ++i)
547        {
[3650]548          rdtscl(ini);
549         
[3648]550          *c = a->cross( *b);
[3650]551           
552          rdtscl(end);
553          mittel += (end - ini - dt);
[3648]554        }
[3650]555      mi = mittel / (float)VECTOR_MAX;
556      printf(" CrossMult of two vectors:\t\t%11.2f\n", mi);
557
[3648]558      if(type == 1 || type == -1)
559        {
560          /* quaternion test */
[3650]561          printf("\nDoing some simple quaternion operations: \t\t%i\n", VECTOR_MAX);
562          /* vector test */
563          Quaternion* a = new Quaternion();
564          Quaternion* b = new Quaternion();
565          Quaternion* c = new Quaternion();
566         
567          unsigned long mittel, ini, end;
568          float mi;
569          int i = 0;
[3651]570          // quaternion generieren mit spez konstruktor
[3650]571          mittel = 0;
[3651]572          Vector* qa = new Vector(4.6, 9.3, 0.4);
573          Vector* qb = new Vector(3.5, 6.1, 4.3);
[3650]574          for(i = 0; i < VECTOR_MAX; ++i)
575            {
576              rdtscl(ini);
577             
[3651]578              Quaternion* qu = new Quaternion(*qa, *qb);
[3650]579             
580              rdtscl(end);
[3651]581              delete qu;
[3650]582              mittel += (end - ini - dt);
583            }
[3651]584          delete a;
585          delete b;
[3650]586          mi = mittel / (float)VECTOR_MAX;
[3651]587          printf(" Gen. quatern. betw. two vectors:\t%11.2f\n", mi);
[3648]588
[3650]589
590          // multiplication
591          mittel = 0;
592          for(i = 0; i < VECTOR_MAX; ++i)
593            {
594              rdtscl(ini);
595             
596              *c = *a * *b;
597             
598              rdtscl(end);
599              mittel += (end - ini - dt);
600            }
601          mi = mittel / (float)VECTOR_MAX;
[3651]602          printf(" Multiplying two quat.(=rot): a * b\t%11.2f\n", mi);
[3650]603         
[3651]604
605
606          // rotating a vector by a quaternion
607          mittel = 0;
608          for(i = 0; i < VECTOR_MAX; ++i)
609            {
610              rdtscl(ini);
611             
612              *qa = a->apply(*qb);
613             
614              rdtscl(end);
615              mittel += (end - ini - dt);
616            }
617          mi = mittel / (float)VECTOR_MAX;
618          printf(" Rot a vec by a quat: q->apply(v)\t%11.2f\n", mi);
[3650]619         
[3651]620         
621
622          // generate rotation matrix
623          mittel = 0;
624          float matrix[4][4];
625          for(i = 0; i < VECTOR_MAX; ++i)
626            {
627              rdtscl(ini);
628             
629              a->matrix(matrix);
630             
631              rdtscl(end);
632              mittel += (end - ini - dt);
633            }
634          mi = mittel / (float)VECTOR_MAX;
635          printf(" Generate rot matrix: q->matrix(m)\t%11.2f\n", mi);
[3648]636        }
[3661]637      if( type == 3 || type == -1)
638        {
639          /* list tests*/
640          printf("\nList operations tests: \t\t\t\t\t%i\n", LIST_MAX);
641          tList<char>* list = new tList<char>();
642          char* name;
643
644          printf(" Adding[1..10] elements to list, found:\n");
645          list->add("1");
646          list->add("2");
647          list->add("3");
648          list->add("4");
649          list->add("5");
650          list->add("6");
651          list->add("7");
652          list->add("8");
653          list->add("9");
654          list->add("10");
655
656          /*give list out */
657          tIterator<char>* iterator = list->getIterator();
658          name = iterator->nextElement();
659          printf("  List Elements: \t\t");
660          while( name != NULL)
661            {
662              printf("%s,", name);
663              name = iterator->nextElement();
664            }
665          delete iterator;
666          printf("\n");
667
668
669          /*removing some elements from the list*/
670          printf(" Removing elements [2,3,6,8,10], adding [11] now found:\n");
671          list->remove("2");
672          list->remove("3");
673          list->remove("6");
674          list->remove("8");
675          list->remove("10");
676          list->add("11");
677          /*give list out */
678          iterator = list->getIterator();
679          name = iterator->nextElement();
680          printf("  List Elements: \t\t");
681          while( name != NULL)
682            {
683              printf("%s,", name);
684              name = iterator->nextElement();
685            }
686          delete iterator;
687          printf("\n");
688         
689          delete list;
690          printf("\nChecking list performance:\t\t\t\t%i\n", LIST_MAX);
691
692          tList<int>* plist = new tList<int>();
693          unsigned long mittel, ini, end;
694          float mi;
695          int i = 0;
696          mittel = 0;
697          for(i = 0; i < LIST_MAX; ++i)
698            {
699              rdtscl(ini);
700             
701              plist->add(&i);
702             
703              rdtscl(end);
704              mittel += (end - ini - dt);
705            }
706          mi = mittel / (float)LIST_MAX;
707          printf(" Adding reference to list:\t\t%11.2f\n", mi);
708
709          mittel = 0;
710          for(i = 0; i < LIST_MAX; ++i)
711            {
712              rdtscl(ini);
713             
714              plist->remove(&i);
715             
716              rdtscl(end);
717              mittel += (end - ini - dt);
718            }
719          mi = mittel / (float)LIST_MAX;
720          printf(" Removing 1st reference from list:\t%11.2f\n", mi);
721         
722         
723
724        }
[3648]725    }
726}
Note: See TracBrowser for help on using the repository browser.