Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 3791 was 3790, checked in by bensch, 21 years ago

orxonox/trunk: merged the textEngine back into the trunk.
merged with command:
svn merge -r 3681:HEAD branches/textEngine/ trunk/

conflicts in:
world.cc/h orxonox.cc NEWS
changed in favor of the trunk

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