Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/trunk: patch to use relative coordinates again, some smaller changes in the preLoading/loading mechanisms

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