Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 3666 was 3662, checked in by patrick, 20 years ago

orxonox/trunk:make

File size: 15.4 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
36#include <string.h>
37int verbose = 3;
38
39using namespace std;
40
41/**
42   \brief create a new Orxonox
43*/
44Orxonox::Orxonox ()
45{
46  pause = false;
47}
48
49/**
50   \brief remove Orxonox from memory
51*/
52Orxonox::~Orxonox () 
53{
54  Orxonox::singletonRef = NULL;
55  if( world != NULL) delete world;
56  if( localinput != NULL) delete world;
57  if( resources != NULL) delete resources;
58  delete GraphicsEngine::getInstance(); // deleting the Graphics
59  delete ResourceManager::getInstance(); // deletes the Resource Manager
60}
61
62/** \brief this is a singleton class to prevent duplicates */
63Orxonox* Orxonox::singletonRef = 0;
64
65/**
66   \returns reference or new Object of Orxonox if not existent.
67*/
68Orxonox* Orxonox::getInstance (void)
69{
70  if (singletonRef == NULL)
71    singletonRef = new Orxonox();
72  return singletonRef;
73}
74
75/**
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
81*/
82void Orxonox::getConfigFile (int argc, char** argv)
83{
84  strcpy (configfilename, "orxonox.conf");
85}
86
87/**
88   \brief initialize Orxonox with command line
89*/
90int Orxonox::init (int argc, char** argv)
91{
92  // parse command line
93  // config file
94 
95  getConfigFile (argc, argv);
96  SDL_Init (SDL_INIT_TIMER);
97  // initialize everything
98  if( initVideo() == -1) return -1;
99  if( initSound() == -1) return -1;
100  printf("> Initializing input\n");
101  if( initInput() == -1) return -1;
102  printf("> Initializing networking\n");
103  if( initNetworking () == -1) return -1;
104  printf("> Initializing resources\n");
105  if( initResources () == -1) return -1;
106  //printf("> Initializing world\n");
107  //if( init_world () == -1) return -1; PB: world will be initialized when started
108 
109  return 0;
110}
111
112/**
113   \brief initializes SDL and OpenGL
114*/
115int Orxonox::initVideo() 
116{
117  PRINTF(3)("> Initializing video\n");
118 
119  GraphicsEngine::getInstance();
120 
121  return 0;
122}
123
124
125/**
126   \brief initializes the sound engine
127*/
128int Orxonox::initSound() 
129{
130  printf("> Initializing sound\n");
131  // SDL_Init(SDL_INIT_AUDIO);
132  printf("Not yet implemented\n");
133  return 0;
134}
135
136
137/**
138   \brief initializes input functions
139*/
140int Orxonox::initInput() 
141{
142  // create localinput
143  localinput = new CommandNode( configfilename);
144 
145  return 0;
146}
147
148
149/**
150   \brief initializes network system
151*/
152int Orxonox::initNetworking() 
153{
154  printf("Not yet implemented\n");
155  return 0;
156}
157
158
159/**
160   \brief initializes and loads resource files
161*/
162int Orxonox::initResources() 
163{
164  //  printf("Not yet implemented\n");
165  PRINT(3)("initializing ResourceManager\n");
166  resourceManager = ResourceManager::getInstance();
167  resourceManager->setDataDir("../data/");
168  return 0;
169}
170
171
172/**
173   \brief initializes the world
174*/
175int Orxonox::initWorld() 
176{
177  //world = new World();
178 
179  // TO DO: replace this with a menu/intro
180  //world->load_debug_level();
181 
182  return 0;
183}
184
185
186/**
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.
193*/
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
203
204/**
205   \brief exits Orxonox
206*/
207void Orxonox::quitGame() 
208{
209  bQuitOrxonox = true;
210}
211
212
213
214/**
215   \brief handles sprecial events from localinput
216   \param event: an event not handled by the CommandNode
217*/
218void Orxonox::eventHandler(SDL_Event* event)
219{
220  // Handle special events such as reshape, quit, focus changes
221  switch (event->type)
222    {
223    case SDL_VIDEORESIZE:
224      GraphicsEngine* tmpGEngine = GraphicsEngine::getInstance();
225      tmpGEngine->resolutionChanged(&event->resize);
226      break;
227    }
228}
229 
230
231/**
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
235*/
236bool Orxonox::systemCommand(Command* cmd)
237{
238  /*
239  if( !strcmp( cmd->cmd, "quit"))
240    {
241      if( !cmd->bUp) this->gameLoader->stop();
242      return true;
243    }
244  return false;
245  */
246  return false;
247}
248
249/**
250   \brief retrieve a pointer to the local CommandNode
251   \return a pointer to localinput
252*/
253CommandNode* Orxonox::getLocalInput()
254{
255  return localinput;
256}
257
258
259/**
260   \brief retrieve a pointer to the local World
261   \return a pointer to world
262*/
263World* Orxonox::getWorld()
264{
265  return world;
266}
267
268/**
269   \return The reference of the SDL-screen of orxonox
270*/
271SDL_Surface* Orxonox::getScreen ()
272{
273  return this->screen;
274}
275
276
277
278/**
279   \brief main function
280
281   here the journey begins
282*/
283int main(int argc, char** argv) 
284{ 
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
319
320int startOrxonox(int argc, char** argv)
321{
322  printf(">>> Starting Orxonox <<<\n");
323  Orxonox *orx = Orxonox::getInstance();
324 
325  if((*orx).init(argc, argv) == -1)
326    {
327      printf("! Orxonox initialization failed\n");
328      return -1;
329    }
330 
331  orx->start();
332 
333  //  delete orx;
334 
335}
336
337
338#include "list.h"
339#include "world_entity.h"
340#include "vector.h"
341#include "player.h"
342#include "base_object.h"
343#include "primitive.h"
344#include <asm/msr.h>
345#include <linux/timex.h>
346
347
348#define LIST_MAX 1000
349#define VECTOR_MAX 1000000
350#define ITERATIONS 10000
351
352
353int startBenchmarks()
354{
355
356  printf("===========================================================\n");
357  printf("=                      BENCHMARKS                         =\n");
358  printf("===========================================================\n");
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");
363
364  // first measure the time overhead:
365  unsigned long ini, end, dt, tmp;
366  rdtscl(ini); rdtscl(end);
367  dt = end - ini;
368
369  int type = -1; 
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*/
378
379      printf("Generating Objects:\t\t\t\t\t%i\n", ITERATIONS);
380      /* ************WorldEntity class test************** */
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);
392          delete w;
393          mittel += (end - ini - dt);
394        }
395      float mi = mittel / (float)ITERATIONS;
396      printf(" Generate a WorldEntity object:\t\t%11.2f\n", mi);
397     
398      mittel = 0;
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;
410      printf(" Generate a Primitive  object:\t\t%11.2f\n", mi);
411
412
413      mittel = 0;
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;
447      w = new WorldEntity();
448      for(i = 0; i < ITERATIONS; ++i)
449        {
450          rdtscl(ini);
451         
452          w->tick(0.0f);
453
454          rdtscl(end);
455          mittel += (end - ini - dt);
456          }
457      //delete w;
458      mi = mittel / (float)ITERATIONS;
459      printf(" Virt funct tick() of WE: \t\t%11.2f\n", mi);
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);
469           
470          rdtscl(end);
471          mittel += (end - ini - dt);
472          }
473      //delete w;
474      mi = mittel / (float)ITERATIONS;
475      printf(" Inl virt funct tick() of WE v2: \t%11.2f\n", mi);
476
477     
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     
494      tList<WorldEntity>* list = new tList<WorldEntity>();
495
496     
497      /* ************Primitvie class test************** */
498      list = new tList<WorldEntity>();
499 
500     
501     
502      mittel = 0;
503      w = new Primitive(P_SPHERE);
504      for(i = 0; i < ITERATIONS; ++i)
505        {
506          rdtscl(ini);
507         
508          w->tick(0.0f);
509           
510          rdtscl(end);
511          mittel += (end - ini - dt);
512          }
513      mi = mittel / (float)ITERATIONS;
514      printf(" Call function tick() of Prim:\t\t%11.2f\n", mi);
515
516
517      }
518  if(type == 1 || type == -1)
519    {
520      printf("\nDoing some simple vector operations: \t\t\t%i\n", VECTOR_MAX);
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     
526      unsigned long mittel, ini, end;
527      float mi;
528      int i = 0;
529      // addition
530      mittel = 0;
531      for(i = 0; i < VECTOR_MAX; ++i)
532        {
533          rdtscl(ini);
534         
535          *c = *a + *b;
536           
537          rdtscl(end);
538          mittel += (end - ini - dt);
539        }
540      mi = mittel / (float)VECTOR_MAX;
541      printf(" Addition of two vectors:\t\t%11.2f\n", mi);
542     
543      // multiplikation
544
545      mittel = 0;
546      for(i = 0; i < VECTOR_MAX; ++i)
547        {
548          rdtscl(ini);
549         
550          *c = a->cross( *b);
551           
552          rdtscl(end);
553          mittel += (end - ini - dt);
554        }
555      mi = mittel / (float)VECTOR_MAX;
556      printf(" CrossMult of two vectors:\t\t%11.2f\n", mi);
557
558      if(type == 1 || type == -1)
559        {
560          /* quaternion test */
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;
570          // quaternion generieren mit spez konstruktor
571          mittel = 0;
572          Vector* qa = new Vector(4.6, 9.3, 0.4);
573          Vector* qb = new Vector(3.5, 6.1, 4.3);
574          for(i = 0; i < VECTOR_MAX; ++i)
575            {
576              rdtscl(ini);
577             
578              Quaternion* qu = new Quaternion(*qa, *qb);
579             
580              rdtscl(end);
581              delete qu;
582              mittel += (end - ini - dt);
583            }
584          delete a;
585          delete b;
586          mi = mittel / (float)VECTOR_MAX;
587          printf(" Gen. quatern. betw. two vectors:\t%11.2f\n", mi);
588
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;
602          printf(" Multiplying two quat.(=rot): a * b\t%11.2f\n", mi);
603         
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);
619         
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);
636        }
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        }
725    }
726}
Note: See TracBrowser for help on using the repository browser.