Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/world.cc @ 3461

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

orxonox/trunk: cleaning up old stuff in world.cc and its relatives. second step…

File size: 22.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#include "world.h"
18#include "world_entity.h"
19#include "collision.h"
20#include "track_manager.h"
21#include "player.h"
22#include "command_node.h"
23#include "camera.h"
24#include "environment.h"
25#include "p_node.h"
26#include "null_parent.h"
27#include "helper_parent.h"
28#include "glmenu_imagescreen.h"
29#include "skysphere.h"
30#include "light.h"
31#include "sfont/fontset.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(env);
242
243            break;
244          }
245        case DEBUG_WORLD_1:
246          {
247            /*
248            this->testCurve = new UPointCurve();
249            this->testCurve->addNode(Vector( 0, 0, 0));
250            this->testCurve->addNode(Vector(10, 0, 5));
251            this->testCurve->addNode(Vector(20, -5,-5));
252            this->testCurve->addNode(Vector(30, 5, 10));
253            this->testCurve->addNode(Vector(40, 0,-10));
254            this->testCurve->addNode(Vector(50, 0,-10));
255            */
256
257            this->nullParent = NullParent::getInstance ();
258            this->nullParent->setName ("NullParent");
259
260
261
262            // create a player
263            WorldEntity* myPlayer = new Player();
264            myPlayer->setName ("player");
265            this->spawn(myPlayer);
266            this->localPlayer = myPlayer;           
267           
268            // bind input
269            Orxonox *orx = Orxonox::getInstance();
270            orx->getLocalInput()->bind (myPlayer);
271           
272            // bind camera
273            this->localCamera = new Camera (this);
274            this->localCamera->setName ("camera");
275            this->localCamera->bind (myPlayer); 
276            this->localPlayer->addChild (this->localCamera);
277
278            // Create SkySphere
279            skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
280
281            break;
282
283
284          }
285        default:
286          printf("World::load() - no world with ID %i found", this->debugWorldNr );
287        }
288    }
289  else if(this->worldName != NULL)
290    {
291
292    }
293
294  // initialize debug coord system
295  objectList = glGenLists(1);
296  glNewList (objectList, GL_COMPILE);
297  glLoadIdentity();
298  glColor3f(1.0,0,0);
299  glBegin(GL_QUADS);
300
301  int sizeX = 100;
302  int sizeZ = 80;
303  float length = 1000;
304  float width = 200;
305  float widthX = float (length /sizeX);
306  float widthZ = float (width /sizeZ);
307 
308  float height [sizeX][sizeZ];
309  Vector normal_vectors[sizeX][sizeZ];
310 
311 
312  for ( int i = 0; i<sizeX-1; i+=1)
313    for (int j = 0; j<sizeZ-1;j+=1)
314      //height[i][j] = rand()/20046 + (j-25)*(j-25)/30;
315#ifdef __WIN32__
316      height[i][j]=(sin((float)j/3)*rand()*i/182400)*.5;
317#else
318      height[i][j]=(sin((float)j/3)*rand()*(long)i/6282450500.0)*.5;
319#endif
320
321  //Die Huegel ein wenig glaetten
322  for (int h=1; h<2;h++)
323    for (int i=1;i<sizeX-2 ;i+=1 )
324      for(int j=1;j<sizeZ-2;j+=1)
325        height[i][j]=(height[i+1][j]+height[i][j+1]+height[i-1][j]+height[i][j-1])/4;
326 
327  //Berechnung von normalen Vektoren
328  for(int i=1;i<sizeX-2;i+=1)
329    for(int j=1;j<sizeZ-2 ;j+=1)
330      {
331        Vector v1 = Vector (widthX*(1),      height[i][j],      widthZ*(j) );
332        Vector v2 = Vector (widthX*(i-1),    height[i-1][j],    widthZ*(j));
333        Vector v3 = Vector (widthX*(i),      height[i][j+1],    widthZ*(j+1));
334        Vector v4 = Vector (widthX*(i+1),    height[i+1][j],    widthZ*(j));
335        Vector v5 = Vector (widthX*(i),      height[i][j-1],    widthZ*(j-1));
336       
337        Vector c1 = v2 - v1;
338        Vector c2 = v3 - v1;
339        Vector c3=  v4 - v1;
340        Vector c4 = v5 - v1;
341        Vector zero = Vector (0,0,0);
342        normal_vectors[i][j]=c1.cross(v3-v5)+c2.cross(v4-v2)+c3.cross(v5-v3)+c4.cross(v2-v4);
343        normal_vectors[i][j].normalize();
344      }
345
346  int snowheight=3;
347  for ( int i = 0; i<sizeX; i+=1)
348    for (int j = 0; j<sizeZ;j+=1)
349      {   
350        Vector v1 = Vector (widthX*(i),      height[i][j]-20,       widthZ*(j)  -width/2);
351        Vector v2 = Vector (widthX*(i+1),    height[i+1][j]-20,     widthZ*(j)  -width/2);
352        Vector v3 = Vector (widthX*(i+1),    height[i+1][j+1]-20,   widthZ*(j+1)-width/2);
353        Vector v4 = Vector (widthX*(i),      height[i][j+1]-20,     widthZ*(j+1)-width/2);
354        float a[3];
355        if(height[i][j]<snowheight){
356          a[0]=0;
357          a[1]=1.0-height[i][j]/10-.3;
358          a[2]=0;
359          glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
360        }
361        else{
362            a[0]=1.0;
363            a[1]=1.0;
364            a[2]=1.0;
365            glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
366           
367        }
368        glNormal3f(normal_vectors[i][j].x, normal_vectors[i][j].y, normal_vectors[i][j].z);
369        glVertex3f(v1.x, v1.y, v1.z);
370        if(height[i+1][j]<snowheight){
371          a[0]=0;
372          a[1] =1.0-height[i+1][j]/10-.3;
373          a[2]=0;
374          glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
375        }
376        else{
377          a[0]=1.0;
378          a[1]=1.0;
379          a[2]=1.0;
380          glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
381         
382        }
383        glNormal3f(normal_vectors[i+1][j].x, normal_vectors[i+1][j].y, normal_vectors[i+1][j].z);
384        glVertex3f(v2.x, v2.y, v2.z);
385        if(height[i+1][j+1]<snowheight){
386          a[0]=0;
387          a[1] =1.0-height[i+1][j+1]/10-.3;
388          a[2]=0;
389          glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
390        }
391        else{
392          a[0]=1.0;
393          a[1]=1.0;
394          a[2]=1.0;
395          glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
396         
397         
398        }
399        glNormal3f(normal_vectors[i+1][j+1].x, normal_vectors[i+1][j+1].y, normal_vectors[i+1][j+1].z);
400        glVertex3f(v3.x, v3.y, v3.z);
401        if(height[i][j+1]<snowheight){
402          a[0]=0;
403          a[1] =1.0-height[i+1][j+1]/10-.3;
404          a[2]=0;
405          glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
406        }
407        else{
408          a[0]=1.0;
409          a[1]=1.0;
410          a[2]=1.0;
411          glMaterialfv(GL_FRONT,GL_DIFFUSE,a);
412        }
413        glNormal3f(normal_vectors[i][j+1].x, normal_vectors[i][j+1].y, normal_vectors[i][j+1].z);
414        glVertex3f(v4.x, v4.y, v4.z);
415       
416      }
417  glEnd();
418  /* 
419  glBegin(GL_LINES);
420  for( float x = -128.0; x < 128.0; x += 25.0)
421    {
422      for( float y = -128.0; y < 128.0; y += 25.0)
423        {
424          glColor3f(1,0,0);
425          glVertex3f(x,y,-128.0);
426          glVertex3f(x,y,0.0);
427          glColor3f(0.5,0,0);
428          glVertex3f(x,y,0.0);
429          glVertex3f(x,y,128.0);
430        }
431    }
432  for( float y = -128.0; y < 128.0; y += 25.0)
433    {
434      for( float z = -128.0; z < 128.0; z += 25.0)
435        {
436          glColor3f(0,1,0);
437          glVertex3f(-128.0,y,z);
438          glVertex3f(0.0,y,z);
439          glColor3f(0,0.5,0);
440          glVertex3f(0.0,y,z);
441          glVertex3f(128.0,y,z);
442        }
443    }
444  for( float x = -128.0; x < 128.0; x += 25.0)
445    {
446      for( float z = -128.0; z < 128.0; z += 25.0)
447        {
448          glColor3f(0,0,1);
449          glVertex3f(x,-128.0,z);
450          glVertex3f(x,0.0,z);
451          glColor3f(0,0,0.5);
452          glVertex3f(x,0.0,z);
453          glVertex3f(x,128.0,z);
454        }
455     
456    }
457  */ 
458  /*
459  glBegin(GL_LINE_STRIP);
460  glColor3f(1.0, 5.0, 1.0);
461  for( int i = 0; i <= 30; i++)
462    {
463      glEvalCoord1f ((GLfloat) i/30.0);
464    }
465  glEnd();
466  */
467
468  trackManager->drawGraph(.01);
469  trackManager->debug(2);
470  /* 
471  glBegin(GL_LINES);
472  float i;
473  for(i = 0.0; i<1; i+=.01)
474    {
475      printf("%f, %f, %f\n",tmpCurve->calcPos(i).x, tmpCurve->calcPos(i).y, tmpCurve->calcPos(i).z);
476      glVertex3f(tmpCurve->calcPos(i).x, tmpCurve->calcPos(i).y, tmpCurve->calcPos(i).z);
477    }
478  glEnd();
479  */
480  glEndList();
481  // LIGHT initialisation
482  light = Light::getInstance();
483  light->addLight(0);
484  light->setAttenuation(QUADRATIC, 1.0);
485  light->setAttenuation(CONSTANT, 2.0);
486  light->setAttenuation(QUADRATIC, 1.0);
487  light->setPosition(10.0, 10.0, 50.0);
488  light->setDiffuseColor(1,1,1);
489  //  light->addLight(1);
490  //  light->setPosition(20, 10, -20);
491  //  light->setDiffuseColor(0,0,0);
492  light->debug();
493
494
495}
496
497/**
498   \brief initializes a new World
499*/
500ErrorMessage World::init()
501{
502  this->bPause = false;
503  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
504  cn->addToWorld(this);
505  cn->enable(true);
506
507  //glMap1f (GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);
508  //glEnable (GL_MAP1_VERTEX_3);
509 
510  //theNurb = gluNewNurbsRenderer ();
511  //gluNurbsProperty (theNurb, GLU_NURBS_MODE, GLU_NURBS_TESSELLATOR);
512  //gluNurbsProperty (theNurb, GLU_NURBS_VERTEX, vertexCallback );
513
514}
515
516
517/**
518   \brief starts the World
519*/
520ErrorMessage World::start()
521{
522  printf("World::start() - starting current World: nr %i\n", this->debugWorldNr);
523  this->bQuitOrxonox = false;
524  this->bQuitCurrentGame = false;
525  this->mainLoop();
526}
527
528/**
529   \brief stops the world.
530
531   This happens, when the player decides to end the Level.
532*/
533ErrorMessage World::stop()
534{
535  printf("World::stop() - got stop signal\n");
536  this->bQuitCurrentGame = true;
537}
538
539/**
540   \brief pauses the Game
541*/
542ErrorMessage World::pause()
543{
544  this->isPaused = true;
545}
546
547/**
548   \brief ends the pause Phase
549*/
550ErrorMessage World::resume()
551{
552  this->isPaused = false;
553}
554
555/**
556   \brief destroys the World
557*/
558ErrorMessage World::destroy()
559{
560  delete trackManager;
561}
562
563/**
564   \brief shows the loading screen
565*/
566void World::displayLoadScreen ()
567{
568  printf ("World::displayLoadScreen - start\n"); 
569 
570  //GLMenuImageScreen*
571  this->glmis = GLMenuImageScreen::getInstance();
572  this->glmis->init();
573  this->glmis->setMaximum(10);
574  this->glmis->draw();
575 
576  printf ("World::displayLoadScreen - end\n"); 
577}
578
579/**
580   \brief removes the loadscreen, and changes over to the game
581
582   \todo take out the delay
583*/
584void World::releaseLoadScreen ()
585{
586  printf ("World::releaseLoadScreen - start\n"); 
587  this->glmis->setValue(this->glmis->getMaximum());
588  SDL_Delay(500);
589  printf ("World::releaseLoadScreen - end\n"); 
590}
591
592
593/**
594    \brief checks for collisions
595   
596    This method runs through all WorldEntities known to the world and checks for collisions
597    between them. In case of collisions the collide() method of the corresponding entities
598    is called.
599*/
600void World::collide ()
601{
602  /*
603  List *a, *b;
604  WorldEntity *aobj, *bobj;
605   
606  a = entities;
607 
608  while( a != NULL)
609    {
610      aobj = a->nextElement();
611      if( aobj->bCollide && aobj->collisioncluster != NULL)
612        {
613          b = a->nextElement();
614          while( b != NULL )
615            {
616              bobj = b->nextElement();
617              if( bobj->bCollide && bobj->collisioncluster != NULL )
618                {
619                  unsigned long ahitflg, bhitflg;
620                  if( check_collision ( &aobj->place, aobj->collisioncluster,
621                                        &ahitflg, &bobj->place, bobj->collisioncluster,
622                                        &bhitflg) );
623                  {
624                    aobj->collide (bobj, ahitflg, bhitflg);
625                    bobj->collide (aobj, bhitflg, ahitflg);
626                  }
627                }
628              b = b->nextElement();
629            }
630        }
631      a = a->enumerate();
632    }
633  */
634}
635
636/**
637    \brief runs through all entities calling their draw() methods
638*/
639void World::draw ()
640{
641  // draw entities
642  WorldEntity* entity;
643  entity = this->entities->enumerate();
644  while( entity != NULL ) 
645    { 
646      if( entity->bDraw ) entity->draw();
647      entity = this->entities->nextElement();
648    } 
649 
650  //glmis = new GLMenuImageScreen();
651  ///glmis->init();
652
653  // draw debug coord system
654  glCallList (objectList);
655  //! \todo skysphere is a WorldEntity and should be inside of the world-entity-list.
656  skySphere->draw();
657
658  testFont->printText(0, 0, 1, "orxonox_" PACKAGE_VERSION);
659
660}
661
662
663/**
664   \brief function to put your own debug stuff into it. it can display informations about
665   the current class/procedure
666*/
667void World::debug()
668{
669  printf ("World::debug() - starting debug\n");
670  PNode* p1 = NullParent::getInstance ();
671  PNode* p2 = new PNode (new Vector(2, 2, 2), p1);
672  PNode* p3 = new PNode (new Vector(4, 4, 4), p1);
673  PNode* p4 = new PNode (new Vector(6, 6, 6), p2);
674
675  p1->debug ();
676  p2->debug ();
677  p3->debug ();
678  p4->debug ();
679
680  p1->shiftCoor (new Vector(-1, -1, -1));
681
682  printf("World::debug() - shift\n");
683  p1->debug ();
684  p2->debug ();
685  p3->debug ();
686  p4->debug ();
687 
688  p1->update (1);
689
690  printf ("World::debug() - update\n");
691  p1->debug ();
692  p2->debug ();
693  p3->debug ();
694  p4->debug ();
695
696  p2->shiftCoor (new Vector(-1, -1, -1));
697  p1->update (2);
698
699  p1->debug ();
700  p2->debug ();
701  p3->debug ();
702  p4->debug ();
703
704  p2->setAbsCoor (new Vector(1,2,3));
705
706
707 p1->update (2);
708
709  p1->debug ();
710  p2->debug ();
711  p3->debug ();
712  p4->debug ();
713
714  p1->destroy ();
715 
716 
717  /*
718  WorldEntity* entity;
719  printf("counting all entities\n");
720  printf("World::debug() - enumerate()\n");
721  entity = entities->enumerate(); 
722  while( entity != NULL )
723    {
724      if( entity->bDraw ) printf("got an entity\n");
725      entity = entities->nextElement();
726    }
727  */
728}
729
730
731/**
732  \brief main loop of the world: executing all world relevant function
733
734  in this loop we synchronize (if networked), handle input events, give the heart-beat to
735  all other member-entities of the world (tick to player, enemies etc.), checking for
736  collisions drawing everything to the screen.
737*/
738void World::mainLoop()
739{
740  this->lastFrame = SDL_GetTicks ();
741  printf("World::mainLoop() - Entering main loop\n");
742  while( !this->bQuitOrxonox && !this->bQuitCurrentGame) /* \todo implement pause */
743    {
744      // Network
745      this->synchronize ();
746      // Process input
747      this->handleInput ();
748      if( this->bQuitCurrentGame || this->bQuitOrxonox)
749        {
750          printf("World::mainLoop() - leaving loop earlier...\n");
751          break;
752        }
753      // Process time
754      this->timeSlice ();
755      // Process collision
756      this->collide ();
757      // Draw
758      this->display ();
759 
760      for( int i = 0; i < 5000000; i++) {}
761      /* \todo this is to slow down the program for openGl Software emulator computers, reimplement*/
762    }
763  printf("World::mainLoop() - Exiting the main loop\n");
764}
765
766
767/**
768   \brief synchronize local data with remote data
769*/
770void World::synchronize ()
771{
772  // Get remote input
773  // Update synchronizables
774}
775
776
777/**
778   \brief run all input processing
779
780   the command node is the central input event dispatcher. the node uses the even-queue from
781   sdl and has its own event-passing-queue.
782*/
783void World::handleInput ()
784{
785  // localinput
786  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
787  cn->process();
788  // remoteinput
789}
790
791
792/**
793   \brief advance the timeline
794
795   this calculates the time used to process one frame (with all input handling, drawing, etc)
796   the time is mesured in ms and passed to all world-entities and other classes that need
797   a heart-beat.
798*/
799void World::timeSlice ()
800{
801  Uint32 currentFrame = SDL_GetTicks();
802  if(!this->bPause)
803    {
804      Uint32 dt = currentFrame - this->lastFrame;
805     
806      if(dt > 0)
807        {
808          float fps = 1000/dt;
809          printf("fps = %f\n", fps);
810        }
811      else
812        {
813          /* the frame-rate is limited to 100 frames per second, all other things are for
814             nothing.
815          */
816          printf("fps = 1000 - frame rate is adjusted\n");
817          SDL_Delay(10);
818          dt = 10;
819        }
820      //this->timeSlice (dt);
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
909
910
911/**
912   \brief swaps two values
913   \todo make this a global function, and take it out of world
914*/
915void World::swap (unsigned char &a, unsigned char &b)
916{
917  unsigned char temp;
918  temp = a;
919  a    = b;
920  b    = temp;
921}
Note: See TracBrowser for help on using the repository browser.