Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/branches/textEngine: little patch, so now 'space' works too

File size: 21.8 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
354            this->testText = TextEngine::getInstance()->createText("fonts/earth.ttf", 30, TEXT_DYNAMIC, 0, 255, 0);
355            testText->setText("TEXT  rocks");
356            testText->setBindNode(tn);
357
358            break;
359          }
360        case DEBUG_WORLD_1:
361          {
362            lightMan->setPosition(.0, .0, .0);
363            lightMan->setAttenuation(1.0, .01, 0.0);
364            lightMan->setSpecularColor(1,0,0);
365            this->nullParent = NullParent::getInstance ();
366            this->nullParent->setName ("NullParent");
367
368            // create a player
369            WorldEntity* myPlayer = new Player();
370            myPlayer->setName ("player");
371            this->spawn(myPlayer);
372            this->localPlayer = myPlayer;           
373           
374            // bind input
375            Orxonox *orx = Orxonox::getInstance();
376            orx->getLocalInput()->bind (myPlayer);
377           
378            // bind camera
379            this->localCamera = new Camera ();
380            this->localCamera->setName ("camera");
381            this->localCamera->lookAt(LightManager::getInstance()->getLight(0));
382            this->localCamera->setParent(this->localPlayer);
383
384            // Create SkySphere
385            skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
386            this->localPlayer->addChild(this->skySphere);
387
388            Vector* es = new Vector (20, 0, 0);
389            Quaternion* qs = new Quaternion ();
390
391            lightMan->getLight(0)->setParent(trackManager->getTrackNode());
392            break;
393          }
394        default:
395          printf("World::load() - no world with ID %i found", this->debugWorldNr );
396        }
397    }
398  else if(this->worldName != NULL)
399    {
400
401    }
402
403  // initialize debug coord system
404  objectList = glGenLists(1);
405  glNewList (objectList, GL_COMPILE);
406 
407  //  trackManager->drawGraph(.01);
408  trackManager->debug(2);
409  glEndList();
410
411  terrain = new Terrain("../data/worlds/newGround.obj");
412  terrain->setRelCoor(new Vector(0,-10,0));
413  this->spawn(terrain);
414
415}
416
417
418/**
419   \brief initializes a new World shortly before start
420
421   this is the function, that will be loaded shortly before the world is
422   started
423*/
424ErrorMessage World::init()
425{
426  this->bPause = false;
427  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
428  cn->addToWorld(this);
429  cn->enable(true);
430}
431
432
433/**
434   \brief starts the World
435*/
436ErrorMessage World::start()
437{
438  PRINTF(3)("World::start() - starting current World: nr %i\n", this->debugWorldNr);
439  this->bQuitOrxonox = false;
440  this->bQuitCurrentGame = false;
441  this->mainLoop();
442}
443
444/**
445   \brief stops the world.
446
447   This happens, when the player decides to end the Level.
448*/
449ErrorMessage World::stop()
450{
451  PRINTF(3)("World::stop() - got stop signal\n");
452  this->bQuitCurrentGame = true;
453}
454
455/**
456   \brief pauses the Game
457*/
458ErrorMessage World::pause()
459{
460  this->isPaused = true;
461}
462
463/**
464   \brief ends the pause Phase
465*/
466ErrorMessage World::resume()
467{
468  this->isPaused = false;
469}
470
471/**
472   \brief destroys the World
473*/
474ErrorMessage World::destroy()
475{
476
477}
478
479/**
480   \brief shows the loading screen
481*/
482void World::displayLoadScreen ()
483{
484  PRINTF(3)("World::displayLoadScreen - start\n"); 
485 
486  //GLMenuImageScreen*
487  this->glmis = GLMenuImageScreen::getInstance();
488  this->glmis->init();
489  this->glmis->setMaximum(8);
490  this->glmis->draw();
491 
492  PRINTF(3)("World::displayLoadScreen - end\n"); 
493}
494
495/**
496   \brief removes the loadscreen, and changes over to the game
497
498   \todo take out the delay
499*/
500void World::releaseLoadScreen ()
501{
502  PRINTF(3)("World::releaseLoadScreen - start\n"); 
503  this->glmis->setValue(this->glmis->getMaximum());
504  //SDL_Delay(500);
505  PRINTF(3)("World::releaseLoadScreen - end\n"); 
506}
507
508
509/**
510   \brief gets the list of entities from the world
511   \returns entity list
512*/
513tList<WorldEntity>* World::getEntities()
514{
515  return this->entities;
516}
517
518
519/**
520   \brief this returns the current game time
521   \returns elapsed game time
522*/
523double World::getGameTime()
524{
525  return this->gameTime;
526}
527
528
529/**
530    \brief checks for collisions
531   
532    This method runs through all WorldEntities known to the world and checks for collisions
533    between them. In case of collisions the collide() method of the corresponding entities
534    is called.
535*/
536void World::collide ()
537{
538  /*
539  List *a, *b;
540  WorldEntity *aobj, *bobj;
541   
542  a = entities;
543 
544  while( a != NULL)
545    {
546      aobj = a->nextElement();
547      if( aobj->bCollide && aobj->collisioncluster != NULL)
548        {
549          b = a->nextElement();
550          while( b != NULL )
551            {
552              bobj = b->nextElement();
553              if( bobj->bCollide && bobj->collisioncluster != NULL )
554                {
555                  unsigned long ahitflg, bhitflg;
556                  if( check_collision ( &aobj->place, aobj->collisioncluster,
557                                        &ahitflg, &bobj->place, bobj->collisioncluster,
558                                        &bhitflg) );
559                  {
560                    aobj->collide (bobj, ahitflg, bhitflg);
561                    bobj->collide (aobj, bhitflg, ahitflg);
562                  }
563                }
564              b = b->nextElement();
565            }
566        }
567      a = a->enumerate();
568    }
569  */
570}
571
572/**
573    \brief runs through all entities calling their draw() methods
574*/
575void World::draw ()
576{
577  /* draw entities */
578  WorldEntity* entity;
579  glLoadIdentity();
580
581  //entity = this->entities->enumerate();
582  tIterator<WorldEntity>* iterator = this->entities->getIterator();
583  entity = iterator->nextElement();
584  while( entity != NULL ) 
585    { 
586      if( entity->bDraw ) entity->draw();
587      //entity = this->entities->nextElement();
588      entity = iterator->nextElement();
589    }
590  delete iterator;
591 
592  glCallList (objectList);
593  //! \todo skysphere is a WorldEntity and should be inside of the world-entity-list.
594  skySphere->draw();
595
596  TextEngine::getInstance()->draw();
597  lightMan->draw(); // must be at the end of the drawing procedure, otherwise Light cannot be handled as PNodes //
598}
599
600
601/**
602   \brief function to put your own debug stuff into it. it can display informations about
603   the current class/procedure
604*/
605void World::debug()
606{
607  PRINTF(2)("debug() - starting debug\n");
608  PNode* p1 = NullParent::getInstance ();
609  PNode* p2 = new PNode (new Vector(2, 2, 2), p1);
610  PNode* p3 = new PNode (new Vector(4, 4, 4), p1);
611  PNode* p4 = new PNode (new Vector(6, 6, 6), p2);
612
613  p1->debug ();
614  p2->debug ();
615  p3->debug ();
616  p4->debug ();
617
618  p1->shiftCoor (new Vector(-1, -1, -1));
619
620  printf("World::debug() - shift\n");
621  p1->debug ();
622  p2->debug ();
623  p3->debug ();
624  p4->debug ();
625 
626  p1->update (0);
627
628  printf ("World::debug() - update\n");
629  p1->debug ();
630  p2->debug ();
631  p3->debug ();
632  p4->debug ();
633
634  p2->shiftCoor (new Vector(-1, -1, -1));
635  p1->update (0);
636
637  p1->debug ();
638  p2->debug ();
639  p3->debug ();
640  p4->debug ();
641
642  p2->setAbsCoor (new Vector(1,2,3));
643
644
645 p1->update (0);
646
647  p1->debug ();
648  p2->debug ();
649  p3->debug ();
650  p4->debug ();
651
652  delete p1;
653 
654 
655  /*
656  WorldEntity* entity;
657  printf("counting all entities\n");
658  printf("World::debug() - enumerate()\n");
659  entity = entities->enumerate(); 
660  while( entity != NULL )
661    {
662      if( entity->bDraw ) printf("got an entity\n");
663      entity = entities->nextElement();
664    }
665  */
666}
667
668
669/**
670  \brief main loop of the world: executing all world relevant function
671
672  in this loop we synchronize (if networked), handle input events, give the heart-beat to
673  all other member-entities of the world (tick to player, enemies etc.), checking for
674  collisions drawing everything to the screen.
675*/
676void World::mainLoop()
677{
678  this->lastFrame = SDL_GetTicks ();
679  PRINTF(3)("World::mainLoop() - Entering main loop\n");
680  while( !this->bQuitOrxonox && !this->bQuitCurrentGame) /* \todo implement pause */
681    {
682      PRINTF(3)("World::mainloop() - number of entities: %i\n", this->entities->getSize());
683      // Network
684      this->synchronize ();
685      // Process input
686      this->handleInput ();
687      if( this->bQuitCurrentGame || this->bQuitOrxonox)
688          break;
689      // Process time
690      this->tick ();
691      // Update the state
692      this->update ();     
693      // Process collision
694      this->collide ();
695      // Draw
696      this->display ();
697
698      //      for( int i = 0; i < 5000000; i++) {}
699      /* \todo this is to slow down the program for openGl Software emulator computers, reimplement*/
700    }
701  PRINTF(3)("World::mainLoop() - Exiting the main loop\n");
702}
703
704
705/**
706   \brief synchronize local data with remote data
707*/
708void World::synchronize ()
709{
710  // Get remote input
711  // Update synchronizables
712}
713
714
715/**
716   \brief run all input processing
717
718   the command node is the central input event dispatcher. the node uses the even-queue from
719   sdl and has its own event-passing-queue.
720*/
721void World::handleInput ()
722{
723  // localinput
724  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
725  cn->process();
726  // remoteinput
727}
728
729
730/**
731   \brief advance the timeline
732
733   this calculates the time used to process one frame (with all input handling, drawing, etc)
734   the time is mesured in ms and passed to all world-entities and other classes that need
735   a heart-beat.
736*/
737void World::tick ()
738{
739  Uint32 currentFrame = SDL_GetTicks();
740  if(!this->bPause)
741    {
742      this->dt = currentFrame - this->lastFrame;
743     
744      if( this->dt > 0)
745        {
746          float fps = 1000/dt;
747
748          // temporary, only for showing how fast the text-engine is
749          char tmpChar[20];
750          sprintf(tmpChar, "fps: %4.0f", fps);
751        }
752      else
753        {
754          /* the frame-rate is limited to 100 frames per second, all other things are for
755             nothing.
756          */
757          PRINTF(2)("fps = 1000 - frame rate is adjusted\n");
758          SDL_Delay(10);
759          this->dt = 10;
760        }
761      //this->timeSlice (dt);
762     
763      /* function to let all entities tick (iterate through list) */
764      float seconds = this->dt / 1000.0;     
765      this->gameTime += seconds;
766      //entity = entities->enumerate();
767      tIterator<WorldEntity>* iterator = this->entities->getIterator();
768      WorldEntity* entity = iterator->nextElement();
769      while( entity != NULL) 
770        { 
771          entity->tick (seconds);
772          entity = iterator->nextElement();
773        }
774      delete iterator;
775      //skySphere->updatePosition(localCamera->absCoordinate);
776     
777      /* update tick the rest */
778      this->trackManager->tick(this->dt);
779      this->localCamera->tick(this->dt);
780      this->garbageCollector->tick(seconds);
781    }
782  this->lastFrame = currentFrame;
783}
784
785
786/**
787   \brief this function gives the world a consistant state
788
789   after ticking (updating the world state) this will give a constistant
790   state to the whole system.
791*/
792void World::update()
793{
794  this->garbageCollector->update();
795  this->nullParent->update (dt);
796}
797
798
799/**
800   \brief render the current frame
801   
802   clear all buffers and draw the world
803*/
804void World::display ()
805{
806  // clear buffer
807  glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
808  // set camera
809  this->localCamera->apply ();
810  // draw world
811  this->draw();
812  // draw HUD
813  /* \todo draw HUD */
814  // flip buffers
815  SDL_GL_SwapBuffers();
816  //SDL_Surface* screen = Orxonox::getInstance()->getScreen ();
817  //SDL_Flip (screen);
818}
819
820
821/**
822   \brief add and spawn a new entity to this world
823   \param entity to be added
824*/
825void World::spawn(WorldEntity* entity)
826{
827  this->entities->add (entity);
828  entity->postSpawn ();
829}
830
831
832/**
833   \brief add and spawn a new entity to this world
834   \param entity to be added
835   \param absCoor At what coordinates to add this entity.
836   \param absDir In which direction should it look.
837*/
838void World::spawn(WorldEntity* entity, Vector* absCoor, Quaternion* absDir)
839{
840  this->entities->add (entity);
841
842  entity->setAbsCoor (absCoor);
843  entity->setAbsDir (absDir);
844
845  entity->postSpawn ();
846}
847
848
849/**
850   \brief add and spawn a new entity to this world
851   \param entity to be added
852   \param entity to be added to (PNode)
853   \param At what relative  coordinates to add this entity.
854   \param In which relative direction should it look.
855*/
856void World::spawn(WorldEntity* entity, PNode* parentNode, 
857                  Vector* relCoor, Quaternion* relDir, 
858                  int parentingMode)
859{
860  this->nullParent = NullParent::getInstance();
861  if( parentNode != NULL)
862    {
863      parentNode->addChild (entity);
864     
865      entity->setRelCoor (relCoor);
866      entity->setRelDir (relDir);
867      entity->setMode(parentingMode);
868     
869      this->entities->add (entity);
870     
871      entity->postSpawn ();
872    }
873}
874
875
876
877/**
878  \brief commands that the world must catch
879  \returns false if not used by the world
880*/
881bool World::command(Command* cmd)
882{
883  if( !strcmp( cmd->cmd, "view0")) this->localCamera->setViewMode(VIEW_NORMAL);
884  else if( !strcmp( cmd->cmd, "view1")) this->localCamera->setViewMode(VIEW_BEHIND);
885  else if( !strcmp( cmd->cmd, "view2")) this->localCamera->setViewMode(VIEW_FRONT);
886  else if( !strcmp( cmd->cmd, "view3")) this->localCamera->setViewMode(VIEW_LEFT);
887  else if( !strcmp( cmd->cmd, "view4")) this->localCamera->setViewMode(VIEW_RIGHT);
888  else if( !strcmp( cmd->cmd, "view5")) this->localCamera->setViewMode(VIEW_TOP);
889 
890  return false;
891}
892
Note: See TracBrowser for help on using the repository browser.