Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/trunk: implemented neg_exp rotation also now

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 "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#include "animation3d.h"
47
48
49using namespace std;
50
51
52WorldInterface* WorldInterface::singletonRef = 0;
53
54
55/**
56   \brief private constructor because of singleton
57*/
58WorldInterface::WorldInterface()
59{
60  this->worldIsInitialized = false;
61  this->worldReference = NULL;
62}
63
64/**
65   \brief public deconstructor
66*/
67WorldInterface::~WorldInterface()
68{
69  this->singletonRef = NULL;
70  this->worldIsInitialized = false;
71  this->worldReference = NULL;
72}
73
74/**
75   \brief gets the singleton instance
76   \returns singleton instance
77*/
78WorldInterface* WorldInterface::getInstance()
79{
80  if( singletonRef == NULL)
81    singletonRef = new WorldInterface();
82  return singletonRef;
83}
84
85
86/**
87   \brief initializes the interface
88   \param reference to the world
89
90   if the worldinterface is not initilizes, there wont be any
91   useable interface
92*/
93void WorldInterface::init(World* world)
94{
95  this->worldReference = world;
96  if( world != NULL)
97    {
98      this->worldIsInitialized = true;
99      PRINTF(3)("WorldInterface up and running\n");
100    }
101}
102
103
104/**
105   \brief gets the entity list from the world
106   \return entity list
107*/
108tList<WorldEntity>* WorldInterface::getEntityList()
109{
110  if( this->worldIsInitialized)
111    return this->worldReference->getEntities();
112  PRINT(1)("Someone tried to use the WorldInterface before it has been initizlized! this can result in SEGFAULTs!\n");
113  return NULL;
114}
115
116
117
118/**
119    \brief create a new World
120   
121    This creates a new empty world!
122*/
123World::World (char* name)
124{
125  this->init(name, -1);
126  //NullParent* np = NullParent::getInstance();
127}
128
129/**
130   \brief creates a new World...
131   \param worldID with this ID
132*/
133World::World (int worldID)
134{
135  this->init(NULL, worldID);
136}
137
138/**
139    \brief remove the World from memory
140   
141    delete everything explicitly, that isn't contained in the parenting tree!
142    things contained in the tree are deleted automaticaly
143*/
144World::~World ()
145{
146  PRINTF(3)("World::~World() - deleting current world\n");
147  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
148  cn->unbind(this->localPlayer);
149  cn->reset();
150
151  ResourceManager::getInstance()->debug();
152  ResourceManager::getInstance()->unloadAllByPriority(RP_LEVEL);
153  ResourceManager::getInstance()->debug();
154
155  delete WorldInterface::getInstance();
156
157  delete this->nullParent;
158  delete this->entities;
159  delete this->lightMan;
160  delete this->trackManager;
161  TextEngine::getInstance()->flush();
162
163  AnimationPlayer::getInstance()->debug();
164  delete AnimationPlayer::getInstance(); // this should be at the end of the unloading sequence.
165  //delete garbagecollecor
166  //delete animator
167
168
169}
170
171/**
172   \brief initializes the world.
173
174   set all stuff here that is world generic and does not use to much memory
175   because the real init() function StoryEntity::init() will be called
176   shortly before start of the game. 
177   since all worlds are initiated/referenced before they will be started.
178   NO LEVEL LOADING HERE - NEVER!
179*/
180void World::init(char* name, int worldID)
181{
182  this->setClassName ("World");
183
184  this->worldName = name;
185  this->debugWorldNr = worldID;
186  this->entities = new tList<WorldEntity>();
187  AnimationPlayer::getInstance(); // initializes the animationPlayer
188}
189
190
191/**
192   \brief this is executed before load
193
194   since the load function sometimes needs data, that has been init before
195   the load and after the proceeding storyentity has finished
196*/
197ErrorMessage World::preLoad()
198{
199  /* init the world interface */
200  WorldInterface* wi = WorldInterface::getInstance();
201  wi->init(this);
202  this->garbageCollector = GarbageCollector::getInstance();
203}
204
205
206/**
207   \brief loads the World by initializing all resources, and set their default values.
208*/
209ErrorMessage World::load()
210{
211  //  BezierCurve* tmpCurve = new BezierCurve();
212  if(this->debugWorldNr != -1)
213    {
214      // initializing Font
215      this->glmis->step();
216      // initializing the TrackManager
217      trackManager = TrackManager::getInstance();
218      //trackManager->addPoint(Vector(0,0,0));
219      trackManager->addPoint(Vector(150, -35, 5));
220      trackManager->addPoint(Vector(200,-35, 5));
221      trackManager->addPoint(Vector(250, -35, 5));
222      trackManager->addPoint(Vector(320,-33,-.55));
223      trackManager->setDuration(2);
224      trackManager->setSavePoint();
225
226      trackManager->addPoint(Vector(410, 0, 0));
227      trackManager->addPoint(Vector(510, 20, -10));
228      trackManager->addPoint(Vector(550, 20, -10));
229      trackManager->addPoint(Vector(570, 20, -10));
230      trackManager->setDuration(5);
231     
232      int fork11, fork12;
233      trackManager->fork(2, &fork11, &fork12);
234      trackManager->workOn(fork11);
235      trackManager->addPoint(Vector(640, 25, -30));
236      trackManager->addPoint(Vector(700, 40, -120));
237      trackManager->addPoint(Vector(800, 50, -150));
238      trackManager->addPoint(Vector(900, 60, -100));
239      trackManager->addPoint(Vector(900, 60, -70));
240      trackManager->addPoint(Vector(990, 65, -15));
241      trackManager->addPoint(Vector(1050, 65, -10));
242      trackManager->addPoint(Vector(1100, 65, -20));
243      trackManager->setDuration(10);
244
245      trackManager->workOn(fork12);
246      trackManager->addPoint(Vector(640, 25, 20));
247      trackManager->addPoint(Vector(670, 50, 120));
248      trackManager->addPoint(Vector(700, 70, 80));
249      trackManager->addPoint(Vector(800, 70, 65));
250      trackManager->addPoint(Vector(850, 65, 65));
251      trackManager->addPoint(Vector(920, 35, 40));
252      trackManager->addPoint(Vector(945, 40, 40));
253      trackManager->addPoint(Vector(970, 24, 40));
254      trackManager->addPoint(Vector(1000, 40, -7));
255      trackManager->setDuration(10);
256     
257
258      trackManager->join(2, fork11, fork12);
259
260      trackManager->workOn(5);
261      trackManager->addPoint(Vector(1200, 60, -50));
262      trackManager->addPoint(Vector(1300, 50, -50));
263      trackManager->addPoint(Vector(1400, 40, -50));
264      trackManager->addPoint(Vector(1500, 40, -60));
265      trackManager->addPoint(Vector(1600, 35, -55));
266      trackManager->addPoint(Vector(1700, 45, -40));
267      trackManager->addPoint(Vector(1750, 60, -40));
268      trackManager->addPoint(Vector(1770, 80, -40));
269      trackManager->addPoint(Vector(1800, 100, -40));
270      trackManager->setDuration(10);
271
272      trackManager->finalize();
273
274     
275      /*monitor progress*/
276      this->glmis->step();
277
278      // LIGHT initialisation
279      lightMan = LightManager::getInstance();
280      lightMan->setAmbientColor(.1,.1,.1);
281      lightMan->addLight();
282      //      lightMan->setAttenuation(1.0, .01, 0.0);
283      //      lightMan->setDiffuseColor(1,1,1);
284      //  lightMan->addLight(1);
285      //  lightMan->setPosition(20, 10, -20);
286      //  lightMan->setDiffuseColor(0,0,0);
287      lightMan->debug();
288
289      switch(this->debugWorldNr)
290        {
291          /*
292            this loads the hard-coded debug world. this only for simplicity and will be
293            removed by a reald world-loader, which interprets a world-file.
294            if you want to add an own debug world, just add a case DEBUG_WORLD_[nr] and
295            make whatever you want...
296           */
297        case DEBUG_WORLD_0:
298          {
299            lightMan->setPosition(-5.0, 10.0, -40.0);
300            this->nullParent = NullParent::getInstance ();
301            this->nullParent->setName ("NullParent");
302
303            // !\todo old track-system has to be removed
304
305            //create helper for player
306            //HelperParent* hp = new HelperParent ();
307            /* the player has to be added to this helper */
308
309            // create a player
310            this->localPlayer = new Player ();
311            this->localPlayer->setName ("player");
312            this->spawn (this->localPlayer);
313            /*monitor progress*/
314            //this->glmis->step();
315            this->glmis->step();
316
317            // bind input
318            Orxonox *orx = Orxonox::getInstance ();
319            orx->getLocalInput()->bind (this->localPlayer);
320           
321            // bind camera
322            this->localCamera = new Camera();
323            this->localCamera->setName ("camera");
324           
325            /*monitor progress*/
326            this->glmis->step();
327
328            // Create SkySphere
329            //      this->skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
330            //      this->skySphere->setName("SkySphere");
331            //      this->localCamera->addChild(this->skySphere);
332            //      this->spawn(this->skySphere);
333            skyBox = new SkyBox();
334            skyBox->setTexture("pictures/sky/skybox", "jpg");
335            skyBox->setParent(localCamera);
336            this->spawn(skyBox);
337
338            /*monitor progress*/
339            this->glmis->step();
340
341           
342            WorldEntity* env = new Environment();
343            env->setName ("env");
344            this->spawn(env);
345
346           
347            /*
348            Vector* es = new Vector (10, 5, 0);
349            Quaternion* qs = new Quaternion ();
350            WorldEntity* pr = new Primitive(P_CYLINDER);
351            pr->setName("primitive");
352            this->spawn(pr, this->localPlayer, es, qs, PNODE_MOVEMENT);
353            */
354
355            /*monitor progress*/
356            this->glmis->step();
357
358            //      trackManager->setBindSlave(env);
359            PNode* tn = trackManager->getTrackNode();
360            tn->addChild(this->localPlayer);
361            this->localCamera->lookAt(tn);
362
363            //localCamera->setParent(TrackNode::getInstance());
364            tn->addChild(this->localCamera);
365            //      localCamera->lookAt(tn);
366            this->localPlayer->setMode(PNODE_ALL);
367            //Vector* cameraOffset = new Vector (0, 5, -10);
368            trackManager->condition(2, LEFTRIGHT, this->localPlayer);
369            this->glmis->step();
370            break;
371          }
372        case DEBUG_WORLD_1:
373          {
374            lightMan->setPosition(.0, .0, .0);
375            lightMan->setAttenuation(1.0, .01, 0.0);
376            lightMan->setSpecularColor(1,0,0);
377            this->nullParent = NullParent::getInstance ();
378            this->nullParent->setName ("NullParent");
379
380            // create a player
381            WorldEntity* myPlayer = new Player();
382            myPlayer->setName ("player");
383            this->spawn(myPlayer);
384            this->localPlayer = myPlayer;           
385           
386            // bind input
387            Orxonox *orx = Orxonox::getInstance();
388            orx->getLocalInput()->bind (myPlayer);
389           
390            // bind camera
391            this->localCamera = new Camera ();
392            this->localCamera->setName ("camera");
393            this->localCamera->lookAt(LightManager::getInstance()->getLight(0));
394            this->localCamera->setParent(this->localPlayer);
395
396            // Create SkySphere
397            skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
398            this->localPlayer->addChild(this->skySphere);
399            this->spawn(this->skySphere);
400            Vector* es = new Vector (20, 0, 0);
401            Quaternion* qs = new Quaternion ();
402
403            lightMan->getLight(0)->setParent(trackManager->getTrackNode());
404            break;
405          }
406        case DEBUG_WORLD_2:
407          {
408            lightMan->setAmbientColor(.1,.1,.1);
409            lightMan->addLight();
410            lightMan->setPosition(-5.0, 10.0, -40.0);
411            this->nullParent = NullParent::getInstance ();
412            this->nullParent->setName ("NullParent");
413
414            // !\todo old track-system has to be removed
415
416            //create helper for player
417            //HelperParent* hp = new HelperParent ();
418            /* the player has to be added to this helper */
419
420            // create a player
421            this->localPlayer = new Player ();
422            this->localPlayer->setName ("player");
423            this->spawn (this->localPlayer);
424            /*monitor progress*/
425            //this->glmis->step();         
426            this->glmis->step();
427
428            // bind input
429            Orxonox *orx = Orxonox::getInstance ();
430            orx->getLocalInput()->bind (this->localPlayer);
431           
432            // bind camera
433            this->localCamera = new Camera();
434            this->localCamera->setName ("camera");
435            this->localCamera->lookAt(this->localPlayer);
436            this->localCamera->setParent(this->localPlayer);
437           
438            /*monitor progress*/
439            this->glmis->step();
440
441            // Create SkySphere
442            this->skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
443            this->skySphere->setName("SkySphere");
444            this->spawn(this->skySphere);
445            this->localCamera->addChild(this->skySphere);
446            this->skySphere->setMode(PNODE_MOVEMENT);
447            /*monitor progress*/
448            this->glmis->step();
449
450
451            WorldEntity* baseNode = new Satellite(Vector(1,0,1), 1.2);
452            this->localPlayer->addChild(baseNode);
453            baseNode->setRelCoor(Vector(10.0, 2.0, 1.0));
454            this->spawn(baseNode);
455
456            WorldEntity* secondNode = new Satellite(Vector(0,0,1), 2.0);
457            baseNode->addChild(secondNode);
458            secondNode->setRelCoor(Vector(0.0, 0.0, 3.0));
459            this->spawn(secondNode);
460
461
462            WorldEntity* thirdNode = new Satellite(Vector(0,0,1), 1.0);
463            secondNode->addChild(thirdNode);
464            thirdNode->setRelCoor(Vector(2.0, 0.0, 0.0));
465            this->spawn(thirdNode);
466
467           
468   
469            WorldEntity* c = new Environment();
470            this->localPlayer->addChild(c);
471            c->setRelCoor(Vector(10.0, 2.0, -1.0));
472            this->spawn(c);
473
474
475           
476            Animation3D* animation = new Animation3D(c);
477            animation->setInfinity(ANIM_INF_REPLAY);
478
479            animation->addKeyFrame(Vector(0, 0, 0), Quaternion(0, Vector(0,1,0)), 1.0, ANIM_LINEAR, ANIM_NEG_EXP); 
480            animation->addKeyFrame(Vector(0, 2, 0), Quaternion(M_PI, Vector(0,1,0)), 1.0, ANIM_LINEAR, ANIM_NEG_EXP); 
481            animation->addKeyFrame(Vector(0, 0, 0), Quaternion(0, Vector(0,1,0)), 1.0, ANIM_LINEAR, ANIM_NEG_EXP); 
482
483            //animation->addKeyFrame(Vector(0, 0, 0), Quaternion(), 1.0, ANIM_LINEAR);
484
485
486
487
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(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 (Vector(2, 2, 2), p1);
769  PNode* p3 = new PNode (Vector(4, 4, 4), p1);
770  PNode* p4 = new PNode (Vector(6, 6, 6), p2);
771
772  p1->debug ();
773  p2->debug ();
774  p3->debug ();
775  p4->debug ();
776
777  p1->shiftCoor (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 (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 (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
941      AnimationPlayer::getInstance()->tick(seconds);
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.