Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/trunk: SkyBox finished

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