Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/branches/particleEngine/src/story_entities/world.cc @ 3934

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

orxonox/branches/particleEngine: particles get deleted after theit life is over

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