Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 4009 was 4009, checked in by bensch, 19 years ago

orxonox/trunk: little patch…. should work again on osX

File size: 16.6 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 "text_engine.h"
36
37#include <string.h>
38int verbose = 4;
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  delete TextEngine::getInstance();
62}
63
64/** \brief this is a singleton class to prevent duplicates */
65Orxonox* Orxonox::singletonRef = 0;
66
67/**
68   \returns reference or new Object of Orxonox if not existent.
69*/
70Orxonox* Orxonox::getInstance (void)
71{
72  if (singletonRef == NULL)
73    singletonRef = new Orxonox();
74  return singletonRef;
75}
76
77/**
78   \brief this finds the config file
79   
80   Since the config file varies from user to user and since one may want to specify different config files
81   for certain occasions or platforms this function finds the right config file for every occasion and stores
82   it's path and name into configfilename
83*/
84void Orxonox::getConfigFile (int argc, char** argv)
85{
86  strcpy (configfilename, "orxonox.conf");
87}
88
89/**
90   \brief initialize Orxonox with command line
91*/
92int Orxonox::init (int argc, char** argv)
93{
94  // parse command line
95  // config file
96 
97  getConfigFile (argc, argv);
98  SDL_Init (SDL_INIT_TIMER);
99  // initialize everything
100  if( initVideo() == -1) return -1;
101  if( initSound() == -1) return -1;
102  printf("> Initializing input\n");
103  if( initInput() == -1) return -1;
104  printf("> Initializing networking\n");
105  if( initNetworking () == -1) return -1;
106  printf("> Initializing resources\n");
107  if( initResources () == -1) return -1;
108  //printf("> Initializing world\n");
109  //if( init_world () == -1) return -1; PB: world will be initialized when started
110 
111  return 0;
112}
113
114/**
115   \brief initializes SDL and OpenGL
116*/
117int Orxonox::initVideo() 
118{
119  PRINTF(3)("> Initializing video\n");
120 
121  GraphicsEngine::getInstance();
122 
123  return 0;
124}
125
126
127/**
128   \brief initializes the sound engine
129*/
130int Orxonox::initSound() 
131{
132  printf("> Initializing sound\n");
133  // SDL_Init(SDL_INIT_AUDIO);
134  printf("Not yet implemented\n");
135  return 0;
136}
137
138
139/**
140   \brief initializes input functions
141*/
142int Orxonox::initInput() 
143{
144  // create localinput
145  localinput = new CommandNode( configfilename);
146 
147  return 0;
148}
149
150
151/**
152   \brief initializes network system
153*/
154int Orxonox::initNetworking() 
155{
156  printf("Not yet implemented\n");
157  return 0;
158}
159
160
161/**
162   \brief initializes and loads resource files
163*/
164int Orxonox::initResources() 
165{
166  //  printf("Not yet implemented\n");
167  PRINT(3)("initializing ResourceManager\n");
168  resourceManager = ResourceManager::getInstance();
169  !resourceManager->setDataDir("../data/");
170
171  PRINT(3)("initializing TextEngine\n");
172  TextEngine::getInstance();
173}
174
175
176/**
177   \brief initializes the world
178*/
179int Orxonox::initWorld() 
180{
181  //world = new World();
182 
183  // TO DO: replace this with a menu/intro
184  //world->load_debug_level();
185 
186  return 0;
187}
188
189
190/**
191   \brief starts the orxonox game or menu
192
193   here is the central orxonox state manager. There are currently two states
194   - menu
195   - game-play
196   both states manage their states themselfs again.
197*/
198void Orxonox::start()
199{
200 
201  this->gameLoader = GameLoader::getInstance();
202  this->gameLoader->loadDebugCampaign(DEBUG_CAMPAIGN_0);
203  this->gameLoader->init();
204  this->gameLoader->start();
205}
206
207
208/**
209   \brief exits Orxonox
210*/
211void Orxonox::quitGame() 
212{
213  bQuitOrxonox = true;
214}
215
216
217
218/**
219   \brief handles sprecial events from localinput
220   \param event: an event not handled by the CommandNode
221*/
222void Orxonox::eventHandler(SDL_Event* event)
223{
224  // Handle special events such as reshape, quit, focus changes
225  switch (event->type)
226    {
227    case SDL_VIDEORESIZE:
228      GraphicsEngine* tmpGEngine = GraphicsEngine::getInstance();
229      tmpGEngine->resolutionChanged(&event->resize);
230      break;
231    }
232}
233 
234
235/**
236   \brief handle keyboard commands that are not meant for WorldEntities
237   \param cmd: the command to handle
238   \return true if the command was handled by the system or false if it may be passed to the WorldEntities
239*/
240bool Orxonox::systemCommand(Command* cmd)
241{
242  /*
243  if( !strcmp( cmd->cmd, "quit"))
244    {
245      if( !cmd->bUp) this->gameLoader->stop();
246      return true;
247    }
248  return false;
249  */
250  return false;
251}
252
253/**
254   \brief retrieve a pointer to the local CommandNode
255   \return a pointer to localinput
256*/
257CommandNode* Orxonox::getLocalInput()
258{
259  return localinput;
260}
261
262
263/**
264   \brief retrieve a pointer to the local World
265   \return a pointer to world
266*/
267World* Orxonox::getWorld()
268{
269  return world;
270}
271
272/**
273   \return The reference of the SDL-screen of orxonox
274*/
275SDL_Surface* Orxonox::getScreen ()
276{
277  return this->screen;
278}
279
280
281
282/**
283   \brief main function
284
285   here the journey begins
286*/
287int main(int argc, char** argv) 
288{ 
289 
290  /* reading arguments
291     
292     currently supported arguments are:
293     <no args>                   ::    just starts orxonox
294     --benchmark                 ::    start the benchmark without starting orxonox
295     
296     this is a preselection: it matches to one of the start* functions, the
297     finetuning is made in those functions.
298  */
299
300
301  int i;
302  for(i = 0; i < argc; ++i)
303    {
304      if(! strcmp( "--help", argv[i])) return startHelp();
305      else if(! strcmp( "--benchmark", argv[i])) return startBenchmarks();
306    }
307
308  PRINTF(2)("Orxonox does not understand the arguments");
309  return startOrxonox(argc, argv);
310}
311
312
313
314int startHelp()
315{
316  printf("orxonox: starts the orxonox game - rules\n");
317  printf("usage: orxonox [arg]\n\n");
318  printf("valid options:\n");
319  printf(" --benchmark\tstarts the orxonox benchmark\n");
320  printf(" --help \tshows this menu\n");
321}
322
323
324int startOrxonox(int argc, char** argv)
325{
326  printf(">>> Starting Orxonox <<<\n");
327  Orxonox *orx = Orxonox::getInstance();
328 
329  if((*orx).init(argc, argv) == -1)
330    {
331      printf("! Orxonox initialization failed\n");
332      return -1;
333    }
334 
335  orx->start();
336 
337  delete orx;
338 
339}
340
341#if defined __linux__
342
343#include "list.h"
344#include "world_entity.h"
345#include "vector.h"
346#include "player.h"
347#include "base_object.h"
348#include <asm/msr.h>
349#include <linux/timex.h>
350
351
352#define LIST_MAX 1000
353#define VECTOR_MAX 1000000
354#define ITERATIONS 10000
355
356
357int startBenchmarks()
358{
359
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 
773}
774
775#else
776
777int startBenchmarks()
778{
779  PRINTF(1)("Benchmark is not implemented in this system\n");
780}
781
782#endif
Note: See TracBrowser for help on using the repository browser.