Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/branches/textEngine/src/story_entities/world.cc @ 3774

Last change on this file since 3774 was 3774, checked in by bensch, 19 years ago

orxonox/branches/textEngine: debug() implemented

File size: 21.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#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD
18
19#include "world.h"
20
21#include "orxonox.h"
22
23#include "p_node.h"
24#include "null_parent.h"
25#include "helper_parent.h"
26#include "track_node.h"
27#include "world_entity.h"
28#include "player.h"
29#include "camera.h"
30#include "environment.h"
31#include "skysphere.h"
32#include "terrain.h"
33#include "light.h"
34#include "text_engine.h"
35
36#include "track_manager.h"
37#include "garbage_collector.h"
38
39#include "command_node.h"
40#include "glmenu_imagescreen.h"
41#include "list.h"
42
43using namespace std;
44
45
46WorldInterface* WorldInterface::singletonRef = 0;
47
48
49/**
50   \brief private constructor because of singleton
51*/
52WorldInterface::WorldInterface()
53{
54  this->worldIsInitialized = false;
55  this->worldReference = NULL;
56}
57
58/**
59   \brief public deconstructor
60*/
61WorldInterface::~WorldInterface()
62{
63  this->singletonRef = NULL;
64  this->worldIsInitialized = false;
65  this->worldReference = NULL;
66}
67
68/**
69   \brief gets the singleton instance
70   \returns singleton instance
71*/
72WorldInterface* WorldInterface::getInstance()
73{
74  if( singletonRef == NULL)
75    singletonRef = new WorldInterface();
76  return singletonRef;
77}
78
79
80/**
81   \brief initializes the interface
82   \param reference to the world
83
84   if the worldinterface is not initilizes, there wont be any
85   useable interface
86*/
87void WorldInterface::init(World* world)
88{
89  this->worldReference = world;
90  if( world != NULL)
91    {
92      this->worldIsInitialized = true;
93      PRINTF(3)("WorldInterface up and running\n");
94    }
95}
96
97
98/**
99   \brief gets the entity list from the world
100   \return entity list
101*/
102tList<WorldEntity>* WorldInterface::getEntityList()
103{
104  if( this->worldIsInitialized)
105    return this->worldReference->getEntities();
106  PRINT(1)("Someone tried to use the WorldInterface before it has been initizlized! this can result in SEGFAULTs!\n");
107  return NULL;
108}
109
110
111
112/**
113    \brief create a new World
114   
115    This creates a new empty world!
116*/
117World::World (char* name)
118{
119  this->init(name, -1);
120  //NullParent* np = NullParent::getInstance();
121}
122
123/**
124   \brief creates a new World...
125   \param worldID with this ID
126*/
127World::World (int worldID)
128{
129  this->init(NULL, worldID);
130}
131
132/**
133    \brief remove the World from memory
134   
135    delete everything explicitly, that isn't contained in the parenting tree!
136    things contained in the tree are deleted automaticaly
137*/
138World::~World ()
139{
140  PRINTF(3)("World::~World() - deleting current world\n");
141  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
142  cn->unbind(this->localPlayer);
143  cn->reset();
144
145  ResourceManager::getInstance()->debug();
146  ResourceManager::getInstance()->unloadAllByPriority(RP_LEVEL);
147  ResourceManager::getInstance()->debug();
148
149  delete WorldInterface::getInstance();
150
151  delete this->nullParent;
152  delete this->entities;
153  delete this->lightMan;
154  delete this->trackManager;
155
156  TextEngine::getInstance()->flush();
157}
158
159/**
160   \brief initializes the world.
161
162   set all stuff here that is world generic and does not use to much memory
163   because the real init() function StoryEntity::init() will be called
164   shortly before start of the game. 
165   since all worlds are initiated/referenced before they will be started.
166   NO LEVEL LOADING HERE - NEVER!
167*/
168void World::init(char* name, int worldID)
169{
170  this->setClassName ("World");
171
172  this->worldName = name;
173  this->debugWorldNr = worldID;
174  this->entities = new tList<WorldEntity>();
175}
176
177
178/**
179   \brief this is executed before load
180
181   since the load function sometimes needs data, that has been init before
182   the load and after the proceeding storyentity has finished
183*/
184ErrorMessage World::preLoad()
185{
186  /* init the world interface */
187  WorldInterface* wi = WorldInterface::getInstance();
188  wi->init(this);
189  this->garbageCollector = GarbageCollector::getInstance();
190}
191
192
193/**
194   \brief loads the World by initializing all resources, and set their default values.
195*/
196ErrorMessage World::load()
197{
198  //  BezierCurve* tmpCurve = new BezierCurve();
199  if(this->debugWorldNr != -1)
200    {
201      // initializing Font
202      this->glmis->step();
203      // initializing the TrackManager
204      trackManager = TrackManager::getInstance();
205      trackManager->addPoint(Vector(0,0,0));
206      trackManager->addPoint(Vector(100, -40, 5));
207      trackManager->addPoint(Vector(200,-40,-8));
208      trackManager->addPoint(Vector(250, -35, -2));
209      trackManager->addPoint(Vector(320,-33,-.55));
210      trackManager->setDuration(3);
211      trackManager->setSavePoint();
212      trackManager->addPoint(Vector(410, 0, 0));
213      trackManager->addPoint(Vector(510, 20, -10));
214      trackManager->addPoint(Vector(550, 20, -10));
215      trackManager->addPoint(Vector(570, 20, -10));
216      trackManager->setDuration(5);
217     
218      int fork11, fork12;
219      trackManager->fork(2, &fork11, &fork12);
220      trackManager->workOn(fork11);
221      trackManager->addPoint(Vector(640, 25, -30));
222      trackManager->addPoint(Vector(700, 40, -120));
223      trackManager->addPoint(Vector(800, 50, -150));
224      trackManager->addPoint(Vector(900, 60, -100));
225      trackManager->addPoint(Vector(900, 60, -70));
226      trackManager->addPoint(Vector(990, 65, -15));
227      trackManager->addPoint(Vector(1050, 65, -10));
228      trackManager->addPoint(Vector(1100, 65, -20));
229      trackManager->setDuration(10);
230
231      trackManager->workOn(fork12);
232      trackManager->addPoint(Vector(640, 25, 20));
233      trackManager->addPoint(Vector(670, 50, 120));
234      trackManager->addPoint(Vector(700, 70, 80));
235      trackManager->addPoint(Vector(800, 70, 65));
236      trackManager->addPoint(Vector(850, 65, 65));
237      trackManager->addPoint(Vector(920, 35, 40));
238      trackManager->addPoint(Vector(945, 40, 40));
239      trackManager->addPoint(Vector(970, 24, 40));
240      trackManager->addPoint(Vector(1000, 40, -7));
241      trackManager->setDuration(10);
242     
243
244      trackManager->join(2, fork11, fork12);
245
246      trackManager->workOn(5);
247      trackManager->addPoint(Vector(1200, 60, -50));
248      trackManager->addPoint(Vector(1300, 50, -50));
249      trackManager->addPoint(Vector(1400, 40, -50));
250      trackManager->addPoint(Vector(1500, 40, -60));
251      trackManager->addPoint(Vector(1600, 35, -55));
252      trackManager->addPoint(Vector(1700, 45, -40));
253      trackManager->addPoint(Vector(1750, 60, -40));
254      trackManager->addPoint(Vector(1770, 80, -40));
255      trackManager->addPoint(Vector(1800, 100, -40));
256      trackManager->setDuration(10);
257
258      trackManager->finalize();
259
260     
261      /*monitor progress*/
262      this->glmis->step();
263
264      // LIGHT initialisation
265      lightMan = LightManager::getInstance();
266      lightMan->setAmbientColor(.1,.1,.1);
267      lightMan->addLight();
268      //      lightMan->setAttenuation(1.0, .01, 0.0);
269      //      lightMan->setDiffuseColor(1,1,1);
270      //  lightMan->addLight(1);
271      //  lightMan->setPosition(20, 10, -20);
272      //  lightMan->setDiffuseColor(0,0,0);
273      lightMan->debug();
274
275      switch(this->debugWorldNr)
276        {
277          /*
278            this loads the hard-coded debug world. this only for simplicity and will be
279            removed by a reald world-loader, which interprets a world-file.
280            if you want to add an own debug world, just add a case DEBUG_WORLD_[nr] and
281            make whatever you want...
282           */
283        case DEBUG_WORLD_0:
284          {
285            lightMan->setPosition(-5.0, 10.0, -40.0);
286            this->nullParent = NullParent::getInstance ();
287            this->nullParent->setName ("NullParent");
288
289            // !\todo old track-system has to be removed
290
291            //create helper for player
292            //HelperParent* hp = new HelperParent ();
293            /* the player has to be added to this helper */
294
295            // create a player
296            this->localPlayer = new Player ();
297            this->localPlayer->setName ("player");
298            this->spawn (this->localPlayer);
299            /*monitor progress*/
300            //this->glmis->step();
301            this->glmis->step();
302
303            // bind input
304            Orxonox *orx = Orxonox::getInstance ();
305            orx->getLocalInput()->bind (this->localPlayer);
306           
307            // bind camera
308            this->localCamera = new Camera();
309            this->localCamera->setName ("camera");
310            this->localCamera->lookAt(this->localPlayer);
311            this->localCamera->setParent(this->localPlayer);
312           
313            /*monitor progress*/
314            this->glmis->step();
315
316            // Create SkySphere
317            this->skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
318            this->skySphere->setName("SkySphere");
319            this->localCamera->addChild(this->skySphere);
320            this->skySphere->setMode(PNODE_MOVEMENT);
321
322            /*monitor progress*/
323            this->glmis->step();
324
325           
326            WorldEntity* env = new Environment();
327            env->setName ("env");
328            this->spawn(env);
329
330           
331            /*
332            Vector* es = new Vector (10, 5, 0);
333            Quaternion* qs = new Quaternion ();
334            WorldEntity* pr = new Primitive(P_CYLINDER);
335            pr->setName("primitive");
336            this->spawn(pr, this->localPlayer, es, qs, PNODE_MOVEMENT);
337            */
338
339            /*monitor progress*/
340            this->glmis->step();
341
342            //      trackManager->setBindSlave(env);
343            PNode* tn = trackManager->getTrackNode();
344            tn->addChild(this->localPlayer);
345
346            //localCamera->setParent(TrackNode::getInstance());
347            tn->addChild(this->localCamera);
348            //      localCamera->lookAt(tn);
349            this->localPlayer->setMode(PNODE_ALL);
350            //Vector* cameraOffset = new Vector (0, 5, -10);
351            trackManager->condition(2, LEFTRIGHT, this->localPlayer);
352            this->glmis->step();
353            this->testText = TextEngine::getInstance()->createText("fonts/earth.ttf");
354            testText->setText("test");
355            testText->setBindNode(tn);
356
357            break;
358          }
359        case DEBUG_WORLD_1:
360          {
361            lightMan->setPosition(.0, .0, .0);
362            lightMan->setAttenuation(1.0, .01, 0.0);
363            lightMan->setSpecularColor(1,0,0);
364            this->nullParent = NullParent::getInstance ();
365            this->nullParent->setName ("NullParent");
366
367            // create a player
368            WorldEntity* myPlayer = new Player();
369            myPlayer->setName ("player");
370            this->spawn(myPlayer);
371            this->localPlayer = myPlayer;           
372           
373            // bind input
374            Orxonox *orx = Orxonox::getInstance();
375            orx->getLocalInput()->bind (myPlayer);
376           
377            // bind camera
378            this->localCamera = new Camera ();
379            this->localCamera->setName ("camera");
380            this->localCamera->lookAt(LightManager::getInstance()->getLight(0));
381            this->localCamera->setParent(this->localPlayer);
382
383            // Create SkySphere
384            skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
385            this->localPlayer->addChild(this->skySphere);
386
387            Vector* es = new Vector (20, 0, 0);
388            Quaternion* qs = new Quaternion ();
389
390            lightMan->getLight(0)->setParent(trackManager->getTrackNode());
391            break;
392          }
393        default:
394          printf("World::load() - no world with ID %i found", this->debugWorldNr );
395        }
396    }
397  else if(this->worldName != NULL)
398    {
399
400    }
401
402  // initialize debug coord system
403  objectList = glGenLists(1);
404  glNewList (objectList, GL_COMPILE);
405 
406  //  trackManager->drawGraph(.01);
407  trackManager->debug(2);
408  glEndList();
409
410  terrain = new Terrain("../data/worlds/newGround.obj");
411  terrain->setRelCoor(new Vector(0,-10,0));
412  this->spawn(terrain);
413
414}
415
416
417/**
418   \brief initializes a new World shortly before start
419
420   this is the function, that will be loaded shortly before the world is
421   started
422*/
423ErrorMessage World::init()
424{
425  this->bPause = false;
426  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
427  cn->addToWorld(this);
428  cn->enable(true);
429}
430
431
432/**
433   \brief starts the World
434*/
435ErrorMessage World::start()
436{
437  PRINTF(3)("World::start() - starting current World: nr %i\n", this->debugWorldNr);
438  this->bQuitOrxonox = false;
439  this->bQuitCurrentGame = false;
440  this->mainLoop();
441}
442
443/**
444   \brief stops the world.
445
446   This happens, when the player decides to end the Level.
447*/
448ErrorMessage World::stop()
449{
450  PRINTF(3)("World::stop() - got stop signal\n");
451  this->bQuitCurrentGame = true;
452}
453
454/**
455   \brief pauses the Game
456*/
457ErrorMessage World::pause()
458{
459  this->isPaused = true;
460}
461
462/**
463   \brief ends the pause Phase
464*/
465ErrorMessage World::resume()
466{
467  this->isPaused = false;
468}
469
470/**
471   \brief destroys the World
472*/
473ErrorMessage World::destroy()
474{
475
476}
477
478/**
479   \brief shows the loading screen
480*/
481void World::displayLoadScreen ()
482{
483  PRINTF(3)("World::displayLoadScreen - start\n"); 
484 
485  //GLMenuImageScreen*
486  this->glmis = GLMenuImageScreen::getInstance();
487  this->glmis->init();
488  this->glmis->setMaximum(8);
489  this->glmis->draw();
490 
491  PRINTF(3)("World::displayLoadScreen - end\n"); 
492}
493
494/**
495   \brief removes the loadscreen, and changes over to the game
496
497   \todo take out the delay
498*/
499void World::releaseLoadScreen ()
500{
501  PRINTF(3)("World::releaseLoadScreen - start\n"); 
502  this->glmis->setValue(this->glmis->getMaximum());
503  //SDL_Delay(500);
504  PRINTF(3)("World::releaseLoadScreen - end\n"); 
505}
506
507
508/**
509   \brief gets the list of entities from the world
510   \returns entity list
511*/
512tList<WorldEntity>* World::getEntities()
513{
514  return this->entities;
515}
516
517
518/**
519   \brief this returns the current game time
520   \returns elapsed game time
521*/
522double World::getGameTime()
523{
524  return this->gameTime;
525}
526
527
528/**
529    \brief checks for collisions
530   
531    This method runs through all WorldEntities known to the world and checks for collisions
532    between them. In case of collisions the collide() method of the corresponding entities
533    is called.
534*/
535void World::collide ()
536{
537  /*
538  List *a, *b;
539  WorldEntity *aobj, *bobj;
540   
541  a = entities;
542 
543  while( a != NULL)
544    {
545      aobj = a->nextElement();
546      if( aobj->bCollide && aobj->collisioncluster != NULL)
547        {
548          b = a->nextElement();
549          while( b != NULL )
550            {
551              bobj = b->nextElement();
552              if( bobj->bCollide && bobj->collisioncluster != NULL )
553                {
554                  unsigned long ahitflg, bhitflg;
555                  if( check_collision ( &aobj->place, aobj->collisioncluster,
556                                        &ahitflg, &bobj->place, bobj->collisioncluster,
557                                        &bhitflg) );
558                  {
559                    aobj->collide (bobj, ahitflg, bhitflg);
560                    bobj->collide (aobj, bhitflg, ahitflg);
561                  }
562                }
563              b = b->nextElement();
564            }
565        }
566      a = a->enumerate();
567    }
568  */
569}
570
571/**
572    \brief runs through all entities calling their draw() methods
573*/
574void World::draw ()
575{
576  /* draw entities */
577  WorldEntity* entity;
578  glLoadIdentity();
579
580  //entity = this->entities->enumerate();
581  tIterator<WorldEntity>* iterator = this->entities->getIterator();
582  entity = iterator->nextElement();
583  while( entity != NULL ) 
584    { 
585      if( entity->bDraw ) entity->draw();
586      //entity = this->entities->nextElement();
587      entity = iterator->nextElement();
588    }
589  delete iterator;
590 
591  glCallList (objectList);
592  //! \todo skysphere is a WorldEntity and should be inside of the world-entity-list.
593  skySphere->draw();
594
595  TextEngine::getInstance()->draw();
596  lightMan->draw(); // must be at the end of the drawing procedure, otherwise Light cannot be handled as PNodes //
597}
598
599
600/**
601   \brief function to put your own debug stuff into it. it can display informations about
602   the current class/procedure
603*/
604void World::debug()
605{
606  PRINTF(2)("debug() - starting debug\n");
607  PNode* p1 = NullParent::getInstance ();
608  PNode* p2 = new PNode (new Vector(2, 2, 2), p1);
609  PNode* p3 = new PNode (new Vector(4, 4, 4), p1);
610  PNode* p4 = new PNode (new Vector(6, 6, 6), p2);
611
612  p1->debug ();
613  p2->debug ();
614  p3->debug ();
615  p4->debug ();
616
617  p1->shiftCoor (new Vector(-1, -1, -1));
618
619  printf("World::debug() - shift\n");
620  p1->debug ();
621  p2->debug ();
622  p3->debug ();
623  p4->debug ();
624 
625  p1->update (0);
626
627  printf ("World::debug() - update\n");
628  p1->debug ();
629  p2->debug ();
630  p3->debug ();
631  p4->debug ();
632
633  p2->shiftCoor (new Vector(-1, -1, -1));
634  p1->update (0);
635
636  p1->debug ();
637  p2->debug ();
638  p3->debug ();
639  p4->debug ();
640
641  p2->setAbsCoor (new Vector(1,2,3));
642
643
644 p1->update (0);
645
646  p1->debug ();
647  p2->debug ();
648  p3->debug ();
649  p4->debug ();
650
651  delete p1;
652 
653 
654  /*
655  WorldEntity* entity;
656  printf("counting all entities\n");
657  printf("World::debug() - enumerate()\n");
658  entity = entities->enumerate(); 
659  while( entity != NULL )
660    {
661      if( entity->bDraw ) printf("got an entity\n");
662      entity = entities->nextElement();
663    }
664  */
665}
666
667
668/**
669  \brief main loop of the world: executing all world relevant function
670
671  in this loop we synchronize (if networked), handle input events, give the heart-beat to
672  all other member-entities of the world (tick to player, enemies etc.), checking for
673  collisions drawing everything to the screen.
674*/
675void World::mainLoop()
676{
677  this->lastFrame = SDL_GetTicks ();
678  PRINTF(3)("World::mainLoop() - Entering main loop\n");
679  while( !this->bQuitOrxonox && !this->bQuitCurrentGame) /* \todo implement pause */
680    {
681      PRINTF(3)("World::mainloop() - number of entities: %i\n", this->entities->getSize());
682      // Network
683      this->synchronize ();
684      // Process input
685      this->handleInput ();
686      if( this->bQuitCurrentGame || this->bQuitOrxonox)
687          break;
688      // Process time
689      this->tick ();
690      // Update the state
691      this->update ();     
692      // Process collision
693      this->collide ();
694      // Draw
695      this->display ();
696
697      //      for( int i = 0; i < 5000000; i++) {}
698      /* \todo this is to slow down the program for openGl Software emulator computers, reimplement*/
699    }
700  PRINTF(3)("World::mainLoop() - Exiting the main loop\n");
701}
702
703
704/**
705   \brief synchronize local data with remote data
706*/
707void World::synchronize ()
708{
709  // Get remote input
710  // Update synchronizables
711}
712
713
714/**
715   \brief run all input processing
716
717   the command node is the central input event dispatcher. the node uses the even-queue from
718   sdl and has its own event-passing-queue.
719*/
720void World::handleInput ()
721{
722  // localinput
723  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
724  cn->process();
725  // remoteinput
726}
727
728
729/**
730   \brief advance the timeline
731
732   this calculates the time used to process one frame (with all input handling, drawing, etc)
733   the time is mesured in ms and passed to all world-entities and other classes that need
734   a heart-beat.
735*/
736void World::tick ()
737{
738  Uint32 currentFrame = SDL_GetTicks();
739  if(!this->bPause)
740    {
741      this->dt = currentFrame - this->lastFrame;
742     
743      if( this->dt > 0)
744        {
745          float fps = 1000/dt;
746
747          // temporary, only for showing how fast the text-engine is
748          char tmpChar[20];
749          sprintf(tmpChar, "fps: %4.0f", fps);
750        }
751      else
752        {
753          /* the frame-rate is limited to 100 frames per second, all other things are for
754             nothing.
755          */
756          PRINTF(2)("fps = 1000 - frame rate is adjusted\n");
757          SDL_Delay(10);
758          this->dt = 10;
759        }
760      //this->timeSlice (dt);
761     
762      /* function to let all entities tick (iterate through list) */
763      float seconds = this->dt / 1000.0;     
764      this->gameTime += seconds;
765      //entity = entities->enumerate();
766      tIterator<WorldEntity>* iterator = this->entities->getIterator();
767      WorldEntity* entity = iterator->nextElement();
768      while( entity != NULL) 
769        { 
770          entity->tick (seconds);
771          entity = iterator->nextElement();
772        }
773      delete iterator;
774      //skySphere->updatePosition(localCamera->absCoordinate);
775     
776      /* update tick the rest */
777      this->trackManager->tick(this->dt);
778      this->localCamera->tick(this->dt);
779      this->garbageCollector->tick(seconds);
780    }
781  this->lastFrame = currentFrame;
782}
783
784
785/**
786   \brief this function gives the world a consistant state
787
788   after ticking (updating the world state) this will give a constistant
789   state to the whole system.
790*/
791void World::update()
792{
793  this->garbageCollector->update();
794  this->nullParent->update (dt);
795}
796
797
798/**
799   \brief render the current frame
800   
801   clear all buffers and draw the world
802*/
803void World::display ()
804{
805  // clear buffer
806  glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
807  // set camera
808  this->localCamera->apply ();
809  // draw world
810  this->draw();
811  // draw HUD
812  /* \todo draw HUD */
813  // flip buffers
814  SDL_GL_SwapBuffers();
815  //SDL_Surface* screen = Orxonox::getInstance()->getScreen ();
816  //SDL_Flip (screen);
817}
818
819
820/**
821   \brief add and spawn a new entity to this world
822   \param entity to be added
823*/
824void World::spawn(WorldEntity* entity)
825{
826  this->entities->add (entity);
827  entity->postSpawn ();
828}
829
830
831/**
832   \brief add and spawn a new entity to this world
833   \param entity to be added
834   \param absCoor At what coordinates to add this entity.
835   \param absDir In which direction should it look.
836*/
837void World::spawn(WorldEntity* entity, Vector* absCoor, Quaternion* absDir)
838{
839  this->entities->add (entity);
840
841  entity->setAbsCoor (absCoor);
842  entity->setAbsDir (absDir);
843
844  entity->postSpawn ();
845}
846
847
848/**
849   \brief add and spawn a new entity to this world
850   \param entity to be added
851   \param entity to be added to (PNode)
852   \param At what relative  coordinates to add this entity.
853   \param In which relative direction should it look.
854*/
855void World::spawn(WorldEntity* entity, PNode* parentNode, 
856                  Vector* relCoor, Quaternion* relDir, 
857                  int parentingMode)
858{
859  this->nullParent = NullParent::getInstance();
860  if( parentNode != NULL)
861    {
862      parentNode->addChild (entity);
863     
864      entity->setRelCoor (relCoor);
865      entity->setRelDir (relDir);
866      entity->setMode(parentingMode);
867     
868      this->entities->add (entity);
869     
870      entity->postSpawn ();
871    }
872}
873
874
875
876/**
877  \brief commands that the world must catch
878  \returns false if not used by the world
879*/
880bool World::command(Command* cmd)
881{
882  if( !strcmp( cmd->cmd, "view0")) this->localCamera->setViewMode(VIEW_NORMAL);
883  else if( !strcmp( cmd->cmd, "view1")) this->localCamera->setViewMode(VIEW_BEHIND);
884  else if( !strcmp( cmd->cmd, "view2")) this->localCamera->setViewMode(VIEW_FRONT);
885  else if( !strcmp( cmd->cmd, "view3")) this->localCamera->setViewMode(VIEW_LEFT);
886  else if( !strcmp( cmd->cmd, "view4")) this->localCamera->setViewMode(VIEW_RIGHT);
887  else if( !strcmp( cmd->cmd, "view5")) this->localCamera->setViewMode(VIEW_TOP);
888 
889  return false;
890}
891
Note: See TracBrowser for help on using the repository browser.