Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/branches/shadows/src/world.cc @ 3767

Last change on this file since 3767 was 3760, checked in by dave, 20 years ago

branches/shadows: chaos, aber kommt der loesung naeher

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