Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/story_entities/world.cc @ 3958

Last change on this file since 3958 was 3870, checked in by patrick, 20 years ago

orxonox/trunk: reimplemented WeaponManager, made it as simple as possible. not yet all done

File size: 26.1 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 "skybox.h"
33#include "satellite.h"
34#include "terrain.h"
35#include "light.h"
36#include "text_engine.h"
37
38#include "track_manager.h"
39#include "garbage_collector.h"
40#include "animation_player.h"
41
42#include "command_node.h"
43#include "glmenu_imagescreen.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  TextEngine::getInstance()->flush();
161
162  AnimationPlayer::getInstance()->debug();
163  delete AnimationPlayer::getInstance(); // this should be at the end of the unloading sequence.
164  //delete garbagecollecor
165  //delete animator
166
167
168}
169
170/**
171   \brief initializes the world.
172
173   set all stuff here that is world generic and does not use to much memory
174   because the real init() function StoryEntity::init() will be called
175   shortly before start of the game. 
176   since all worlds are initiated/referenced before they will be started.
177   NO LEVEL LOADING HERE - NEVER!
178*/
179void World::init(char* name, int worldID)
180{
181  this->setClassName ("World");
182
183  this->worldName = name;
184  this->debugWorldNr = worldID;
185  this->entities = new tList<WorldEntity>();
186  AnimationPlayer::getInstance(); // initializes the animationPlayer
187}
188
189
190/**
191   \brief this is executed before load
192
193   since the load function sometimes needs data, that has been init before
194   the load and after the proceeding storyentity has finished
195*/
196ErrorMessage World::preLoad()
197{
198  /* init the world interface */
199  WorldInterface* wi = WorldInterface::getInstance();
200  wi->init(this);
201  this->garbageCollector = GarbageCollector::getInstance();
202}
203
204
205/**
206   \brief loads the World by initializing all resources, and set their default values.
207*/
208ErrorMessage World::load()
209{
210  //  BezierCurve* tmpCurve = new BezierCurve();
211  if(this->debugWorldNr != -1)
212    {
213      // initializing Font
214      this->glmis->step();
215      // initializing the TrackManager
216      trackManager = TrackManager::getInstance();
217      //trackManager->addPoint(Vector(0,0,0));
218      trackManager->addPoint(Vector(150, -35, 5));
219      trackManager->addPoint(Vector(200,-35, 5));
220      trackManager->addPoint(Vector(250, -35, 5));
221      trackManager->addPoint(Vector(320,-33,-.55));
222      trackManager->setDuration(2);
223      trackManager->setSavePoint();
224
225      trackManager->addPoint(Vector(410, 0, 0));
226      trackManager->addPoint(Vector(510, 20, -10));
227      trackManager->addPoint(Vector(550, 20, -10));
228      trackManager->addPoint(Vector(570, 20, -10));
229      trackManager->setDuration(5);
230     
231      int fork11, fork12;
232      trackManager->fork(2, &fork11, &fork12);
233      trackManager->workOn(fork11);
234      trackManager->addPoint(Vector(640, 25, -30));
235      trackManager->addPoint(Vector(700, 40, -120));
236      trackManager->addPoint(Vector(800, 50, -150));
237      trackManager->addPoint(Vector(900, 60, -100));
238      trackManager->addPoint(Vector(900, 60, -70));
239      trackManager->addPoint(Vector(990, 65, -15));
240      trackManager->addPoint(Vector(1050, 65, -10));
241      trackManager->addPoint(Vector(1100, 65, -20));
242      trackManager->setDuration(10);
243
244      trackManager->workOn(fork12);
245      trackManager->addPoint(Vector(640, 25, 20));
246      trackManager->addPoint(Vector(670, 50, 120));
247      trackManager->addPoint(Vector(700, 70, 80));
248      trackManager->addPoint(Vector(800, 70, 65));
249      trackManager->addPoint(Vector(850, 65, 65));
250      trackManager->addPoint(Vector(920, 35, 40));
251      trackManager->addPoint(Vector(945, 40, 40));
252      trackManager->addPoint(Vector(970, 24, 40));
253      trackManager->addPoint(Vector(1000, 40, -7));
254      trackManager->setDuration(10);
255     
256
257      trackManager->join(2, fork11, fork12);
258
259      trackManager->workOn(5);
260      trackManager->addPoint(Vector(1200, 60, -50));
261      trackManager->addPoint(Vector(1300, 50, -50));
262      trackManager->addPoint(Vector(1400, 40, -50));
263      trackManager->addPoint(Vector(1500, 40, -60));
264      trackManager->addPoint(Vector(1600, 35, -55));
265      trackManager->addPoint(Vector(1700, 45, -40));
266      trackManager->addPoint(Vector(1750, 60, -40));
267      trackManager->addPoint(Vector(1770, 80, -40));
268      trackManager->addPoint(Vector(1800, 100, -40));
269      trackManager->setDuration(10);
270
271      trackManager->finalize();
272
273     
274      /*monitor progress*/
275      this->glmis->step();
276
277      // LIGHT initialisation
278      lightMan = LightManager::getInstance();
279      lightMan->setAmbientColor(.1,.1,.1);
280      lightMan->addLight();
281      //      lightMan->setAttenuation(1.0, .01, 0.0);
282      //      lightMan->setDiffuseColor(1,1,1);
283      //  lightMan->addLight(1);
284      //  lightMan->setPosition(20, 10, -20);
285      //  lightMan->setDiffuseColor(0,0,0);
286      lightMan->debug();
287
288      switch(this->debugWorldNr)
289        {
290          /*
291            this loads the hard-coded debug world. this only for simplicity and will be
292            removed by a reald world-loader, which interprets a world-file.
293            if you want to add an own debug world, just add a case DEBUG_WORLD_[nr] and
294            make whatever you want...
295           */
296        case DEBUG_WORLD_0:
297          {
298            lightMan->setPosition(-5.0, 10.0, -40.0);
299            this->nullParent = NullParent::getInstance ();
300            this->nullParent->setName ("NullParent");
301
302            // !\todo old track-system has to be removed
303
304            //create helper for player
305            //HelperParent* hp = new HelperParent ();
306            /* the player has to be added to this helper */
307
308            // create a player
309            this->localPlayer = new Player ();
310            this->localPlayer->setName ("player");
311            this->spawn (this->localPlayer);
312            /*monitor progress*/
313            //this->glmis->step();
314            this->glmis->step();
315
316            // bind input
317            Orxonox *orx = Orxonox::getInstance ();
318            orx->getLocalInput()->bind (this->localPlayer);
319           
320            // bind camera
321            this->localCamera = new Camera();
322            this->localCamera->setName ("camera");
323           
324            /*monitor progress*/
325            this->glmis->step();
326
327            // Create SkySphere
328            //      this->skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
329            //      this->skySphere->setName("SkySphere");
330            //      this->localCamera->addChild(this->skySphere);
331            //      this->spawn(this->skySphere);
332            skyBox = new SkyBox();
333            skyBox->setTexture("pictures/sky/skybox", "jpg");
334            skyBox->setParent(localCamera);
335            this->spawn(skyBox);
336
337            /*monitor progress*/
338            this->glmis->step();
339
340           
341            WorldEntity* env = new Environment();
342            env->setName ("env");
343            this->spawn(env);
344
345           
346            /*
347            Vector* es = new Vector (10, 5, 0);
348            Quaternion* qs = new Quaternion ();
349            WorldEntity* pr = new Primitive(P_CYLINDER);
350            pr->setName("primitive");
351            this->spawn(pr, this->localPlayer, es, qs, PNODE_MOVEMENT);
352            */
353
354            /*monitor progress*/
355            this->glmis->step();
356
357            //      trackManager->setBindSlave(env);
358            PNode* tn = trackManager->getTrackNode();
359            tn->addChild(this->localPlayer);
360            this->localCamera->lookAt(tn);
361
362            //localCamera->setParent(TrackNode::getInstance());
363            tn->addChild(this->localCamera);
364            //      localCamera->lookAt(tn);
365            this->localPlayer->setMode(PNODE_ALL);
366            //Vector* cameraOffset = new Vector (0, 5, -10);
367            trackManager->condition(2, LEFTRIGHT, this->localPlayer);
368            this->glmis->step();
369            break;
370          }
371        case DEBUG_WORLD_1:
372          {
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            this->spawn(this->skySphere);
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->spawn(this->skySphere);
444            this->localCamera->addChild(this->skySphere);
445            this->skySphere->setMode(PNODE_MOVEMENT);
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(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(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(Vector(2.0, 0.0, 0.0));
464            this->spawn(thirdNode);
465
466           
467           
468
469            WorldEntity* b = new Environment();
470            this->localPlayer->addChild(b);
471            b->setRelCoor(Vector(10.0, 1.0, 1.0));
472            this->spawn(b);
473
474           
475            WorldEntity* c = new Environment();
476            this->localPlayer->addChild(c);
477            c->setRelCoor(Vector(10.0, 2.0, -1.0));
478            this->spawn(c);
479           
480            /*     
481                  KeyFrame* f1 = new KeyFrame;
482                  f1->position = new Vector(-1.1, 0.0, 2.6);
483                  f1->direction = new Quaternion();
484                  f1->time = 1.0;
485                  f1->mode = NEG_EXP;
486                 
487                 
488                  KeyFrame* f2 = new KeyFrame;
489                  f2->position = new Vector(-2.1, 0.0, 2.6);
490                  f2->direction = new Quaternion();
491                  f2->time = 0.1;
492                  f2->mode = NEG_EXP;
493                 
494                  KeyFrame* f3 = new KeyFrame;
495                  f3->position = new Vector(10.0, 2.0, -1.0);
496                  f3->direction = new Quaternion();
497                  f3->time = 0.2;
498                  f3->mode = NEG_EXP;
499                 
500                  KeyFrame* f4 = new KeyFrame;
501                  f4->position = new Vector(10.0, 5.0, -1.0);
502                  f4->direction = new Quaternion();
503                  f4->time = 1.0;
504                  f4->mode = NEG_EXP;
505                 
506                 
507                 
508                  this->simpleAnimation->animatorBegin();
509                  this->simpleAnimation->selectObject(b);
510                  this->simpleAnimation->setAnimationMode(SINGLE);
511                  this->simpleAnimation->addKeyFrame(f1);
512                  this->simpleAnimation->addKeyFrame(f2);
513                  this->simpleAnimation->start();
514                  this->simpleAnimation->selectObject(c);
515                  this->simpleAnimation->addKeyFrame(f3);
516                  this->simpleAnimation->addKeyFrame(f4);
517                  this->simpleAnimation->start();
518                  this->simpleAnimation->animatorEnd();
519            */
520
521            /*
522            Vector* es = new Vector (10, 5, 0);
523            Quaternion* qs = new Quaternion ();
524            WorldEntity* pr = new Primitive(P_CYLINDER);
525            pr->setName("primitive");
526            this->spawn(pr, this->localPlayer, es, qs, PNODE_MOVEMENT);
527            */
528
529            /*monitor progress*/
530            this->glmis->step();
531
532            //      trackManager->setBindSlave(env);
533            PNode* tn = trackManager->getTrackNode();
534            tn->addChild(this->localPlayer);
535
536            //localCamera->setParent(TrackNode::getInstance());
537            tn->addChild(this->localCamera);
538            //      localCamera->lookAt(tn);
539            this->localPlayer->setMode(PNODE_ALL);
540            //Vector* cameraOffset = new Vector (0, 5, -10);
541            trackManager->condition(2, LEFTRIGHT, this->localPlayer);
542            this->glmis->step();
543
544            break;
545          }
546        default:
547          printf("World::load() - no world with ID %i found", this->debugWorldNr );
548        }
549    }
550  else if(this->worldName != NULL)
551    {
552
553    }
554
555  // initialize debug coord system
556  objectList = glGenLists(1);
557  glNewList (objectList, GL_COMPILE);
558 
559  //  trackManager->drawGraph(.01);
560  trackManager->debug(2);
561  glEndList();
562
563  terrain = new Terrain("../data/worlds/newGround.obj");
564  terrain->setRelCoor(Vector(0,-10,0));
565  this->spawn(terrain);
566
567}
568
569
570/**
571   \brief initializes a new World shortly before start
572
573   this is the function, that will be loaded shortly before the world is
574   started
575*/
576ErrorMessage World::init()
577{
578  this->bPause = false;
579  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
580  cn->addToWorld(this);
581  cn->enable(true);
582}
583
584
585/**
586   \brief starts the World
587*/
588ErrorMessage World::start()
589{
590  PRINTF(3)("World::start() - starting current World: nr %i\n", this->debugWorldNr);
591  this->bQuitOrxonox = false;
592  this->bQuitCurrentGame = false;
593  this->mainLoop();
594}
595
596/**
597   \brief stops the world.
598
599   This happens, when the player decides to end the Level.
600*/
601ErrorMessage World::stop()
602{
603  PRINTF(3)("World::stop() - got stop signal\n");
604  this->bQuitCurrentGame = true;
605}
606
607/**
608   \brief pauses the Game
609*/
610ErrorMessage World::pause()
611{
612  this->isPaused = true;
613}
614
615/**
616   \brief ends the pause Phase
617*/
618ErrorMessage World::resume()
619{
620  this->isPaused = false;
621}
622
623/**
624   \brief destroys the World
625*/
626ErrorMessage World::destroy()
627{
628
629}
630
631/**
632   \brief shows the loading screen
633*/
634void World::displayLoadScreen ()
635{
636  PRINTF(3)("World::displayLoadScreen - start\n"); 
637 
638  //GLMenuImageScreen*
639  this->glmis = GLMenuImageScreen::getInstance();
640  this->glmis->init();
641  this->glmis->setMaximum(8);
642  this->glmis->draw();
643 
644  PRINTF(3)("World::displayLoadScreen - end\n"); 
645}
646
647/**
648   \brief removes the loadscreen, and changes over to the game
649
650   \todo take out the delay
651*/
652void World::releaseLoadScreen ()
653{
654  PRINTF(3)("World::releaseLoadScreen - start\n"); 
655  this->glmis->setValue(this->glmis->getMaximum());
656  //SDL_Delay(500);
657  PRINTF(3)("World::releaseLoadScreen - end\n"); 
658}
659
660
661/**
662   \brief gets the list of entities from the world
663   \returns entity list
664*/
665tList<WorldEntity>* World::getEntities()
666{
667  return this->entities;
668}
669
670
671/**
672   \brief this returns the current game time
673   \returns elapsed game time
674*/
675double World::getGameTime()
676{
677  return this->gameTime;
678}
679
680
681/**
682    \brief checks for collisions
683   
684    This method runs through all WorldEntities known to the world and checks for collisions
685    between them. In case of collisions the collide() method of the corresponding entities
686    is called.
687*/
688void World::collide ()
689{
690  /*
691  List *a, *b;
692  WorldEntity *aobj, *bobj;
693   
694  a = entities;
695 
696  while( a != NULL)
697    {
698      aobj = a->nextElement();
699      if( aobj->bCollide && aobj->collisioncluster != NULL)
700        {
701          b = a->nextElement();
702          while( b != NULL )
703            {
704              bobj = b->nextElement();
705              if( bobj->bCollide && bobj->collisioncluster != NULL )
706                {
707                  unsigned long ahitflg, bhitflg;
708                  if( check_collision ( &aobj->place, aobj->collisioncluster,
709                                        &ahitflg, &bobj->place, bobj->collisioncluster,
710                                        &bhitflg) );
711                  {
712                    aobj->collide (bobj, ahitflg, bhitflg);
713                    bobj->collide (aobj, bhitflg, ahitflg);
714                  }
715                }
716              b = b->nextElement();
717            }
718        }
719      a = a->enumerate();
720    }
721  */
722}
723
724/**
725    \brief runs through all entities calling their draw() methods
726*/
727void World::draw ()
728{
729  /* draw entities */
730  WorldEntity* entity;
731  glLoadIdentity();
732
733  //entity = this->entities->enumerate();
734  tIterator<WorldEntity>* iterator = this->entities->getIterator();
735  entity = iterator->nextElement();
736  while( entity != NULL ) 
737    { 
738      if( entity->bDraw ) entity->draw();
739      //entity = this->entities->nextElement();
740      entity = iterator->nextElement();
741    }
742  delete iterator;
743 
744  glCallList (objectList);
745
746  TextEngine::getInstance()->draw();
747  lightMan->draw(); // must be at the end of the drawing procedure, otherwise Light cannot be handled as PNodes //
748}
749
750
751/**
752   \brief function to put your own debug stuff into it. it can display informations about
753   the current class/procedure
754*/
755void World::debug()
756{
757  PRINTF(2)("debug() - starting debug\n");
758  PNode* p1 = NullParent::getInstance ();
759  PNode* p2 = new PNode (Vector(2, 2, 2), p1);
760  PNode* p3 = new PNode (Vector(4, 4, 4), p1);
761  PNode* p4 = new PNode (Vector(6, 6, 6), p2);
762
763  p1->debug ();
764  p2->debug ();
765  p3->debug ();
766  p4->debug ();
767
768  p1->shiftCoor (Vector(-1, -1, -1));
769
770  printf("World::debug() - shift\n");
771  p1->debug ();
772  p2->debug ();
773  p3->debug ();
774  p4->debug ();
775 
776  p1->update (0);
777
778  printf ("World::debug() - update\n");
779  p1->debug ();
780  p2->debug ();
781  p3->debug ();
782  p4->debug ();
783
784  p2->shiftCoor (Vector(-1, -1, -1));
785  p1->update (0);
786
787  p1->debug ();
788  p2->debug ();
789  p3->debug ();
790  p4->debug ();
791
792  p2->setAbsCoor (Vector(1,2,3));
793
794
795 p1->update (0);
796
797  p1->debug ();
798  p2->debug ();
799  p3->debug ();
800  p4->debug ();
801
802  delete p1;
803 
804 
805  /*
806  WorldEntity* entity;
807  printf("counting all entities\n");
808  printf("World::debug() - enumerate()\n");
809  entity = entities->enumerate(); 
810  while( entity != NULL )
811    {
812      if( entity->bDraw ) printf("got an entity\n");
813      entity = entities->nextElement();
814    }
815  */
816}
817
818
819/**
820  \brief main loop of the world: executing all world relevant function
821
822  in this loop we synchronize (if networked), handle input events, give the heart-beat to
823  all other member-entities of the world (tick to player, enemies etc.), checking for
824  collisions drawing everything to the screen.
825*/
826void World::mainLoop()
827{
828  this->lastFrame = SDL_GetTicks ();
829  PRINTF(3)("World::mainLoop() - Entering main loop\n");
830  while( !this->bQuitOrxonox && !this->bQuitCurrentGame) /* \todo implement pause */
831    {
832      PRINTF(3)("World::mainloop() - number of entities: %i\n", this->entities->getSize());
833      // Network
834      this->synchronize ();
835      // Process input
836      this->handleInput ();
837      if( this->bQuitCurrentGame || this->bQuitOrxonox)
838          break;
839      // Process time
840      this->tick ();
841      // Update the state
842      this->update ();     
843      // Process collision
844      this->collide ();
845      // Draw
846      this->display ();
847
848      //      for( int i = 0; i < 5000000; i++) {}
849      /* \todo this is to slow down the program for openGl Software emulator computers, reimplement*/
850    }
851  PRINTF(3)("World::mainLoop() - Exiting the main loop\n");
852}
853
854
855/**
856   \brief synchronize local data with remote data
857*/
858void World::synchronize ()
859{
860  // Get remote input
861  // Update synchronizables
862}
863
864
865/**
866   \brief run all input processing
867
868   the command node is the central input event dispatcher. the node uses the even-queue from
869   sdl and has its own event-passing-queue.
870*/
871void World::handleInput ()
872{
873  // localinput
874  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
875  cn->process();
876  // remoteinput
877}
878
879
880/**
881   \brief advance the timeline
882
883   this calculates the time used to process one frame (with all input handling, drawing, etc)
884   the time is mesured in ms and passed to all world-entities and other classes that need
885   a heart-beat.
886*/
887void World::tick ()
888{
889  Uint32 currentFrame = SDL_GetTicks();
890  if(!this->bPause)
891    {
892      this->dt = currentFrame - this->lastFrame;
893     
894      if( this->dt > 0)
895        {
896          float fps = 1000/dt;
897
898          // temporary, only for showing how fast the text-engine is
899          char tmpChar[20];
900          sprintf(tmpChar, "fps: %4.0f", fps);
901        }
902      else
903        {
904          /* the frame-rate is limited to 100 frames per second, all other things are for
905             nothing.
906          */
907          PRINTF(2)("fps = 1000 - frame rate is adjusted\n");
908          SDL_Delay(10);
909          this->dt = 10;
910        }
911      //this->timeSlice (dt);
912     
913      /* function to let all entities tick (iterate through list) */
914      float seconds = this->dt / 1000.0;     
915      this->gameTime += seconds;
916      //entity = entities->enumerate();
917      tIterator<WorldEntity>* iterator = this->entities->getIterator();
918      WorldEntity* entity = iterator->nextElement();
919      while( entity != NULL) 
920        { 
921          entity->tick (seconds);
922          entity = iterator->nextElement();
923        }
924      delete iterator;
925      //skySphere->updatePosition(localCamera->absCoordinate);
926     
927      /* update tick the rest */
928      this->trackManager->tick(this->dt);
929      this->localCamera->tick(this->dt);
930      this->garbageCollector->tick(seconds);
931
932      AnimationPlayer::getInstance()->tick(seconds);
933    }
934  this->lastFrame = currentFrame;
935}
936
937
938/**
939   \brief this function gives the world a consistant state
940
941   after ticking (updating the world state) this will give a constistant
942   state to the whole system.
943*/
944void World::update()
945{
946  this->garbageCollector->update();
947  this->nullParent->update (dt);
948}
949
950
951/**
952   \brief render the current frame
953   
954   clear all buffers and draw the world
955*/
956void World::display ()
957{
958  // clear buffer
959  glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
960  // set camera
961  this->localCamera->apply ();
962  // draw world
963  this->draw();
964  // draw HUD
965  /* \todo draw HUD */
966  // flip buffers
967  SDL_GL_SwapBuffers();
968  //SDL_Surface* screen = Orxonox::getInstance()->getScreen ();
969  //SDL_Flip (screen);
970}
971
972
973/**
974   \brief add and spawn a new entity to this world
975   \param entity to be added
976*/
977void World::spawn(WorldEntity* entity)
978{
979  this->entities->add (entity);
980  entity->postSpawn ();
981}
982
983
984/**
985   \brief add and spawn a new entity to this world
986   \param entity to be added
987   \param absCoor At what coordinates to add this entity.
988   \param absDir In which direction should it look.
989*/
990void World::spawn(WorldEntity* entity, Vector* absCoor, Quaternion* absDir)
991{
992  this->entities->add (entity);
993
994  entity->setAbsCoor (*absCoor);
995  entity->setAbsDir (*absDir);
996
997  entity->postSpawn ();
998}
999
1000
1001/**
1002   \brief add and spawn a new entity to this world
1003   \param entity to be added
1004   \param entity to be added to (PNode)
1005   \param At what relative  coordinates to add this entity.
1006   \param In which relative direction should it look.
1007*/
1008void World::spawn(WorldEntity* entity, PNode* parentNode, 
1009                  Vector* relCoor, Quaternion* relDir, 
1010                  int parentingMode)
1011{
1012  this->nullParent = NullParent::getInstance();
1013  if( parentNode != NULL)
1014    {
1015      parentNode->addChild (entity);
1016     
1017      entity->setRelCoor (*relCoor);
1018      entity->setRelDir (*relDir);
1019      entity->setMode(parentingMode);
1020     
1021      this->entities->add (entity);
1022     
1023      entity->postSpawn ();
1024    }
1025}
1026
1027
1028
1029/**
1030  \brief commands that the world must catch
1031  \returns false if not used by the world
1032*/
1033bool World::command(Command* cmd)
1034{
1035  if( !strcmp( cmd->cmd, "view0")) this->localCamera->setViewMode(VIEW_NORMAL);
1036  else if( !strcmp( cmd->cmd, "view1")) this->localCamera->setViewMode(VIEW_BEHIND);
1037  else if( !strcmp( cmd->cmd, "view2")) this->localCamera->setViewMode(VIEW_FRONT);
1038  else if( !strcmp( cmd->cmd, "view3")) this->localCamera->setViewMode(VIEW_LEFT);
1039  else if( !strcmp( cmd->cmd, "view4")) this->localCamera->setViewMode(VIEW_RIGHT);
1040  else if( !strcmp( cmd->cmd, "view5")) this->localCamera->setViewMode(VIEW_TOP);
1041
1042  return false;
1043}
1044
Note: See TracBrowser for help on using the repository browser.