Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/branches/convention/src/story_entities/world.cc @ 3758

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

function keys made

File size: 26.4 KB
Line 
1
2/*
3   orxonox - the future of 3D-vertical-scrollers
4
5   Copyright (C) 2004 orx
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 2, or (at your option)
10   any later version.
11
12   ### File Specific:
13   main-programmer: Patrick Boenzli
14   co-programmer: Christian Meyer
15*/
16
17#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD
18
19#include "world.h"
20
21#include "orxonox.h"
22
23#include "p_node.h"
24#include "null_parent.h"
25#include "helper_parent.h"
26#include "track_node.h"
27#include "world_entity.h"
28#include "player.h"
29#include "camera.h"
30#include "environment.h"
31#include "skysphere.h"
32#include "satellite.h"
33#include "terrain.h"
34#include "light.h"
35
36#include "track_manager.h"
37#include "garbage_collector.h"
38#include "simple_animation.h"
39
40#include "command_node.h"
41#include "glmenu_imagescreen.h"
42#include "fontset.h"
43#include "test_mat.h"
44#include "list.h"
45
46
47
48using namespace std;
49
50
51WorldInterface* WorldInterface::singletonRef = 0;
52
53
54/**
55   \brief private constructor because of singleton
56*/
57WorldInterface::WorldInterface()
58{
59  this->worldIsInitialized = false;
60  this->worldReference = NULL;
61}
62
63/**
64   \brief public deconstructor
65*/
66WorldInterface::~WorldInterface()
67{
68  this->singletonRef = NULL;
69  this->worldIsInitialized = false;
70  this->worldReference = NULL;
71}
72
73/**
74   \brief gets the singleton instance
75   \returns singleton instance
76*/
77WorldInterface* WorldInterface::getInstance()
78{
79  if( singletonRef == NULL)
80    singletonRef = new WorldInterface();
81  return singletonRef;
82}
83
84
85/**
86   \brief initializes the interface
87   \param reference to the world
88
89   if the worldinterface is not initilizes, there wont be any
90   useable interface
91*/
92void WorldInterface::init(World* world)
93{
94  this->worldReference = world;
95  if( world != NULL)
96    {
97      this->worldIsInitialized = true;
98      PRINTF(3)("WorldInterface up and running\n");
99    }
100}
101
102
103/**
104   \brief gets the entity list from the world
105   \return entity list
106*/
107tList<WorldEntity>* WorldInterface::getEntityList()
108{
109  if( this->worldIsInitialized)
110    return this->worldReference->getEntities();
111  PRINT(1)("Someone tried to use the WorldInterface before it has been initizlized! this can result in SEGFAULTs!\n");
112  return NULL;
113}
114
115
116
117/**
118    \brief create a new World
119   
120    This creates a new empty world!
121*/
122World::World (char* name)
123{
124  this->init(name, -1);
125  //NullParent* np = NullParent::getInstance();
126}
127
128/**
129   \brief creates a new World...
130   \param worldID with this ID
131*/
132World::World (int worldID)
133{
134  this->init(NULL, worldID);
135}
136
137/**
138    \brief remove the World from memory
139   
140    delete everything explicitly, that isn't contained in the parenting tree!
141    things contained in the tree are deleted automaticaly
142*/
143World::~World ()
144{
145  PRINTF(3)("World::~World() - deleting current world\n");
146  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
147  cn->unbind(this->localPlayer);
148  cn->reset();
149
150  ResourceManager::getInstance()->debug();
151  ResourceManager::getInstance()->unloadAllByPriority(RP_LEVEL);
152  ResourceManager::getInstance()->debug();
153
154  delete WorldInterface::getInstance();
155
156  delete this->nullParent;
157  delete this->entities;
158  delete this->lightMan;
159  delete this->trackManager;
160
161  delete this->simpleAnimation;
162  //delete garbagecollecor
163  //delete animator
164}
165
166/**
167   \brief initializes the world.
168
169   set all stuff here that is world generic and does not use to much memory
170   because the real init() function StoryEntity::init() will be called
171   shortly before start of the game. 
172   since all worlds are initiated/referenced before they will be started.
173   NO LEVEL LOADING HERE - NEVER!
174*/
175void World::init(char* name, int worldID)
176{
177  this->setClassName ("World");
178
179  this->worldName = name;
180  this->debugWorldNr = worldID;
181  this->entities = new tList<WorldEntity>();
182
183  this->testMat = NULL;
184}
185
186
187/**
188   \brief this is executed before load
189
190   since the load function sometimes needs data, that has been init before
191   the load and after the proceeding storyentity has finished
192*/
193ErrorMessage World::preLoad()
194{
195  /* init the world interface */
196  WorldInterface* wi = WorldInterface::getInstance();
197  wi->init(this);
198  this->garbageCollector = GarbageCollector::getInstance();
199  this->simpleAnimation = SimpleAnimation::getInstance();
200}
201
202
203/**
204   \brief loads the World by initializing all resources, and set their default values.
205*/
206ErrorMessage World::load()
207{
208  //  BezierCurve* tmpCurve = new BezierCurve();
209  if(this->debugWorldNr != -1)
210    {
211      // initializing Font
212      testFont = new FontSet();
213      testFont->buildFont("../data/pictures/font.tga");
214      this->glmis->step();
215
216      // initializing the TrackManager
217      trackManager = TrackManager::getInstance();
218      //trackManager->addPoint(Vector(0,0,0));
219      trackManager->addPoint(Vector(150, -35, 5));
220      trackManager->addPoint(Vector(200,-35, 5));
221      trackManager->addPoint(Vector(250, -35, 5));
222      trackManager->addPoint(Vector(320,-33,-.55));
223      trackManager->setDuration(2);
224      trackManager->setSavePoint();
225
226      trackManager->addPoint(Vector(410, 0, 0));
227      trackManager->addPoint(Vector(510, 20, -10));
228      trackManager->addPoint(Vector(550, 20, -10));
229      trackManager->addPoint(Vector(570, 20, -10));
230      trackManager->setDuration(5);
231     
232      int fork11, fork12;
233      trackManager->fork(2, &fork11, &fork12);
234      trackManager->workOn(fork11);
235      trackManager->addPoint(Vector(640, 25, -30));
236      trackManager->addPoint(Vector(700, 40, -120));
237      trackManager->addPoint(Vector(800, 50, -150));
238      trackManager->addPoint(Vector(900, 60, -100));
239      trackManager->addPoint(Vector(900, 60, -70));
240      trackManager->addPoint(Vector(990, 65, -15));
241      trackManager->addPoint(Vector(1050, 65, -10));
242      trackManager->addPoint(Vector(1100, 65, -20));
243      trackManager->setDuration(10);
244
245      trackManager->workOn(fork12);
246      trackManager->addPoint(Vector(640, 25, 20));
247      trackManager->addPoint(Vector(670, 50, 120));
248      trackManager->addPoint(Vector(700, 70, 80));
249      trackManager->addPoint(Vector(800, 70, 65));
250      trackManager->addPoint(Vector(850, 65, 65));
251      trackManager->addPoint(Vector(920, 35, 40));
252      trackManager->addPoint(Vector(945, 40, 40));
253      trackManager->addPoint(Vector(970, 24, 40));
254      trackManager->addPoint(Vector(1000, 40, -7));
255      trackManager->setDuration(10);
256     
257
258      trackManager->join(2, fork11, fork12);
259
260      trackManager->workOn(5);
261      trackManager->addPoint(Vector(1200, 60, -50));
262      trackManager->addPoint(Vector(1300, 50, -50));
263      trackManager->addPoint(Vector(1400, 40, -50));
264      trackManager->addPoint(Vector(1500, 40, -60));
265      trackManager->addPoint(Vector(1600, 35, -55));
266      trackManager->addPoint(Vector(1700, 45, -40));
267      trackManager->addPoint(Vector(1750, 60, -40));
268      trackManager->addPoint(Vector(1770, 80, -40));
269      trackManager->addPoint(Vector(1800, 100, -40));
270      trackManager->setDuration(10);
271
272      trackManager->finalize();
273
274     
275      /*monitor progress*/
276      this->glmis->step();
277
278      // LIGHT initialisation
279      lightMan = LightManager::getInstance();
280      lightMan->setAmbientColor(.1,.1,.1);
281      lightMan->addLight();
282      //      lightMan->setAttenuation(1.0, .01, 0.0);
283      //      lightMan->setDiffuseColor(1,1,1);
284      //  lightMan->addLight(1);
285      //  lightMan->setPosition(20, 10, -20);
286      //  lightMan->setDiffuseColor(0,0,0);
287      lightMan->debug();
288
289      switch(this->debugWorldNr)
290        {
291          /*
292            this loads the hard-coded debug world. this only for simplicity and will be
293            removed by a reald world-loader, which interprets a world-file.
294            if you want to add an own debug world, just add a case DEBUG_WORLD_[nr] and
295            make whatever you want...
296           */
297        case DEBUG_WORLD_0:
298          {
299            lightMan->setPosition(-5.0, 10.0, -40.0);
300            this->nullParent = NullParent::getInstance ();
301            this->nullParent->setName ("NullParent");
302
303            // !\todo old track-system has to be removed
304
305            //create helper for player
306            //HelperParent* hp = new HelperParent ();
307            /* the player has to be added to this helper */
308
309            // create a player
310            this->localPlayer = new Player ();
311            this->localPlayer->setName ("player");
312            this->spawn (this->localPlayer);
313            /*monitor progress*/
314            //this->glmis->step();         
315            this->glmis->step();
316
317            // bind input
318            Orxonox *orx = Orxonox::getInstance ();
319            orx->getLocalInput()->bind (this->localPlayer);
320           
321            // bind camera
322            this->localCamera = new Camera();
323            this->localCamera->setName ("camera");
324            this->localCamera->lookAt(this->localPlayer);
325            this->localCamera->setParent(this->localPlayer);
326           
327            /*monitor progress*/
328            this->glmis->step();
329
330            // Create SkySphere
331            this->skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
332            this->skySphere->setName("SkySphere");
333            this->localCamera->addChild(this->skySphere);
334            this->skySphere->setMode(PNODE_MOVEMENT);
335
336            /*monitor progress*/
337            this->glmis->step();
338
339           
340            WorldEntity* env = new Environment();
341            env->setName ("env");
342            this->spawn(env);
343
344           
345            /*
346            Vector* es = new Vector (10, 5, 0);
347            Quaternion* qs = new Quaternion ();
348            WorldEntity* pr = new Primitive(P_CYLINDER);
349            pr->setName("primitive");
350            this->spawn(pr, this->localPlayer, es, qs, PNODE_MOVEMENT);
351            */
352
353            /*monitor progress*/
354            this->glmis->step();
355
356            //      trackManager->setBindSlave(env);
357            PNode* tn = trackManager->getTrackNode();
358            tn->addChild(this->localPlayer);
359
360            //localCamera->setParent(TrackNode::getInstance());
361            tn->addChild(this->localCamera);
362            //      localCamera->lookAt(tn);
363            this->localPlayer->setMode(PNODE_ALL);
364            //Vector* cameraOffset = new Vector (0, 5, -10);
365            trackManager->condition(2, LEFTRIGHT, this->localPlayer);
366            this->glmis->step();
367
368            break;
369          }
370        case DEBUG_WORLD_1:
371          {
372            this->testMat = new TestMat();
373            lightMan->setPosition(.0, .0, .0);
374            lightMan->setAttenuation(1.0, .01, 0.0);
375            lightMan->setSpecularColor(1,0,0);
376            this->nullParent = NullParent::getInstance ();
377            this->nullParent->setName ("NullParent");
378
379            // create a player
380            WorldEntity* myPlayer = new Player();
381            myPlayer->setName ("player");
382            this->spawn(myPlayer);
383            this->localPlayer = myPlayer;           
384           
385            // bind input
386            Orxonox *orx = Orxonox::getInstance();
387            orx->getLocalInput()->bind (myPlayer);
388           
389            // bind camera
390            this->localCamera = new Camera ();
391            this->localCamera->setName ("camera");
392            this->localCamera->lookAt(LightManager::getInstance()->getLight(0));
393            this->localCamera->setParent(this->localPlayer);
394
395            // Create SkySphere
396            skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
397            this->localPlayer->addChild(this->skySphere);
398
399            Vector* es = new Vector (20, 0, 0);
400            Quaternion* qs = new Quaternion ();
401
402            lightMan->getLight(0)->setParent(trackManager->getTrackNode());
403            break;
404          }
405        case DEBUG_WORLD_2:
406          {
407            lightMan->setAmbientColor(.1,.1,.1);
408            lightMan->addLight();
409            lightMan->setPosition(-5.0, 10.0, -40.0);
410            this->nullParent = NullParent::getInstance ();
411            this->nullParent->setName ("NullParent");
412           
413            // !\todo old track-system has to be removed
414
415            //create helper for player
416            //HelperParent* hp = new HelperParent ();
417            /* the player has to be added to this helper */
418
419            // create a player
420            this->localPlayer = new Player ();
421            this->localPlayer->setName ("player");
422            this->spawn (this->localPlayer);
423            /*monitor progress*/
424            //this->glmis->step();         
425            this->glmis->step();
426
427            // bind input
428            Orxonox *orx = Orxonox::getInstance ();
429            orx->getLocalInput()->bind (this->localPlayer);
430           
431            // bind camera
432            this->localCamera = new Camera();
433            this->localCamera->setName ("camera");
434            this->localCamera->lookAt(this->localPlayer);
435            this->localCamera->setParent(this->localPlayer);
436           
437            /*monitor progress*/
438            this->glmis->step();
439
440            // Create SkySphere
441            this->skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
442            this->skySphere->setName("SkySphere");
443            this->localCamera->addChild(this->skySphere);
444            this->skySphere->setMode(PNODE_MOVEMENT);
445
446            /*monitor progress*/
447            this->glmis->step();
448
449
450            WorldEntity* baseNode = new Satellite(Vector(1,0,1), 1.2);
451            this->localPlayer->addChild(baseNode);
452            baseNode->setRelCoor(new Vector(10.0, 2.0, 1.0));
453            this->spawn(baseNode);
454
455            WorldEntity* secondNode = new Satellite(Vector(0,0,1), 2.0);
456            baseNode->addChild(secondNode);
457            secondNode->setRelCoor(new Vector(0.0, 0.0, 3.0));
458            this->spawn(secondNode);
459
460
461            WorldEntity* thirdNode = new Satellite(Vector(0,0,1), 1.0);
462            secondNode->addChild(thirdNode);
463            thirdNode->setRelCoor(new Vector(2.0, 0.0, 0.0));
464            this->spawn(thirdNode);
465
466
467           
468           
469
470            WorldEntity* b = new Environment();
471            this->localPlayer->addChild(b);
472            b->setRelCoor(new Vector(10.0, 1.0, 1.0));
473            this->spawn(b);
474
475           
476            WorldEntity* c = new Environment();
477            this->localPlayer->addChild(c);
478            c->setRelCoor(new Vector(10.0, 2.0, -1.0));
479            this->spawn(c);
480           
481           
482            KeyFrame* f1 = new KeyFrame;
483            f1->position = new Vector(-1.1, 0.0, 2.6);
484            f1->direction = new Quaternion();
485            f1->time = 1.0;
486            f1->mode = NEG_EXP;
487
488
489            KeyFrame* f2 = new KeyFrame;
490            f2->position = new Vector(-2.1, 0.0, 2.6);
491            f2->direction = new Quaternion();
492            f2->time = 0.1;
493            f2->mode = NEG_EXP;
494
495            KeyFrame* f3 = new KeyFrame;
496            f3->position = new Vector(10.0, 2.0, -1.0);
497            f3->direction = new Quaternion();
498            f3->time = 0.2;
499            f3->mode = NEG_EXP;
500
501            KeyFrame* f4 = new KeyFrame;
502            f4->position = new Vector(10.0, 5.0, -1.0);
503            f4->direction = new Quaternion();
504            f4->time = 1.0;
505            f4->mode = NEG_EXP;
506
507
508
509            this->simpleAnimation->animatorBegin();
510            this->simpleAnimation->selectObject(b);
511            this->simpleAnimation->setAnimationMode(SINGLE);
512            this->simpleAnimation->addKeyFrame(f1);
513            this->simpleAnimation->addKeyFrame(f2);
514            this->simpleAnimation->start();
515            this->simpleAnimation->selectObject(c);
516            this->simpleAnimation->addKeyFrame(f3);
517            this->simpleAnimation->addKeyFrame(f4);
518            this->simpleAnimation->start();
519            this->simpleAnimation->animatorEnd();
520
521
522            /*
523            Vector* es = new Vector (10, 5, 0);
524            Quaternion* qs = new Quaternion ();
525            WorldEntity* pr = new Primitive(P_CYLINDER);
526            pr->setName("primitive");
527            this->spawn(pr, this->localPlayer, es, qs, PNODE_MOVEMENT);
528            */
529
530            /*monitor progress*/
531            this->glmis->step();
532
533            //      trackManager->setBindSlave(env);
534            PNode* tn = trackManager->getTrackNode();
535            tn->addChild(this->localPlayer);
536
537            //localCamera->setParent(TrackNode::getInstance());
538            tn->addChild(this->localCamera);
539            //      localCamera->lookAt(tn);
540            this->localPlayer->setMode(PNODE_ALL);
541            //Vector* cameraOffset = new Vector (0, 5, -10);
542            trackManager->condition(2, LEFTRIGHT, this->localPlayer);
543            this->glmis->step();
544
545            break;
546          }
547        default:
548          printf("World::load() - no world with ID %i found", this->debugWorldNr );
549        }
550    }
551  else if(this->worldName != NULL)
552    {
553
554    }
555
556  // initialize debug coord system
557  objectList = glGenLists(1);
558  glNewList (objectList, GL_COMPILE);
559 
560  trackManager->drawGraph(.01);
561  trackManager->debug(2);
562  glEndList();
563
564  terrain = new Terrain("../data/worlds/newGround.obj");
565  terrain->setRelCoor(new Vector(0,-10,0));
566  this->spawn(terrain);
567
568}
569
570
571/**
572   \brief initializes a new World shortly before start
573
574   this is the function, that will be loaded shortly before the world is
575   started
576*/
577ErrorMessage World::init()
578{
579  this->bPause = false;
580  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
581  cn->addToWorld(this);
582  cn->enable(true);
583}
584
585
586/**
587   \brief starts the World
588*/
589ErrorMessage World::start()
590{
591  PRINTF(3)("World::start() - starting current World: nr %i\n", this->debugWorldNr);
592  this->bQuitOrxonox = false;
593  this->bQuitCurrentGame = false;
594  this->mainLoop();
595}
596
597/**
598   \brief stops the world.
599
600   This happens, when the player decides to end the Level.
601*/
602ErrorMessage World::stop()
603{
604  PRINTF(3)("World::stop() - got stop signal\n");
605  this->bQuitCurrentGame = true;
606}
607
608/**
609   \brief pauses the Game
610*/
611ErrorMessage World::pause()
612{
613  this->isPaused = true;
614}
615
616/**
617   \brief ends the pause Phase
618*/
619ErrorMessage World::resume()
620{
621  this->isPaused = false;
622}
623
624/**
625   \brief destroys the World
626*/
627ErrorMessage World::destroy()
628{
629
630}
631
632/**
633   \brief shows the loading screen
634*/
635void World::displayLoadScreen ()
636{
637  PRINTF(3)("World::displayLoadScreen - start\n"); 
638 
639  //GLMenuImageScreen*
640  this->glmis = GLMenuImageScreen::getInstance();
641  this->glmis->init();
642  this->glmis->setMaximum(8);
643  this->glmis->draw();
644 
645  PRINTF(3)("World::displayLoadScreen - end\n"); 
646}
647
648/**
649   \brief removes the loadscreen, and changes over to the game
650
651   \todo take out the delay
652*/
653void World::releaseLoadScreen ()
654{
655  PRINTF(3)("World::releaseLoadScreen - start\n"); 
656  this->glmis->setValue(this->glmis->getMaximum());
657  //SDL_Delay(500);
658  PRINTF(3)("World::releaseLoadScreen - end\n"); 
659}
660
661
662/**
663   \brief gets the list of entities from the world
664   \returns entity list
665*/
666tList<WorldEntity>* World::getEntities()
667{
668  return this->entities;
669}
670
671
672/**
673   \brief this returns the current game time
674   \returns elapsed game time
675*/
676double World::getGameTime()
677{
678  return this->gameTime;
679}
680
681
682/**
683    \brief checks for collisions
684   
685    This method runs through all WorldEntities known to the world and checks for collisions
686    between them. In case of collisions the collide() method of the corresponding entities
687    is called.
688*/
689void World::collide ()
690{
691  /*
692  List *a, *b;
693  WorldEntity *aobj, *bobj;
694   
695  a = entities;
696 
697  while( a != NULL)
698    {
699      aobj = a->nextElement();
700      if( aobj->bCollide && aobj->collisioncluster != NULL)
701        {
702          b = a->nextElement();
703          while( b != NULL )
704            {
705              bobj = b->nextElement();
706              if( bobj->bCollide && bobj->collisioncluster != NULL )
707                {
708                  unsigned long ahitflg, bhitflg;
709                  if( check_collision ( &aobj->place, aobj->collisioncluster,
710                                        &ahitflg, &bobj->place, bobj->collisioncluster,
711                                        &bhitflg) );
712                  {
713                    aobj->collide (bobj, ahitflg, bhitflg);
714                    bobj->collide (aobj, bhitflg, ahitflg);
715                  }
716                }
717              b = b->nextElement();
718            }
719        }
720      a = a->enumerate();
721    }
722  */
723}
724
725/**
726    \brief runs through all entities calling their draw() methods
727*/
728void World::draw ()
729{
730  /* draw entities */
731  WorldEntity* entity;
732  glLoadIdentity();
733
734  //entity = this->entities->enumerate();
735  tIterator<WorldEntity>* iterator = this->entities->getIterator();
736  entity = iterator->nextElement();
737  while( entity != NULL ) 
738    { 
739      if( entity->bDraw ) entity->draw();
740      //entity = this->entities->nextElement();
741      entity = iterator->nextElement();
742    }
743  delete iterator;
744
745  if (this->testMat)
746    this->testMat->draw();
747
748  glCallList (objectList);
749  //! \todo skysphere is a WorldEntity and should be inside of the world-entity-list.
750  skySphere->draw();
751
752  testFont->printText(0, 0, 1, "orxonox_" PACKAGE_VERSION);
753
754  lightMan->draw(); // must be at the end of the drawing procedure, otherwise Light cannot be handled as PNodes //
755}
756
757
758/**
759   \brief function to put your own debug stuff into it. it can display informations about
760   the current class/procedure
761*/
762void World::debug()
763{
764  PRINTF(2)("debug() - starting debug\n");
765  PNode* p1 = NullParent::getInstance ();
766  PNode* p2 = new PNode (new Vector(2, 2, 2), p1);
767  PNode* p3 = new PNode (new Vector(4, 4, 4), p1);
768  PNode* p4 = new PNode (new Vector(6, 6, 6), p2);
769
770  p1->debug ();
771  p2->debug ();
772  p3->debug ();
773  p4->debug ();
774
775  p1->shiftCoor (new Vector(-1, -1, -1));
776
777  printf("World::debug() - shift\n");
778  p1->debug ();
779  p2->debug ();
780  p3->debug ();
781  p4->debug ();
782 
783  p1->update (0);
784
785  printf ("World::debug() - update\n");
786  p1->debug ();
787  p2->debug ();
788  p3->debug ();
789  p4->debug ();
790
791  p2->shiftCoor (new Vector(-1, -1, -1));
792  p1->update (0);
793
794  p1->debug ();
795  p2->debug ();
796  p3->debug ();
797  p4->debug ();
798
799  p2->setAbsCoor (new Vector(1,2,3));
800
801
802 p1->update (0);
803
804  p1->debug ();
805  p2->debug ();
806  p3->debug ();
807  p4->debug ();
808
809  delete p1;
810 
811 
812  /*
813  WorldEntity* entity;
814  printf("counting all entities\n");
815  printf("World::debug() - enumerate()\n");
816  entity = entities->enumerate(); 
817  while( entity != NULL )
818    {
819      if( entity->bDraw ) printf("got an entity\n");
820      entity = entities->nextElement();
821    }
822  */
823}
824
825
826/**
827  \brief main loop of the world: executing all world relevant function
828
829  in this loop we synchronize (if networked), handle input events, give the heart-beat to
830  all other member-entities of the world (tick to player, enemies etc.), checking for
831  collisions drawing everything to the screen.
832*/
833void World::mainLoop()
834{
835  this->lastFrame = SDL_GetTicks ();
836  PRINTF(3)("World::mainLoop() - Entering main loop\n");
837  while( !this->bQuitOrxonox && !this->bQuitCurrentGame) /* \todo implement pause */
838    {
839      PRINTF(3)("World::mainloop() - number of entities: %i\n", this->entities->getSize());
840      // Network
841      this->synchronize ();
842      // Process input
843      this->handleInput ();
844      if( this->bQuitCurrentGame || this->bQuitOrxonox)
845          break;
846      // Process time
847      this->tick ();
848      // Update the state
849      this->update ();     
850      // Process collision
851      this->collide ();
852      // Draw
853      this->display ();
854
855      //      for( int i = 0; i < 5000000; i++) {}
856      /* \todo this is to slow down the program for openGl Software emulator computers, reimplement*/
857    }
858  PRINTF(3)("World::mainLoop() - Exiting the main loop\n");
859}
860
861
862/**
863   \brief synchronize local data with remote data
864*/
865void World::synchronize ()
866{
867  // Get remote input
868  // Update synchronizables
869}
870
871
872/**
873   \brief run all input processing
874
875   the command node is the central input event dispatcher. the node uses the even-queue from
876   sdl and has its own event-passing-queue.
877*/
878void World::handleInput ()
879{
880  // localinput
881  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
882  cn->process();
883  // remoteinput
884}
885
886
887/**
888   \brief advance the timeline
889
890   this calculates the time used to process one frame (with all input handling, drawing, etc)
891   the time is mesured in ms and passed to all world-entities and other classes that need
892   a heart-beat.
893*/
894void World::tick ()
895{
896  Uint32 currentFrame = SDL_GetTicks();
897  if(!this->bPause)
898    {
899      this->dt = currentFrame - this->lastFrame;
900     
901      if( this->dt > 0)
902        {
903          float fps = 1000/dt;
904          PRINTF(3)("fps = %f\n", fps);
905        }
906      else
907        {
908          /* the frame-rate is limited to 100 frames per second, all other things are for
909             nothing.
910          */
911          PRINTF(2)("fps = 1000 - frame rate is adjusted\n");
912          SDL_Delay(10);
913          this->dt = 10;
914        }
915      //this->timeSlice (dt);
916     
917      /* function to let all entities tick (iterate through list) */
918      float seconds = this->dt / 1000.0;     
919      this->gameTime += seconds;
920      //entity = entities->enumerate();
921      tIterator<WorldEntity>* iterator = this->entities->getIterator();
922      WorldEntity* entity = iterator->nextElement();
923      while( entity != NULL) 
924        { 
925          entity->tick (seconds);
926          entity = iterator->nextElement();
927        }
928      delete iterator;
929      //skySphere->updatePosition(localCamera->absCoordinate);
930     
931      /* update tick the rest */
932      this->trackManager->tick(this->dt);
933      this->localCamera->tick(this->dt);
934      this->garbageCollector->tick(seconds);
935      this->simpleAnimation->tick(seconds);
936    }
937  this->lastFrame = currentFrame;
938}
939
940
941/**
942   \brief this function gives the world a consistant state
943
944   after ticking (updating the world state) this will give a constistant
945   state to the whole system.
946*/
947void World::update()
948{
949  this->garbageCollector->update();
950  this->nullParent->update (dt);
951}
952
953
954/**
955   \brief render the current frame
956   
957   clear all buffers and draw the world
958*/
959void World::display ()
960{
961  // clear buffer
962  glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
963  // set camera
964  this->localCamera->apply ();
965  // draw world
966  this->draw();
967  // draw HUD
968  /* \todo draw HUD */
969  // flip buffers
970  SDL_GL_SwapBuffers();
971  //SDL_Surface* screen = Orxonox::getInstance()->getScreen ();
972  //SDL_Flip (screen);
973}
974
975
976/**
977   \brief add and spawn a new entity to this world
978   \param entity to be added
979*/
980void World::spawn(WorldEntity* entity)
981{
982  this->entities->add (entity);
983  entity->postSpawn ();
984}
985
986
987/**
988   \brief add and spawn a new entity to this world
989   \param entity to be added
990   \param absCoor At what coordinates to add this entity.
991   \param absDir In which direction should it look.
992*/
993void World::spawn(WorldEntity* entity, Vector* absCoor, Quaternion* absDir)
994{
995  this->entities->add (entity);
996
997  entity->setAbsCoor (absCoor);
998  entity->setAbsDir (absDir);
999
1000  entity->postSpawn ();
1001}
1002
1003
1004/**
1005   \brief add and spawn a new entity to this world
1006   \param entity to be added
1007   \param entity to be added to (PNode)
1008   \param At what relative  coordinates to add this entity.
1009   \param In which relative direction should it look.
1010*/
1011void World::spawn(WorldEntity* entity, PNode* parentNode, 
1012                  Vector* relCoor, Quaternion* relDir, 
1013                  int parentingMode)
1014{
1015  this->nullParent = NullParent::getInstance();
1016  if( parentNode != NULL)
1017    {
1018      parentNode->addChild (entity);
1019     
1020      entity->setRelCoor (relCoor);
1021      entity->setRelDir (relDir);
1022      entity->setMode(parentingMode);
1023     
1024      this->entities->add (entity);
1025     
1026      entity->postSpawn ();
1027    }
1028}
1029
1030
1031
1032/**
1033  \brief commands that the world must catch
1034  \returns false if not used by the world
1035*/
1036bool World::command(Command* cmd)
1037{
1038  if( !strcmp( cmd->cmd, "view0")) this->localCamera->setViewMode(VIEW_NORMAL);
1039  else if( !strcmp( cmd->cmd, "view1")) this->localCamera->setViewMode(VIEW_BEHIND);
1040  else if( !strcmp( cmd->cmd, "view2")) this->localCamera->setViewMode(VIEW_FRONT);
1041  else if( !strcmp( cmd->cmd, "view3")) this->localCamera->setViewMode(VIEW_LEFT);
1042  else if( !strcmp( cmd->cmd, "view4")) this->localCamera->setViewMode(VIEW_RIGHT);
1043  else if( !strcmp( cmd->cmd, "view5")) this->localCamera->setViewMode(VIEW_TOP);
1044
1045  else if( !strcmp( cmd->cmd, "function1")) printf("pressed h\n");
1046  else if( !strcmp( cmd->cmd, "function2")) printf("pressed j\n"); 
1047  else if( !strcmp( cmd->cmd, "function3")) printf("pressed k\n"); 
1048  else if( !strcmp( cmd->cmd, "function4")) printf("pressed l\n"); 
1049  else if( !strcmp( cmd->cmd, "function5")) printf("pressed n\n"); 
1050  else if( !strcmp( cmd->cmd, "function6")) printf("pressed m\n"); 
1051 
1052  return false;
1053}
1054
Note: See TracBrowser for help on using the repository browser.