Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 4556 was 4170, checked in by dave, 20 years ago

branches/shadow/src:der Boden hat nicht mehr so komische Farben

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