Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 3508 was 3507, checked in by patrick, 20 years ago

orxonox/trunk: finished work on porting Skysphere to WorldEntity

File size: 22.2 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
32using namespace std;
33
34
35/**
36    \brief create a new World
37   
38    This creates a new empty world!
39*/
40World::World (char* name)
41{
42  this->setClassName ("World");
43  this->worldName = name;
44  this->debugWorldNr = -1;
45  this->entities = new tList<WorldEntity>();
46}
47
48/**
49   \brief creates a new World...
50   \param worldID with this ID
51*/
52World::World (int worldID)
53{
54  this->debugWorldNr = worldID;
55  this->worldName = NULL;
56  this->entities = new tList<WorldEntity>();
57}
58
59/**
60    \brief remove the World from memory
61   
62    delete everything explicitly, that isn't contained in the parenting tree!
63    things contained in the tree are deleted automaticaly
64*/
65World::~World ()
66{
67  printf("World::~World() - deleting current world\n");
68  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
69  cn->unbind(this->localPlayer);
70  cn->reset();
71
72  this->localCamera->destroy();
73  this->nullParent->destroy(); 
74  //delete this->skySphere;
75
76  //delete this->trackManager;
77
78  /*
79  WorldEntity* entity = entities->enumerate(); 
80  while( entity != NULL )
81    {
82      entity->destroy();
83      entity = entities->nextElement();
84    }
85  this->entities->destroy();
86  */
87
88  /* FIX the parent list has to be cleared - not possible if we got the old list also*/
89
90
91  //delete this->entities;
92  //delete this->localCamera;
93  /* this->localPlayer hasn't to be deleted explicitly, it is
94     contained in entities*/
95}
96
97
98/**
99   \brief loads the World by initializing all resources, and set their default values.
100*/
101ErrorMessage World::load()
102{
103  //  BezierCurve* tmpCurve = new BezierCurve();
104  if(this->debugWorldNr != -1)
105    {
106      // initializing Font
107      testFont = new FontSet();
108      testFont->buildFont("../data/pictures/font.tga");
109
110      // initializing the TrackManager
111      trackManager = TrackManager::getInstance();
112      trackManager->addPoint(Vector(0,-5,0));
113      trackManager->addPoint(Vector(10,0,5));
114      trackManager->addPoint(Vector(20,0,-5));
115      trackManager->addPoint(Vector(30,0,5));
116      trackManager->addPoint(Vector(40,0,5));
117      trackManager->setDuration(2);
118      trackManager->setSavePoint();
119      trackManager->addPoint(Vector(50,10,10));
120      trackManager->addPoint(Vector(60,0, 10));
121      trackManager->addPoint(Vector(70,0, 10));
122      trackManager->addPoint(Vector(80,0,-10));
123      trackManager->addPoint(Vector(90,0,-10));
124      trackManager->setDuration(5);
125      trackManager->setSavePoint();
126      trackManager->addPoint(Vector(110,0,5));
127      trackManager->addPoint(Vector(120,0, 10));
128      trackManager->addPoint(Vector(130,0, 10));
129      trackManager->addPoint(Vector(140,0,-10));
130      trackManager->addPoint(Vector(150,0,-10));
131      trackManager->setDuration(3);
132      int fork11, fork12, fork13, fork14;
133      trackManager->fork(4, &fork11, &fork12, &fork13, &fork14);
134      trackManager->workOn(fork11);
135      trackManager->addPoint(Vector(170, 0, -15));
136      trackManager->addPoint(Vector(180, 0, -15));
137      trackManager->setDuration(3);
138      trackManager->workOn(fork12);
139      trackManager->addPoint(Vector(170, 0, 10));
140      trackManager->addPoint(Vector(180, 0, 10));
141      trackManager->addPoint(Vector(190,2,5));
142      trackManager->addPoint(Vector(200,2,5));
143      trackManager->setDuration(7);
144      int fork21, fork22;
145      trackManager->fork(2, &fork21, &fork22);
146      trackManager->workOn(fork21);
147      trackManager->addPoint(Vector(220, 10,-10));
148      trackManager->addPoint(Vector(230, 0,-10));
149      trackManager->addPoint(Vector(240, 0, 2));
150      trackManager->addPoint(Vector(250, 0, 0));
151      trackManager->addPoint(Vector(260, 0, 5));
152      trackManager->setDuration(3);
153      trackManager->join(2, fork12, fork11);
154      trackManager->workOn(fork22);
155      trackManager->addPoint(Vector(220, -10,10));
156      trackManager->addPoint(Vector(230, 0, 10));
157      trackManager->addPoint(Vector(240, 0, 10));
158      trackManager->addPoint(Vector(250, 0, 5));
159      trackManager->setDuration(6);
160      trackManager->workOn(fork13);
161      trackManager->addPoint(Vector(200,-10,5));
162      trackManager->addPoint(Vector(250,-10,5));
163      trackManager->setDuration(3);
164      trackManager->workOn(fork14);
165      trackManager->addPoint(Vector(200,15,0));
166      trackManager->addPoint(Vector(210,0,10));
167      trackManager->setDuration(1);
168      trackManager->join(4, fork21, fork22, fork13, fork14);
169      trackManager->workOn(10);
170      trackManager->addPoint(Vector(250,-10,5));
171      trackManager->addPoint(Vector(260,-10,5));
172      trackManager->finalize();
173     
174      /*monitor progress*/
175      this->glmis->step();
176
177      /*
178        tmpCurve->addNode(Vector(10,  -1,  -1));
179        tmpCurve->addNode(Vector(10,  -2,   2));
180        tmpCurve->addNode(Vector(10,   3,   3));
181        tmpCurve->addNode(Vector(10,   4,  -4), 0);
182        tmpCurve->addNode(Vector(10,  -1,  -1));
183        tmpCurve->addNode(Vector(10,  -2,   2));
184        tmpCurve->addNode(Vector(10,   3,   3));
185        tmpCurve->addNode(Vector(10,   4,  -4), 0);
186        tmpCurve->debug();
187      */
188      switch(this->debugWorldNr)
189        {
190          /*
191            this loads the hard-coded debug world. this only for simplicity and will be
192            removed by a reald world-loader, which interprets a world-file.
193            if you want to add an own debug world, just add a case DEBUG_WORLD_[nr] and
194            make whatever you want...
195           */
196        case DEBUG_WORLD_0:
197          {
198            this->nullParent = NullParent::getInstance ();
199            this->nullParent->setName ("NullParent");
200
201            // !\todo old track-system has to be removed
202
203            //create helper for player
204            HelperParent* hp = new HelperParent ();
205            /* the player has to be added to this helper */
206
207            // create a player
208            WorldEntity* myPlayer = new Player ();
209            myPlayer->setName ("player");
210            this->spawn (myPlayer);
211            this->localPlayer = myPlayer;
212            /*monitor progress*/
213            this->glmis->step();           
214
215            // bind input
216            Orxonox *orx = Orxonox::getInstance ();
217            orx->getLocalInput()->bind (myPlayer);
218           
219            // bind camera
220            this->localCamera = new Camera(this);
221            this->localCamera->setName ("camera");
222            this->localCamera->bind (myPlayer);
223            this->localPlayer->addChild (this->localCamera);
224            /*monitor progress*/
225            this->glmis->step();           
226
227            // Create SkySphere
228            skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
229            this->localPlayer->addChild(this->skySphere);
230
231            /*monitor progress*/
232            this->glmis->step();
233
234            Vector* es = new Vector (50, 2, 0);
235            Quaternion* qs = new Quaternion ();
236            WorldEntity* env = new Environment();
237            env->setName ("env");
238            this->spawn(env, es, qs);
239           
240            /*monitor progress*/
241            this->glmis->step();
242
243            trackManager->setBindSlave(env);
244
245            break;
246          }
247        case DEBUG_WORLD_1:
248          {
249            /*
250            this->testCurve = new UPointCurve();
251            this->testCurve->addNode(Vector( 0, 0, 0));
252            this->testCurve->addNode(Vector(10, 0, 5));
253            this->testCurve->addNode(Vector(20, -5,-5));
254            this->testCurve->addNode(Vector(30, 5, 10));
255            this->testCurve->addNode(Vector(40, 0,-10));
256            this->testCurve->addNode(Vector(50, 0,-10));
257            */
258
259            this->nullParent = NullParent::getInstance ();
260            this->nullParent->setName ("NullParent");
261
262
263
264            // create a player
265            WorldEntity* myPlayer = new Player();
266            myPlayer->setName ("player");
267            this->spawn(myPlayer);
268            this->localPlayer = myPlayer;           
269           
270            // bind input
271            Orxonox *orx = Orxonox::getInstance();
272            orx->getLocalInput()->bind (myPlayer);
273           
274            // bind camera
275            this->localCamera = new Camera (this);
276            this->localCamera->setName ("camera");
277            this->localCamera->bind (myPlayer); 
278            this->localPlayer->addChild (this->localCamera);
279
280            // Create SkySphere
281            skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
282            this->localPlayer->addChild(this->skySphere);
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     
821      /* function to let all entities tick (iterate through list) */
822      WorldEntity* entity;
823      float seconds = dt / 1000.0;     
824      this->nullParent->update (seconds);
825      entity = entities->enumerate(); 
826      while( entity != NULL) 
827        { 
828          entity->tick (seconds);
829          entity = entities->nextElement();
830        }
831      //skySphere->updatePosition(localCamera->absCoordinate);
832     
833      /* update tick the rest */
834      this->localCamera->timeSlice(dt);
835      this->trackManager->tick(dt);
836    }
837  this->lastFrame = currentFrame;
838}
839
840
841/**
842   \brief render the current frame
843   
844   clear all buffers and draw the world
845*/
846void World::display ()
847{
848  // clear buffer
849  glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
850  // set camera
851  this->localCamera->apply ();
852  // draw world
853  this->draw();
854  // draw HUD
855  /* \todo draw HUD */
856  // flip buffers
857  SDL_GL_SwapBuffers();
858  //SDL_Surface* screen = Orxonox::getInstance()->getScreen ();
859  //SDL_Flip (screen);
860}
861
862
863/**
864   \brief add and spawn a new entity to this world
865   \param entity to be added
866*/
867void World::spawn(WorldEntity* entity)
868{
869  if( this->nullParent != NULL && entity->parent == NULL)
870    this->nullParent->addChild (entity);
871
872  this->entities->add (entity);
873
874  entity->postSpawn ();
875}
876
877
878/**
879   \brief add and spawn a new entity to this world
880   \param entity to be added
881   \param absCoor At what coordinates to add this entity.
882   \param absDir In which direction should it look.
883*/
884void World::spawn(WorldEntity* entity, Vector* absCoor, Quaternion* absDir)
885{
886  entity->setAbsCoor (absCoor);
887  entity->setAbsDir (absDir);
888 
889  if( this->nullParent != NULL && entity->parent == NULL)
890    this->nullParent->addChild (entity);
891
892  this->entities->add (entity);
893
894  entity->postSpawn ();
895}
896
897
898
899/**
900  \brief commands that the world must catch
901  \returns false if not used by the world
902*/
903bool World::command(Command* cmd)
904{
905  return false;
906}
907
Note: See TracBrowser for help on using the repository browser.