Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/branches/trackManager/src/story_entities/world.cc @ 3515

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

orxonox/branches/trackManager: now ability to set LEFT-RIGHT decision for nodes

File size: 22.3 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#include "world.h"
18#include "world_entity.h"
19#include "track_manager.h"
20#include "player.h"
21#include "command_node.h"
22#include "camera.h"
23#include "environment.h"
24#include "p_node.h"
25#include "null_parent.h"
26#include "helper_parent.h"
27#include "glmenu_imagescreen.h"
28#include "skysphere.h"
29#include "light.h"
30#include "fontset.h"
31#include "track_node.h"
32
33using namespace std;
34
35
36/**
37    \brief create a new World
38   
39    This creates a new empty world!
40*/
41World::World (char* name)
42{
43  this->setClassName ("World");
44  this->worldName = name;
45  this->debugWorldNr = -1;
46  this->entities = new tList<WorldEntity>();
47}
48
49/**
50   \brief creates a new World...
51   \param worldID with this ID
52*/
53World::World (int worldID)
54{
55  this->debugWorldNr = worldID;
56  this->worldName = NULL;
57  this->entities = new tList<WorldEntity>();
58}
59
60/**
61    \brief remove the World from memory
62   
63    delete everything explicitly, that isn't contained in the parenting tree!
64    things contained in the tree are deleted automaticaly
65*/
66World::~World ()
67{
68  printf("World::~World() - deleting current world\n");
69  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
70  cn->unbind(this->localPlayer);
71  cn->reset();
72
73  this->localCamera->destroy();
74  this->nullParent->destroy(); 
75  delete this->skySphere;
76
77  //delete this->trackManager;
78
79  /*
80  WorldEntity* entity = entities->enumerate(); 
81  while( entity != NULL )
82    {
83      entity->destroy();
84      entity = entities->nextElement();
85    }
86  this->entities->destroy();
87  */
88
89  /* FIX the parent list has to be cleared - not possible if we got the old list also*/
90
91
92  //delete this->entities;
93  //delete this->localCamera;
94  /* this->localPlayer hasn't to be deleted explicitly, it is
95     contained in entities*/
96}
97
98
99/**
100   \brief loads the World by initializing all resources, and set their default values.
101*/
102ErrorMessage World::load()
103{
104  //  BezierCurve* tmpCurve = new BezierCurve();
105  if(this->debugWorldNr != -1)
106    {
107      // initializing Font
108      testFont = new FontSet();
109      testFont->buildFont("../data/pictures/font.tga");
110
111      // initializing the TrackManager
112      trackManager = TrackManager::getInstance();
113      trackManager->addPoint(Vector(0,-5,0));
114      trackManager->addPoint(Vector(10,0,5));
115      trackManager->addPoint(Vector(20,0,-5));
116      trackManager->addPoint(Vector(30,0,5));
117      trackManager->addPoint(Vector(40,0,5));
118      trackManager->setDuration(2);
119      trackManager->setSavePoint();
120      trackManager->addPoint(Vector(50,10,10));
121      trackManager->addPoint(Vector(60,0, 10));
122      trackManager->addPoint(Vector(70,0, 10));
123      trackManager->addPoint(Vector(80,0,-10));
124      trackManager->addPoint(Vector(90,0,-10));
125      trackManager->setDuration(5);
126      trackManager->setSavePoint();
127      trackManager->addPoint(Vector(110,0,5));
128      trackManager->addPoint(Vector(120,0, 10));
129      trackManager->addPoint(Vector(130,0, 10));
130      trackManager->addPoint(Vector(140,0,-10));
131      trackManager->addPoint(Vector(150,0,-10));
132      trackManager->setDuration(3);
133      int fork11, fork12, fork13, fork14;
134      trackManager->fork(4, &fork11, &fork12, &fork13, &fork14);
135      trackManager->workOn(fork11);
136      trackManager->addPoint(Vector(170, 0, -15));
137      trackManager->addPoint(Vector(180, 0, -15));
138      trackManager->setDuration(3);
139      trackManager->workOn(fork12);
140      trackManager->addPoint(Vector(170, 0, 10));
141      trackManager->addPoint(Vector(180, 0, 10));
142      trackManager->addPoint(Vector(190,2,5));
143      trackManager->addPoint(Vector(200,2,5));
144      trackManager->setDuration(7);
145      int fork21, fork22;
146      trackManager->fork(2, &fork21, &fork22);
147      trackManager->workOn(fork21);
148      trackManager->addPoint(Vector(220, 10,-10));
149      trackManager->addPoint(Vector(230, 0,-10));
150      trackManager->addPoint(Vector(240, 0, 2));
151      trackManager->addPoint(Vector(250, 0, 0));
152      trackManager->addPoint(Vector(260, 0, 5));
153      trackManager->setDuration(3);
154      trackManager->join(2, fork12, fork11);
155      trackManager->workOn(fork22);
156      trackManager->addPoint(Vector(220, -10,10));
157      trackManager->addPoint(Vector(230, 0, 10));
158      trackManager->addPoint(Vector(240, 0, 10));
159      trackManager->addPoint(Vector(250, 0, 5));
160      trackManager->setDuration(6);
161      trackManager->workOn(fork13);
162      trackManager->addPoint(Vector(200,-10,5));
163      trackManager->addPoint(Vector(250,-10,5));
164      trackManager->setDuration(3);
165      trackManager->workOn(fork14);
166      trackManager->addPoint(Vector(200,15,0));
167      trackManager->addPoint(Vector(210,0,10));
168      trackManager->setDuration(1);
169      trackManager->join(4, fork21, fork22, fork13, fork14);
170      trackManager->workOn(10);
171      trackManager->addPoint(Vector(250,-10,5));
172      trackManager->addPoint(Vector(260,-10,5));
173      trackManager->finalize();
174     
175      /*monitor progress*/
176      this->glmis->step();
177
178      /*
179        tmpCurve->addNode(Vector(10,  -1,  -1));
180        tmpCurve->addNode(Vector(10,  -2,   2));
181        tmpCurve->addNode(Vector(10,   3,   3));
182        tmpCurve->addNode(Vector(10,   4,  -4), 0);
183        tmpCurve->addNode(Vector(10,  -1,  -1));
184        tmpCurve->addNode(Vector(10,  -2,   2));
185        tmpCurve->addNode(Vector(10,   3,   3));
186        tmpCurve->addNode(Vector(10,   4,  -4), 0);
187        tmpCurve->debug();
188      */
189      switch(this->debugWorldNr)
190        {
191          /*
192            this loads the hard-coded debug world. this only for simplicity and will be
193            removed by a reald world-loader, which interprets a world-file.
194            if you want to add an own debug world, just add a case DEBUG_WORLD_[nr] and
195            make whatever you want...
196           */
197        case DEBUG_WORLD_0:
198          {
199            this->nullParent = NullParent::getInstance ();
200            this->nullParent->setName ("NullParent");
201
202            // !\todo old track-system has to be removed
203
204            //create helper for player
205            HelperParent* hp = new HelperParent ();
206            /* the player has to be added to this helper */
207
208            // create a player
209            WorldEntity* myPlayer = new Player ();
210            myPlayer->setName ("player");
211            this->spawn (myPlayer);
212            this->localPlayer = myPlayer;
213            /*monitor progress*/
214            this->glmis->step();           
215
216            // bind input
217            Orxonox *orx = Orxonox::getInstance ();
218            orx->getLocalInput()->bind (myPlayer);
219           
220            // bind camera
221            this->localCamera = new Camera(this);
222            this->localCamera->setName ("camera");
223            this->localCamera->bind (myPlayer);
224            //this->localPlayer->addChild (this->localCamera);
225
226            // Create SkySphere
227            skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
228
229            /*monitor progress*/
230            this->glmis->step();
231
232            Vector* es = new Vector (50, 2, 0);
233            Quaternion* qs = new Quaternion ();
234            WorldEntity* env = new Environment();
235            env->setName ("env");
236            this->spawn(env, es, qs);
237           
238            /*monitor progress*/
239            this->glmis->step();
240
241            trackManager->setBindSlave(TrackNode::getInstance());
242            trackManager->condition(3, LEFTRIGHT, myPlayer);
243            TrackNode::getInstance()->addChild(myPlayer);
244            TrackNode::getInstance()->addChild(localCamera);
245
246            break;
247          }
248        case DEBUG_WORLD_1:
249          {
250            /*
251            this->testCurve = new UPointCurve();
252            this->testCurve->addNode(Vector( 0, 0, 0));
253            this->testCurve->addNode(Vector(10, 0, 5));
254            this->testCurve->addNode(Vector(20, -5,-5));
255            this->testCurve->addNode(Vector(30, 5, 10));
256            this->testCurve->addNode(Vector(40, 0,-10));
257            this->testCurve->addNode(Vector(50, 0,-10));
258            */
259
260            this->nullParent = NullParent::getInstance ();
261            this->nullParent->setName ("NullParent");
262
263
264
265            // create a player
266            WorldEntity* myPlayer = new Player();
267            myPlayer->setName ("player");
268            this->spawn(myPlayer);
269            this->localPlayer = myPlayer;           
270           
271            // bind input
272            Orxonox *orx = Orxonox::getInstance();
273            orx->getLocalInput()->bind (myPlayer);
274           
275            // bind camera
276            this->localCamera = new Camera (this);
277            this->localCamera->setName ("camera");
278            this->localCamera->bind (myPlayer); 
279            this->localPlayer->addChild (this->localCamera);
280
281            // Create SkySphere
282            skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
283
284            break;
285
286
287          }
288        default:
289          printf("World::load() - no world with ID %i found", this->debugWorldNr );
290        }
291    }
292  else if(this->worldName != NULL)
293    {
294
295    }
296
297  // initialize debug coord system
298  objectList = glGenLists(1);
299  glNewList (objectList, GL_COMPILE);
300  glLoadIdentity();
301  glColor3f(1.0,0,0);
302  glBegin(GL_QUADS);
303
304  int sizeX = 100;
305  int sizeZ = 80;
306  float length = 1000;
307  float width = 200;
308  float widthX = float (length /sizeX);
309  float widthZ = float (width /sizeZ);
310 
311  float height [sizeX][sizeZ];
312  Vector normal_vectors[sizeX][sizeZ];
313 
314 
315  for ( int i = 0; i<sizeX-1; i+=1)
316    for (int j = 0; j<sizeZ-1;j+=1)
317      //height[i][j] = rand()/20046 + (j-25)*(j-25)/30;
318#ifdef __WIN32__
319      height[i][j]=(sin((float)j/3)*rand()*i/182400)*.5;
320#else
321      height[i][j]=(sin((float)j/3)*rand()*(long)i/6282450500.0)*.5;
322#endif
323
324  //Die Huegel ein wenig glaetten
325  for (int h=1; h<2;h++)
326    for (int i=1;i<sizeX-2 ;i+=1 )
327      for(int j=1;j<sizeZ-2;j+=1)
328        height[i][j]=(height[i+1][j]+height[i][j+1]+height[i-1][j]+height[i][j-1])/4;
329 
330  //Berechnung von normalen Vektoren
331  for(int i=1;i<sizeX-2;i+=1)
332    for(int j=1;j<sizeZ-2 ;j+=1)
333      {
334        Vector v1 = Vector (widthX*(1),      height[i][j],      widthZ*(j) );
335        Vector v2 = Vector (widthX*(i-1),    height[i-1][j],    widthZ*(j));
336        Vector v3 = Vector (widthX*(i),      height[i][j+1],    widthZ*(j+1));
337        Vector v4 = Vector (widthX*(i+1),    height[i+1][j],    widthZ*(j));
338        Vector v5 = Vector (widthX*(i),      height[i][j-1],    widthZ*(j-1));
339       
340        Vector c1 = v2 - v1;
341        Vector c2 = v3 - v1;
342        Vector c3=  v4 - v1;
343        Vector c4 = v5 - v1;
344        Vector zero = Vector (0,0,0);
345        normal_vectors[i][j]=c1.cross(v3-v5)+c2.cross(v4-v2)+c3.cross(v5-v3)+c4.cross(v2-v4);
346        normal_vectors[i][j].normalize();
347      }
348
349  int snowheight=3;
350  for ( int i = 0; i<sizeX; i+=1)
351    for (int j = 0; j<sizeZ;j+=1)
352      {   
353        Vector v1 = Vector (widthX*(i),      height[i][j]-20,       widthZ*(j)  -width/2);
354        Vector v2 = Vector (widthX*(i+1),    height[i+1][j]-20,     widthZ*(j)  -width/2);
355        Vector v3 = Vector (widthX*(i+1),    height[i+1][j+1]-20,   widthZ*(j+1)-width/2);
356        Vector v4 = Vector (widthX*(i),      height[i][j+1]-20,     widthZ*(j+1)-width/2);
357        float a[3];
358        if(height[i][j]<snowheight){
359          a[0]=0;
360          a[1]=1.0-height[i][j]/10-.3;
361          a[2]=0;
362          glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
363        }
364        else{
365            a[0]=1.0;
366            a[1]=1.0;
367            a[2]=1.0;
368            glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
369           
370        }
371        glNormal3f(normal_vectors[i][j].x, normal_vectors[i][j].y, normal_vectors[i][j].z);
372        glVertex3f(v1.x, v1.y, v1.z);
373        if(height[i+1][j]<snowheight){
374          a[0]=0;
375          a[1] =1.0-height[i+1][j]/10-.3;
376          a[2]=0;
377          glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
378        }
379        else{
380          a[0]=1.0;
381          a[1]=1.0;
382          a[2]=1.0;
383          glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
384         
385        }
386        glNormal3f(normal_vectors[i+1][j].x, normal_vectors[i+1][j].y, normal_vectors[i+1][j].z);
387        glVertex3f(v2.x, v2.y, v2.z);
388        if(height[i+1][j+1]<snowheight){
389          a[0]=0;
390          a[1] =1.0-height[i+1][j+1]/10-.3;
391          a[2]=0;
392          glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
393        }
394        else{
395          a[0]=1.0;
396          a[1]=1.0;
397          a[2]=1.0;
398          glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
399         
400         
401        }
402        glNormal3f(normal_vectors[i+1][j+1].x, normal_vectors[i+1][j+1].y, normal_vectors[i+1][j+1].z);
403        glVertex3f(v3.x, v3.y, v3.z);
404        if(height[i][j+1]<snowheight){
405          a[0]=0;
406          a[1] =1.0-height[i+1][j+1]/10-.3;
407          a[2]=0;
408          glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
409        }
410        else{
411          a[0]=1.0;
412          a[1]=1.0;
413          a[2]=1.0;
414          glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
415        }
416        glNormal3f(normal_vectors[i][j+1].x, normal_vectors[i][j+1].y, normal_vectors[i][j+1].z);
417        glVertex3f(v4.x, v4.y, v4.z);
418       
419      }
420  glEnd();
421  /* 
422  glBegin(GL_LINES);
423  for( float x = -128.0; x < 128.0; x += 25.0)
424    {
425      for( float y = -128.0; y < 128.0; y += 25.0)
426        {
427          glColor3f(1,0,0);
428          glVertex3f(x,y,-128.0);
429          glVertex3f(x,y,0.0);
430          glColor3f(0.5,0,0);
431          glVertex3f(x,y,0.0);
432          glVertex3f(x,y,128.0);
433        }
434    }
435  for( float y = -128.0; y < 128.0; y += 25.0)
436    {
437      for( float z = -128.0; z < 128.0; z += 25.0)
438        {
439          glColor3f(0,1,0);
440          glVertex3f(-128.0,y,z);
441          glVertex3f(0.0,y,z);
442          glColor3f(0,0.5,0);
443          glVertex3f(0.0,y,z);
444          glVertex3f(128.0,y,z);
445        }
446    }
447  for( float x = -128.0; x < 128.0; x += 25.0)
448    {
449      for( float z = -128.0; z < 128.0; z += 25.0)
450        {
451          glColor3f(0,0,1);
452          glVertex3f(x,-128.0,z);
453          glVertex3f(x,0.0,z);
454          glColor3f(0,0,0.5);
455          glVertex3f(x,0.0,z);
456          glVertex3f(x,128.0,z);
457        }
458     
459    }
460  */ 
461  /*
462  glBegin(GL_LINE_STRIP);
463  glColor3f(1.0, 5.0, 1.0);
464  for( int i = 0; i <= 30; i++)
465    {
466      glEvalCoord1f ((GLfloat) i/30.0);
467    }
468  glEnd();
469  */
470
471  trackManager->drawGraph(.01);
472  trackManager->debug(2);
473  /* 
474  glBegin(GL_LINES);
475  float i;
476  for(i = 0.0; i<1; i+=.01)
477    {
478      printf("%f, %f, %f\n",tmpCurve->calcPos(i).x, tmpCurve->calcPos(i).y, tmpCurve->calcPos(i).z);
479      glVertex3f(tmpCurve->calcPos(i).x, tmpCurve->calcPos(i).y, tmpCurve->calcPos(i).z);
480    }
481  glEnd();
482  */
483  glEndList();
484  // LIGHT initialisation
485  light = Light::getInstance();
486  light->addLight(0);
487  light->setAttenuation(QUADRATIC, 1.0);
488  light->setAttenuation(CONSTANT, 2.0);
489  light->setAttenuation(QUADRATIC, 1.0);
490  light->setPosition(10.0, 10.0, 50.0);
491  light->setDiffuseColor(1,1,1);
492  //  light->addLight(1);
493  //  light->setPosition(20, 10, -20);
494  //  light->setDiffuseColor(0,0,0);
495  light->debug();
496
497
498}
499
500/**
501   \brief initializes a new World
502*/
503ErrorMessage World::init()
504{
505  this->bPause = false;
506  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
507  cn->addToWorld(this);
508  cn->enable(true);
509
510  //glMap1f (GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);
511  //glEnable (GL_MAP1_VERTEX_3);
512 
513  //theNurb = gluNewNurbsRenderer ();
514  //gluNurbsProperty (theNurb, GLU_NURBS_MODE, GLU_NURBS_TESSELLATOR);
515  //gluNurbsProperty (theNurb, GLU_NURBS_VERTEX, vertexCallback );
516
517}
518
519
520/**
521   \brief starts the World
522*/
523ErrorMessage World::start()
524{
525  printf("World::start() - starting current World: nr %i\n", this->debugWorldNr);
526  this->bQuitOrxonox = false;
527  this->bQuitCurrentGame = false;
528  this->mainLoop();
529}
530
531/**
532   \brief stops the world.
533
534   This happens, when the player decides to end the Level.
535*/
536ErrorMessage World::stop()
537{
538  printf("World::stop() - got stop signal\n");
539  this->bQuitCurrentGame = true;
540}
541
542/**
543   \brief pauses the Game
544*/
545ErrorMessage World::pause()
546{
547  this->isPaused = true;
548}
549
550/**
551   \brief ends the pause Phase
552*/
553ErrorMessage World::resume()
554{
555  this->isPaused = false;
556}
557
558/**
559   \brief destroys the World
560*/
561ErrorMessage World::destroy()
562{
563  delete trackManager;
564}
565
566/**
567   \brief shows the loading screen
568*/
569void World::displayLoadScreen ()
570{
571  printf ("World::displayLoadScreen - start\n"); 
572 
573  //GLMenuImageScreen*
574  this->glmis = GLMenuImageScreen::getInstance();
575  this->glmis->init();
576  this->glmis->setMaximum(10);
577  this->glmis->draw();
578 
579  printf ("World::displayLoadScreen - end\n"); 
580}
581
582/**
583   \brief removes the loadscreen, and changes over to the game
584
585   \todo take out the delay
586*/
587void World::releaseLoadScreen ()
588{
589  printf ("World::releaseLoadScreen - start\n"); 
590  this->glmis->setValue(this->glmis->getMaximum());
591  SDL_Delay(500);
592  printf ("World::releaseLoadScreen - end\n"); 
593}
594
595
596/**
597    \brief checks for collisions
598   
599    This method runs through all WorldEntities known to the world and checks for collisions
600    between them. In case of collisions the collide() method of the corresponding entities
601    is called.
602*/
603void World::collide ()
604{
605  /*
606  List *a, *b;
607  WorldEntity *aobj, *bobj;
608   
609  a = entities;
610 
611  while( a != NULL)
612    {
613      aobj = a->nextElement();
614      if( aobj->bCollide && aobj->collisioncluster != NULL)
615        {
616          b = a->nextElement();
617          while( b != NULL )
618            {
619              bobj = b->nextElement();
620              if( bobj->bCollide && bobj->collisioncluster != NULL )
621                {
622                  unsigned long ahitflg, bhitflg;
623                  if( check_collision ( &aobj->place, aobj->collisioncluster,
624                                        &ahitflg, &bobj->place, bobj->collisioncluster,
625                                        &bhitflg) );
626                  {
627                    aobj->collide (bobj, ahitflg, bhitflg);
628                    bobj->collide (aobj, bhitflg, ahitflg);
629                  }
630                }
631              b = b->nextElement();
632            }
633        }
634      a = a->enumerate();
635    }
636  */
637}
638
639/**
640    \brief runs through all entities calling their draw() methods
641*/
642void World::draw ()
643{
644  /* draw entities */
645  WorldEntity* entity;
646  entity = this->entities->enumerate();
647  while( entity != NULL ) 
648    { 
649      if( entity->bDraw ) entity->draw();
650      entity = this->entities->nextElement();
651    } 
652 
653  glCallList (objectList);
654  //! \todo skysphere is a WorldEntity and should be inside of the world-entity-list.
655  skySphere->draw();
656
657  testFont->printText(0, 0, 1, "orxonox_" PACKAGE_VERSION);
658
659}
660
661
662/**
663   \brief function to put your own debug stuff into it. it can display informations about
664   the current class/procedure
665*/
666void World::debug()
667{
668  printf ("World::debug() - starting debug\n");
669  PNode* p1 = NullParent::getInstance ();
670  PNode* p2 = new PNode (new Vector(2, 2, 2), p1);
671  PNode* p3 = new PNode (new Vector(4, 4, 4), p1);
672  PNode* p4 = new PNode (new Vector(6, 6, 6), p2);
673
674  p1->debug ();
675  p2->debug ();
676  p3->debug ();
677  p4->debug ();
678
679  p1->shiftCoor (new Vector(-1, -1, -1));
680
681  printf("World::debug() - shift\n");
682  p1->debug ();
683  p2->debug ();
684  p3->debug ();
685  p4->debug ();
686 
687  p1->update (1);
688
689  printf ("World::debug() - update\n");
690  p1->debug ();
691  p2->debug ();
692  p3->debug ();
693  p4->debug ();
694
695  p2->shiftCoor (new Vector(-1, -1, -1));
696  p1->update (2);
697
698  p1->debug ();
699  p2->debug ();
700  p3->debug ();
701  p4->debug ();
702
703  p2->setAbsCoor (new Vector(1,2,3));
704
705
706 p1->update (2);
707
708  p1->debug ();
709  p2->debug ();
710  p3->debug ();
711  p4->debug ();
712
713  p1->destroy ();
714 
715 
716  /*
717  WorldEntity* entity;
718  printf("counting all entities\n");
719  printf("World::debug() - enumerate()\n");
720  entity = entities->enumerate(); 
721  while( entity != NULL )
722    {
723      if( entity->bDraw ) printf("got an entity\n");
724      entity = entities->nextElement();
725    }
726  */
727}
728
729
730/**
731  \brief main loop of the world: executing all world relevant function
732
733  in this loop we synchronize (if networked), handle input events, give the heart-beat to
734  all other member-entities of the world (tick to player, enemies etc.), checking for
735  collisions drawing everything to the screen.
736*/
737void World::mainLoop()
738{
739  this->lastFrame = SDL_GetTicks ();
740  printf("World::mainLoop() - Entering main loop\n");
741  while( !this->bQuitOrxonox && !this->bQuitCurrentGame) /* \todo implement pause */
742    {
743      // Network
744      this->synchronize ();
745      // Process input
746      this->handleInput ();
747      if( this->bQuitCurrentGame || this->bQuitOrxonox)
748        {
749          printf("World::mainLoop() - leaving loop earlier...\n");
750          break;
751        }
752      // Process time
753      this->timeSlice ();
754      // Process collision
755      this->collide ();
756      // Draw
757      this->display ();
758 
759      for( int i = 0; i < 5000000; i++) {}
760      /* \todo this is to slow down the program for openGl Software emulator computers, reimplement*/
761    }
762  printf("World::mainLoop() - Exiting the main loop\n");
763}
764
765
766/**
767   \brief synchronize local data with remote data
768*/
769void World::synchronize ()
770{
771  // Get remote input
772  // Update synchronizables
773}
774
775
776/**
777   \brief run all input processing
778
779   the command node is the central input event dispatcher. the node uses the even-queue from
780   sdl and has its own event-passing-queue.
781*/
782void World::handleInput ()
783{
784  // localinput
785  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
786  cn->process();
787  // remoteinput
788}
789
790
791/**
792   \brief advance the timeline
793
794   this calculates the time used to process one frame (with all input handling, drawing, etc)
795   the time is mesured in ms and passed to all world-entities and other classes that need
796   a heart-beat.
797*/
798void World::timeSlice ()
799{
800  Uint32 currentFrame = SDL_GetTicks();
801  if(!this->bPause)
802    {
803      Uint32 dt = currentFrame - this->lastFrame;
804     
805      if(dt > 0)
806        {
807          float fps = 1000/dt;
808          printf("fps = %f\n", fps);
809        }
810      else
811        {
812          /* the frame-rate is limited to 100 frames per second, all other things are for
813             nothing.
814          */
815          printf("fps = 1000 - frame rate is adjusted\n");
816          SDL_Delay(10);
817          dt = 10;
818        }
819      //this->timeSlice (dt);
820      printf("testing trackNode: x:%f\n", TrackNode::getInstance()->absCoordinate.x);
821
822      /* function to let all entities tick (iterate through list) */
823      WorldEntity* entity;
824      float seconds = dt / 1000.0;     
825      this->nullParent->update (seconds);
826      entity = entities->enumerate(); 
827      while( entity != NULL) 
828        { 
829          entity->tick (seconds);
830          entity = entities->nextElement();
831        }
832      skySphere->updatePosition(localCamera->absCoordinate);
833     
834      /* update tick the rest */
835      this->localCamera->timeSlice(dt);
836      this->trackManager->tick(dt);
837    }
838  this->lastFrame = currentFrame;
839}
840
841
842/**
843   \brief render the current frame
844   
845   clear all buffers and draw the world
846*/
847void World::display ()
848{
849  // clear buffer
850  glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
851  // set camera
852  this->localCamera->apply ();
853  // draw world
854  this->draw();
855  // draw HUD
856  /* \todo draw HUD */
857  // flip buffers
858  SDL_GL_SwapBuffers();
859  //SDL_Surface* screen = Orxonox::getInstance()->getScreen ();
860  //SDL_Flip (screen);
861}
862
863
864/**
865   \brief add and spawn a new entity to this world
866   \param entity to be added
867*/
868void World::spawn(WorldEntity* entity)
869{
870  if( this->nullParent != NULL && entity->parent == NULL)
871    this->nullParent->addChild (entity);
872
873  this->entities->add (entity);
874
875  entity->postSpawn ();
876}
877
878
879/**
880   \brief add and spawn a new entity to this world
881   \param entity to be added
882   \param absCoor At what coordinates to add this entity.
883   \param absDir In which direction should it look.
884*/
885void World::spawn(WorldEntity* entity, Vector* absCoor, Quaternion* absDir)
886{
887  entity->setAbsCoor (absCoor);
888  entity->setAbsDir (absDir);
889 
890  if( this->nullParent != NULL && entity->parent == NULL)
891    this->nullParent->addChild (entity);
892
893  this->entities->add (entity);
894
895  entity->postSpawn ();
896}
897
898
899
900/**
901  \brief commands that the world must catch
902  \returns false if not used by the world
903*/
904bool World::command(Command* cmd)
905{
906  return false;
907}
908
Note: See TracBrowser for help on using the repository browser.