Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

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

File size: 23.7 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->getCamera()->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->getCamera()->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    \brief updates Placements and notifies entities when they left the
664    world
665   
666    This runs trough all WorldEntities and maps Locations to Placements
667    if they are bound, checks whether they left the level boundaries
668    and calls appropriate functions.
669*/
670void World::update ()
671{
672  /*
673  //List<WorldEntity> *l;
674  WorldEntity* entity;
675  Location* loc;
676  Placement* plc;
677  Uint32 t;
678 
679  //  l = entities->enumerate();
680  entity = this->entities->enumerate();
681  while( entity != NULL )
682    {
683
684     
685      if( !entity->isFree() )
686        {
687          loc = entity->getLocation();
688          plc = entity->getPlacement();
689          t = loc->part;
690         
691          if( t >= traclen )
692            {
693              printf("An entity is out of the game area\n");
694              entity->leftWorld ();
695            }
696          else
697            {
698              while( track[t].mapCoords( loc, plc) )
699                {
700                  track[t].postLeave (entity);
701                  if( loc->part >= tracklen )
702                    {
703                      printf("An entity has left the game area\n");
704                      entity->leftWorld ();
705                      break;
706                    }
707                  track[loc->part].postEnter (entity);
708                }
709            }
710        }
711      else
712        {
713        }
714     
715      entity = entities->nextElement();
716    }
717  */ 
718}
719
720
721/**
722   \brief function to put your own debug stuff into it. it can display informations about
723   the current class/procedure
724*/
725void World::debug()
726{
727  printf ("World::debug() - starting debug\n");
728  PNode* p1 = NullParent::getInstance ();
729  PNode* p2 = new PNode (new Vector(2, 2, 2), p1);
730  PNode* p3 = new PNode (new Vector(4, 4, 4), p1);
731  PNode* p4 = new PNode (new Vector(6, 6, 6), p2);
732
733  p1->debug ();
734  p2->debug ();
735  p3->debug ();
736  p4->debug ();
737
738  p1->shiftCoor (new Vector(-1, -1, -1));
739
740  printf("World::debug() - shift\n");
741  p1->debug ();
742  p2->debug ();
743  p3->debug ();
744  p4->debug ();
745 
746  p1->update (1);
747
748  printf ("World::debug() - update\n");
749  p1->debug ();
750  p2->debug ();
751  p3->debug ();
752  p4->debug ();
753
754  p2->shiftCoor (new Vector(-1, -1, -1));
755  p1->update (2);
756
757  p1->debug ();
758  p2->debug ();
759  p3->debug ();
760  p4->debug ();
761
762  p2->setAbsCoor (new Vector(1,2,3));
763
764
765 p1->update (2);
766
767  p1->debug ();
768  p2->debug ();
769  p3->debug ();
770  p4->debug ();
771
772  p1->destroy ();
773 
774 
775  /*
776  WorldEntity* entity;
777  printf("counting all entities\n");
778  printf("World::debug() - enumerate()\n");
779  entity = entities->enumerate(); 
780  while( entity != NULL )
781    {
782      if( entity->bDraw ) printf("got an entity\n");
783      entity = entities->nextElement();
784    }
785  */
786}
787
788
789/**
790  \brief main loop of the world: executing all world relevant function
791
792  in this loop we synchronize (if networked), handle input events, give the heart-beat to
793  all other member-entities of the world (tick to player, enemies etc.), checking for
794  collisions drawing everything to the screen.
795*/
796void World::mainLoop()
797{
798  this->lastFrame = SDL_GetTicks ();
799  printf("World::mainLoop() - Entering main loop\n");
800  while( !this->bQuitOrxonox && !this->bQuitCurrentGame) /* \todo implement pause */
801    {
802      // Network
803      this->synchronize ();
804      // Process input
805      this->handleInput ();
806      if( this->bQuitCurrentGame || this->bQuitOrxonox)
807        {
808          printf("World::mainLoop() - leaving loop earlier...\n");
809          break;
810        }
811      // Process time
812      this->timeSlice ();
813      // Process collision
814      this->collide ();
815      // Draw
816      this->display ();
817 
818      for( int i = 0; i < 5000000; i++) {}
819      /* \todo this is to slow down the program for openGl Software emulator computers, reimplement*/
820    }
821  printf("World::mainLoop() - Exiting the main loop\n");
822}
823
824
825/**
826   \brief synchronize local data with remote data
827*/
828void World::synchronize ()
829{
830  // Get remote input
831  // Update synchronizables
832}
833
834
835/**
836   \brief run all input processing
837
838   the command node is the central input event dispatcher. the node uses the even-queue from
839   sdl and has its own event-passing-queue.
840*/
841void World::handleInput ()
842{
843  // localinput
844  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
845  cn->process();
846  // remoteinput
847}
848
849
850/**
851   \brief advance the timeline
852
853   this calculates the time used to process one frame (with all input handling, drawing, etc)
854   the time is mesured in ms and passed to all world-entities and other classes that need
855   a heart-beat.
856*/
857void World::timeSlice ()
858{
859  Uint32 currentFrame = SDL_GetTicks();
860  if(!this->bPause)
861    {
862      Uint32 dt = currentFrame - this->lastFrame;
863     
864      if(dt > 0)
865        {
866          float fps = 1000/dt;
867          printf("fps = %f\n", fps);
868        }
869      else
870        {
871          /* the frame-rate is limited to 100 frames per second, all other things are for
872             nothing.
873          */
874          printf("fps = 1000 - frame rate is adjusted\n");
875          SDL_Delay(10);
876          dt = 10;
877        }
878      //this->timeSlice (dt);
879     
880      /* function to let all entities tick (iterate through list) */
881      WorldEntity* entity;
882      float seconds = dt / 1000.0;     
883      this->nullParent->update (seconds);
884      entity = entities->enumerate(); 
885      while( entity != NULL) 
886        { 
887          entity->tick (seconds);
888          entity = entities->nextElement();
889        }
890      skySphere->updatePosition(localCamera->absCoordinate);
891     
892      /* update tick the rest */
893      this->update ();
894      this->localCamera->timeSlice(dt);
895      this->trackManager->tick(dt);
896    }
897  this->lastFrame = currentFrame;
898}
899
900
901/**
902   \brief render the current frame
903   
904   clear all buffers and draw the world
905*/
906void World::display ()
907{
908  // clear buffer
909  glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
910  // set camera
911  this->localCamera->apply ();
912  // draw world
913  this->draw();
914  // draw HUD
915  /* \todo draw HUD */
916  // flip buffers
917  SDL_GL_SwapBuffers();
918  //SDL_Surface* screen = Orxonox::getInstance()->getScreen ();
919  //SDL_Flip (screen);
920}
921
922/**
923   \brief give back active camera
924   
925   this passes back the actualy active camera
926   \todo ability to define more than one camera or camera-places
927*/
928Camera* World::getCamera()
929{
930  return this->localCamera;
931}
932
933
934/**
935   \brief add and spawn a new entity to this world
936   \param entity to be added
937*/
938void World::spawn(WorldEntity* entity)
939{
940  if( this->nullParent != NULL && entity->parent == NULL)
941    this->nullParent->addChild (entity);
942
943  this->entities->add (entity);
944
945  entity->postSpawn ();
946}
947
948
949/**
950   \brief add and spawn a new entity to this world
951   \param entity to be added
952   \param absCoor At what coordinates to add this entity.
953   \param absDir In which direction should it look.
954*/
955void World::spawn(WorldEntity* entity, Vector* absCoor, Quaternion* absDir)
956{
957  entity->setAbsCoor (absCoor);
958  entity->setAbsDir (absDir);
959 
960  if( this->nullParent != NULL && entity->parent == NULL)
961    this->nullParent->addChild (entity);
962
963  this->entities->add (entity);
964
965  entity->postSpawn ();
966}
967
968
969
970/**
971  \brief commands that the world must catch
972  \returns false if not used by the world
973*/
974bool World::command(Command* cmd)
975{
976  return false;
977}
978
979
980
981/**
982   \brief swaps two values
983   \todo make this a global function, and take it out of world
984*/
985void World::swap (unsigned char &a, unsigned char &b)
986{
987  unsigned char temp;
988  temp = a;
989  a    = b;
990  b    = temp;
991}
Note: See TracBrowser for help on using the repository browser.