Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/branches/levelloader/src/orxonox.cc @ 4181

Last change on this file since 4181 was 3753, checked in by patrick, 20 years ago

branches/levelloader: now compiling again under linux

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