Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/branches/textEngine: now the Font is dynamical. See the fps :)

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
35#include "track_manager.h"
36#include "garbage_collector.h"
37
38#include "command_node.h"
39#include "glmenu_imagescreen.h"
40#include "fontset.h"
41#include "glfont.h"
42#include "list.h"
43
44
45
46using namespace std;
47
48
49WorldInterface* WorldInterface::singletonRef = 0;
50
51
52/**
53   \brief private constructor because of singleton
54*/
55WorldInterface::WorldInterface()
56{
57  this->worldIsInitialized = false;
58  this->worldReference = NULL;
59}
60
61/**
62   \brief public deconstructor
63*/
64WorldInterface::~WorldInterface()
65{
66  this->singletonRef = NULL;
67  this->worldIsInitialized = false;
68  this->worldReference = NULL;
69}
70
71/**
72   \brief gets the singleton instance
73   \returns singleton instance
74*/
75WorldInterface* WorldInterface::getInstance()
76{
77  if( singletonRef == NULL)
78    singletonRef = new WorldInterface();
79  return singletonRef;
80}
81
82
83/**
84   \brief initializes the interface
85   \param reference to the world
86
87   if the worldinterface is not initilizes, there wont be any
88   useable interface
89*/
90void WorldInterface::init(World* world)
91{
92  this->worldReference = world;
93  if( world != NULL)
94    {
95      this->worldIsInitialized = true;
96      PRINTF(3)("WorldInterface up and running\n");
97    }
98}
99
100
101/**
102   \brief gets the entity list from the world
103   \return entity list
104*/
105tList<WorldEntity>* WorldInterface::getEntityList()
106{
107  if( this->worldIsInitialized)
108    return this->worldReference->getEntities();
109  PRINT(1)("Someone tried to use the WorldInterface before it has been initizlized! this can result in SEGFAULTs!\n");
110  return NULL;
111}
112
113
114
115/**
116    \brief create a new World
117   
118    This creates a new empty world!
119*/
120World::World (char* name)
121{
122  this->init(name, -1);
123  //NullParent* np = NullParent::getInstance();
124}
125
126/**
127   \brief creates a new World...
128   \param worldID with this ID
129*/
130World::World (int worldID)
131{
132  this->init(NULL, worldID);
133}
134
135/**
136    \brief remove the World from memory
137   
138    delete everything explicitly, that isn't contained in the parenting tree!
139    things contained in the tree are deleted automaticaly
140*/
141World::~World ()
142{
143  PRINTF(3)("World::~World() - deleting current world\n");
144  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
145  cn->unbind(this->localPlayer);
146  cn->reset();
147
148  ResourceManager::getInstance()->debug();
149  ResourceManager::getInstance()->unloadAllByPriority(RP_LEVEL);
150  ResourceManager::getInstance()->debug();
151
152  delete WorldInterface::getInstance();
153
154  delete this->nullParent;
155  delete this->entities;
156  delete this->lightMan;
157  delete this->trackManager;
158}
159
160/**
161   \brief initializes the world.
162
163   set all stuff here that is world generic and does not use to much memory
164   because the real init() function StoryEntity::init() will be called
165   shortly before start of the game. 
166   since all worlds are initiated/referenced before they will be started.
167   NO LEVEL LOADING HERE - NEVER!
168*/
169void World::init(char* name, int worldID)
170{
171  this->setClassName ("World");
172
173  this->worldName = name;
174  this->debugWorldNr = worldID;
175  this->entities = new tList<WorldEntity>();
176}
177
178
179/**
180   \brief this is executed before load
181
182   since the load function sometimes needs data, that has been init before
183   the load and after the proceeding storyentity has finished
184*/
185ErrorMessage World::preLoad()
186{
187  /* init the world interface */
188  WorldInterface* wi = WorldInterface::getInstance();
189  wi->init(this);
190  this->garbageCollector = GarbageCollector::getInstance();
191}
192
193
194/**
195   \brief loads the World by initializing all resources, and set their default values.
196*/
197ErrorMessage World::load()
198{
199  //  BezierCurve* tmpCurve = new BezierCurve();
200  if(this->debugWorldNr != -1)
201    {
202      // initializing Font
203      testFont = new FontSet();
204      testFont->buildFont("../data/pictures/font.tga");
205      tmpFont = new GLFont("../data/fonts/dark_crystal.ttf");
206      this->glmis->step();
207      // initializing the TrackManager
208      trackManager = TrackManager::getInstance();
209      trackManager->addPoint(Vector(0,0,0));
210      trackManager->addPoint(Vector(100, -40, 5));
211      trackManager->addPoint(Vector(200,-40,-8));
212      trackManager->addPoint(Vector(250, -35, -2));
213      trackManager->addPoint(Vector(320,-33,-.55));
214      trackManager->setDuration(3);
215      trackManager->setSavePoint();
216      trackManager->addPoint(Vector(410, 0, 0));
217      trackManager->addPoint(Vector(510, 20, -10));
218      trackManager->addPoint(Vector(550, 20, -10));
219      trackManager->addPoint(Vector(570, 20, -10));
220      trackManager->setDuration(5);
221     
222      int fork11, fork12;
223      trackManager->fork(2, &fork11, &fork12);
224      trackManager->workOn(fork11);
225      trackManager->addPoint(Vector(640, 25, -30));
226      trackManager->addPoint(Vector(700, 40, -120));
227      trackManager->addPoint(Vector(800, 50, -150));
228      trackManager->addPoint(Vector(900, 60, -100));
229      trackManager->addPoint(Vector(900, 60, -70));
230      trackManager->addPoint(Vector(990, 65, -15));
231      trackManager->addPoint(Vector(1050, 65, -10));
232      trackManager->addPoint(Vector(1100, 65, -20));
233      trackManager->setDuration(10);
234
235      trackManager->workOn(fork12);
236      trackManager->addPoint(Vector(640, 25, 20));
237      trackManager->addPoint(Vector(670, 50, 120));
238      trackManager->addPoint(Vector(700, 70, 80));
239      trackManager->addPoint(Vector(800, 70, 65));
240      trackManager->addPoint(Vector(850, 65, 65));
241      trackManager->addPoint(Vector(920, 35, 40));
242      trackManager->addPoint(Vector(945, 40, 40));
243      trackManager->addPoint(Vector(970, 24, 40));
244      trackManager->addPoint(Vector(1000, 40, -7));
245      trackManager->setDuration(10);
246     
247
248      trackManager->join(2, fork11, fork12);
249
250      trackManager->workOn(5);
251      trackManager->addPoint(Vector(1200, 60, -50));
252      trackManager->addPoint(Vector(1300, 50, -50));
253      trackManager->addPoint(Vector(1400, 40, -50));
254      trackManager->addPoint(Vector(1500, 40, -60));
255      trackManager->addPoint(Vector(1600, 35, -55));
256      trackManager->addPoint(Vector(1700, 45, -40));
257      trackManager->addPoint(Vector(1750, 60, -40));
258      trackManager->addPoint(Vector(1770, 80, -40));
259      trackManager->addPoint(Vector(1800, 100, -40));
260      trackManager->setDuration(10);
261
262      trackManager->finalize();
263
264     
265      /*monitor progress*/
266      this->glmis->step();
267
268      // LIGHT initialisation
269      lightMan = LightManager::getInstance();
270      lightMan->setAmbientColor(.1,.1,.1);
271      lightMan->addLight();
272      //      lightMan->setAttenuation(1.0, .01, 0.0);
273      //      lightMan->setDiffuseColor(1,1,1);
274      //  lightMan->addLight(1);
275      //  lightMan->setPosition(20, 10, -20);
276      //  lightMan->setDiffuseColor(0,0,0);
277      lightMan->debug();
278
279      switch(this->debugWorldNr)
280        {
281          /*
282            this loads the hard-coded debug world. this only for simplicity and will be
283            removed by a reald world-loader, which interprets a world-file.
284            if you want to add an own debug world, just add a case DEBUG_WORLD_[nr] and
285            make whatever you want...
286           */
287        case DEBUG_WORLD_0:
288          {
289            lightMan->setPosition(-5.0, 10.0, -40.0);
290            this->nullParent = NullParent::getInstance ();
291            this->nullParent->setName ("NullParent");
292
293            // !\todo old track-system has to be removed
294
295            //create helper for player
296            //HelperParent* hp = new HelperParent ();
297            /* the player has to be added to this helper */
298
299            // create a player
300            this->localPlayer = new Player ();
301            this->localPlayer->setName ("player");
302            this->spawn (this->localPlayer);
303            /*monitor progress*/
304            //this->glmis->step();         
305            this->glmis->step();
306
307            // bind input
308            Orxonox *orx = Orxonox::getInstance ();
309            orx->getLocalInput()->bind (this->localPlayer);
310           
311            // bind camera
312            this->localCamera = new Camera();
313            this->localCamera->setName ("camera");
314            this->localCamera->lookAt(this->localPlayer);
315            this->localCamera->setParent(this->localPlayer);
316           
317            /*monitor progress*/
318            this->glmis->step();
319
320            // Create SkySphere
321            this->skySphere = new Skysphere("../data/pictures/sky-replace.jpg");
322            this->skySphere->setName("SkySphere");
323            this->localCamera->addChild(this->skySphere);
324            this->skySphere->setMode(PNODE_MOVEMENT);
325
326            /*monitor progress*/
327            this->glmis->step();
328
329           
330            WorldEntity* env = new Environment();
331            env->setName ("env");
332            this->spawn(env);
333
334           
335            /*
336            Vector* es = new Vector (10, 5, 0);
337            Quaternion* qs = new Quaternion ();
338            WorldEntity* pr = new Primitive(P_CYLINDER);
339            pr->setName("primitive");
340            this->spawn(pr, this->localPlayer, es, qs, PNODE_MOVEMENT);
341            */
342
343            /*monitor progress*/
344            this->glmis->step();
345
346            //      trackManager->setBindSlave(env);
347            PNode* tn = trackManager->getTrackNode();
348            tn->addChild(this->localPlayer);
349
350            //localCamera->setParent(TrackNode::getInstance());
351            tn->addChild(this->localCamera);
352            //      localCamera->lookAt(tn);
353            this->localPlayer->setMode(PNODE_ALL);
354            //Vector* cameraOffset = new Vector (0, 5, -10);
355            trackManager->condition(2, LEFTRIGHT, this->localPlayer);
356            this->glmis->step();
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  testFont->printText(0, 0, 1, "orxonox_" PACKAGE_VERSION);
597  tmpFont->draw();
598
599  lightMan->draw(); // must be at the end of the drawing procedure, otherwise Light cannot be handled as PNodes //
600}
601
602
603/**
604   \brief function to put your own debug stuff into it. it can display informations about
605   the current class/procedure
606*/
607void World::debug()
608{
609  PRINTF(2)("debug() - starting debug\n");
610  PNode* p1 = NullParent::getInstance ();
611  PNode* p2 = new PNode (new Vector(2, 2, 2), p1);
612  PNode* p3 = new PNode (new Vector(4, 4, 4), p1);
613  PNode* p4 = new PNode (new Vector(6, 6, 6), p2);
614
615  p1->debug ();
616  p2->debug ();
617  p3->debug ();
618  p4->debug ();
619
620  p1->shiftCoor (new Vector(-1, -1, -1));
621
622  printf("World::debug() - shift\n");
623  p1->debug ();
624  p2->debug ();
625  p3->debug ();
626  p4->debug ();
627 
628  p1->update (0);
629
630  printf ("World::debug() - update\n");
631  p1->debug ();
632  p2->debug ();
633  p3->debug ();
634  p4->debug ();
635
636  p2->shiftCoor (new Vector(-1, -1, -1));
637  p1->update (0);
638
639  p1->debug ();
640  p2->debug ();
641  p3->debug ();
642  p4->debug ();
643
644  p2->setAbsCoor (new Vector(1,2,3));
645
646
647 p1->update (0);
648
649  p1->debug ();
650  p2->debug ();
651  p3->debug ();
652  p4->debug ();
653
654  delete p1;
655 
656 
657  /*
658  WorldEntity* entity;
659  printf("counting all entities\n");
660  printf("World::debug() - enumerate()\n");
661  entity = entities->enumerate(); 
662  while( entity != NULL )
663    {
664      if( entity->bDraw ) printf("got an entity\n");
665      entity = entities->nextElement();
666    }
667  */
668}
669
670
671/**
672  \brief main loop of the world: executing all world relevant function
673
674  in this loop we synchronize (if networked), handle input events, give the heart-beat to
675  all other member-entities of the world (tick to player, enemies etc.), checking for
676  collisions drawing everything to the screen.
677*/
678void World::mainLoop()
679{
680  this->lastFrame = SDL_GetTicks ();
681  PRINTF(3)("World::mainLoop() - Entering main loop\n");
682  while( !this->bQuitOrxonox && !this->bQuitCurrentGame) /* \todo implement pause */
683    {
684      PRINTF(3)("World::mainloop() - number of entities: %i\n", this->entities->getSize());
685      // Network
686      this->synchronize ();
687      // Process input
688      this->handleInput ();
689      if( this->bQuitCurrentGame || this->bQuitOrxonox)
690          break;
691      // Process time
692      this->tick ();
693      // Update the state
694      this->update ();     
695      // Process collision
696      this->collide ();
697      // Draw
698      this->display ();
699
700      //      for( int i = 0; i < 5000000; i++) {}
701      /* \todo this is to slow down the program for openGl Software emulator computers, reimplement*/
702    }
703  PRINTF(3)("World::mainLoop() - Exiting the main loop\n");
704}
705
706
707/**
708   \brief synchronize local data with remote data
709*/
710void World::synchronize ()
711{
712  // Get remote input
713  // Update synchronizables
714}
715
716
717/**
718   \brief run all input processing
719
720   the command node is the central input event dispatcher. the node uses the even-queue from
721   sdl and has its own event-passing-queue.
722*/
723void World::handleInput ()
724{
725  // localinput
726  CommandNode* cn = Orxonox::getInstance()->getLocalInput();
727  cn->process();
728  // remoteinput
729}
730
731
732/**
733   \brief advance the timeline
734
735   this calculates the time used to process one frame (with all input handling, drawing, etc)
736   the time is mesured in ms and passed to all world-entities and other classes that need
737   a heart-beat.
738*/
739void World::tick ()
740{
741  Uint32 currentFrame = SDL_GetTicks();
742  if(!this->bPause)
743    {
744      this->dt = currentFrame - this->lastFrame;
745     
746      if( this->dt > 0)
747        {
748          float fps = 1000/dt;
749
750          // temporary, only for showing how fast the text-engine is
751          char tmpChar[20];
752          sprintf(tmpChar, "fps: %4.0f", fps);
753          tmpFont->setText(tmpChar);
754          tmpFont->createTexture();
755        }
756      else
757        {
758          /* the frame-rate is limited to 100 frames per second, all other things are for
759             nothing.
760          */
761          PRINTF(2)("fps = 1000 - frame rate is adjusted\n");
762          SDL_Delay(10);
763          this->dt = 10;
764        }
765      //this->timeSlice (dt);
766     
767      /* function to let all entities tick (iterate through list) */
768      float seconds = this->dt / 1000.0;     
769      this->gameTime += seconds;
770      //entity = entities->enumerate();
771      tIterator<WorldEntity>* iterator = this->entities->getIterator();
772      WorldEntity* entity = iterator->nextElement();
773      while( entity != NULL) 
774        { 
775          entity->tick (seconds);
776          entity = iterator->nextElement();
777        }
778      delete iterator;
779      //skySphere->updatePosition(localCamera->absCoordinate);
780     
781      /* update tick the rest */
782      this->trackManager->tick(this->dt);
783      this->localCamera->tick(this->dt);
784      this->garbageCollector->tick(seconds);
785    }
786  this->lastFrame = currentFrame;
787}
788
789
790/**
791   \brief this function gives the world a consistant state
792
793   after ticking (updating the world state) this will give a constistant
794   state to the whole system.
795*/
796void World::update()
797{
798  this->garbageCollector->update();
799  this->nullParent->update (dt);
800}
801
802
803/**
804   \brief render the current frame
805   
806   clear all buffers and draw the world
807*/
808void World::display ()
809{
810  // clear buffer
811  glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
812  // set camera
813  this->localCamera->apply ();
814  // draw world
815  this->draw();
816  // draw HUD
817  /* \todo draw HUD */
818  // flip buffers
819  SDL_GL_SwapBuffers();
820  //SDL_Surface* screen = Orxonox::getInstance()->getScreen ();
821  //SDL_Flip (screen);
822}
823
824
825/**
826   \brief add and spawn a new entity to this world
827   \param entity to be added
828*/
829void World::spawn(WorldEntity* entity)
830{
831  this->entities->add (entity);
832  entity->postSpawn ();
833}
834
835
836/**
837   \brief add and spawn a new entity to this world
838   \param entity to be added
839   \param absCoor At what coordinates to add this entity.
840   \param absDir In which direction should it look.
841*/
842void World::spawn(WorldEntity* entity, Vector* absCoor, Quaternion* absDir)
843{
844  this->entities->add (entity);
845
846  entity->setAbsCoor (absCoor);
847  entity->setAbsDir (absDir);
848
849  entity->postSpawn ();
850}
851
852
853/**
854   \brief add and spawn a new entity to this world
855   \param entity to be added
856   \param entity to be added to (PNode)
857   \param At what relative  coordinates to add this entity.
858   \param In which relative direction should it look.
859*/
860void World::spawn(WorldEntity* entity, PNode* parentNode, 
861                  Vector* relCoor, Quaternion* relDir, 
862                  int parentingMode)
863{
864  this->nullParent = NullParent::getInstance();
865  if( parentNode != NULL)
866    {
867      parentNode->addChild (entity);
868     
869      entity->setRelCoor (relCoor);
870      entity->setRelDir (relDir);
871      entity->setMode(parentingMode);
872     
873      this->entities->add (entity);
874     
875      entity->postSpawn ();
876    }
877}
878
879
880
881/**
882  \brief commands that the world must catch
883  \returns false if not used by the world
884*/
885bool World::command(Command* cmd)
886{
887  if( !strcmp( cmd->cmd, "view0")) this->localCamera->setViewMode(VIEW_NORMAL);
888  else if( !strcmp( cmd->cmd, "view1")) this->localCamera->setViewMode(VIEW_BEHIND);
889  else if( !strcmp( cmd->cmd, "view2")) this->localCamera->setViewMode(VIEW_FRONT);
890  else if( !strcmp( cmd->cmd, "view3")) this->localCamera->setViewMode(VIEW_LEFT);
891  else if( !strcmp( cmd->cmd, "view4")) this->localCamera->setViewMode(VIEW_RIGHT);
892  else if( !strcmp( cmd->cmd, "view5")) this->localCamera->setViewMode(VIEW_TOP);
893 
894  return false;
895}
896
Note: See TracBrowser for help on using the repository browser.