Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/story_entities/game_world_data.cc @ 10379

Last change on this file since 10379 was 10379, checked in by patrick, 17 years ago

merged branche camera to trunk. resolved many conflicts as in the other projects too

File size: 10.2 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11### File Specific:
12   main-programmer: Patrick Boenzli
13*/
14
15
16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD
17
18#include <fstream>
19#include <iostream>
20
21#include "game_world_data.h"
22
23#include "state.h"
24#include "substring.h"
25
26#include "util/loading/game_loader.h"
27#include "util/loading/resource_manager.h"
28
29#include "world_entity.h"
30#include "player.h"
31#include "camera.h"
32#include "cameraman.h"
33#include "terrain.h"
34#include "skybox.h"
35#include "md2/md2Model.h"
36#include "world_entities/projectiles/projectile.h"
37#include "npcs/npc_test1.h"
38#include "playable.h"
39
40#include "light.h"
41
42#include "util/loading/factory.h"
43#include "loading/fast_factory.h"
44#include "util/loading/load_param_xml.h"
45
46#include "graphics_engine.h"
47#include "graphics_effect.h"
48#include "weather_effects/atmospheric_engine.h"
49#include "event_handler.h"
50#include "sound_engine.h"
51#include "cd_engine.h"
52#include "network_manager.h"
53#include "physics_engine.h"
54
55#include "glmenu_imagescreen.h"
56
57#include "game_rules.h"
58
59#include "ogg_player.h"
60#include "shader.h"
61
62
63ObjectListDefinition(GameWorldData);
64/**
65 * constructor of the GameWorldData
66 */
67GameWorldData::GameWorldData()
68{
69  this->registerObject(this, GameWorldData::_objectList);
70
71  this->glmis = NULL;
72
73
74  this->localPlayer = NULL;
75  this->sky = NULL;
76  this->terrain = NULL;
77
78  this->music = NULL;
79  this->objectManager = NULL;
80  this->gameRule = NULL;
81}
82
83
84/**
85 * destructor for the GameWorldData
86 */
87GameWorldData::~GameWorldData()
88{}
89
90
91
92/**
93 *  initialize the GameWorldData
94 */
95ErrorMessage GameWorldData::init()
96{
97  this->objectManager = new ObjectManager();
98  State::setObjectManager(this->objectManager);
99
100  PNode::getNullParent();
101  Camera* localCamera = new Camera();
102    localCamera->setName ("GameWorld-Camera");
103  State::setCamera(localCamera, localCamera->getTarget());
104  CameraMan* camMan = new CameraMan();
105  State::setCameraman(camMan);
106  LightManager::getInstance();
107
108//  GraphicsEngine::getInstance()->displayFPS(true);
109
110  return ErrorMessage();
111}
112
113
114/**
115 *  loads the data from the xml file
116 * @param root reference to the xml root element
117 */
118ErrorMessage GameWorldData::loadData(const TiXmlElement* root)
119{
120  assert (root != NULL);
121  // load the parameters
122  // name
123  std::string string = LoadParamBase::grabParameter( root, "name");
124  if( string.empty() )
125  {
126    PRINTF(2)("GameWorld is missing a proper 'name'\n");
127    this->setName("Unknown");
128  }
129  else
130    this->setName(string.c_str());
131
132  this->loadGUI(root);
133  this->loadWorldEntities(root);
134  this->loadScene(root);
135
136  return ErrorMessage();
137}
138
139
140/**
141 *  unloads the data from the xml file
142 */
143ErrorMessage GameWorldData::unloadData()
144{
145  this->unloadGUI();
146  this->unloadWorldEntities();
147  this->unloadScene();
148
149  return ErrorMessage();
150}
151
152
153/**
154 * @brief loads the GUI data
155 * @param root reference to the xml root element
156 */
157ErrorMessage GameWorldData::loadGUI(const TiXmlElement* root)
158{
159  const TiXmlElement* element = root->FirstChildElement("LoadScreen");
160  if( element == NULL)
161  {
162    PRINTF(2)("no LoadScreen specified, loading default\n");
163
164    glmis->setBackgroundImage("textures/load_screens/default.jpg");
165    this->glmis->setMaximum(8);
166    //     this->glmis->draw();
167  }
168  else
169  {
170    this->glmis->loadParams(element);
171    //     this->glmis->draw();
172  }
173  this->glmis->draw();
174
175  return ErrorMessage();
176}
177
178
179/**
180 * @brief unloads the GUI data
181 */
182ErrorMessage GameWorldData::unloadGUI()
183{
184  delete this->glmis;
185
186  return ErrorMessage();
187}
188
189
190/**
191 * @brief loads the world entities from the xml file
192 * @param root reference to the xml root parameter
193 */
194ErrorMessage GameWorldData::loadWorldEntities(const TiXmlElement* root)
195{
196  const TiXmlElement* element = root->FirstChildElement("WorldEntities");
197  bool mouseCaptured = EventHandler::getInstance()->grabbedEvents();
198  EventHandler::getInstance()->grabEvents(false);
199
200  if( element == NULL)
201  {
202    PRINTF(1)("GameWorld is missing 'WorldEntities'\n");
203  }
204  else
205  {
206    element = element->FirstChildElement();
207    // load Players/Objects/Whatever
208    PRINTF(4)("Loading WorldEntities\n");
209    while( element != NULL)
210    {
211      BaseObject* created = Factory::fabricate(element);
212      if( created != NULL )
213        PRINTF(4)("Created a %s: %s\n", created->getClassCName(), created->getCName());
214
215      //todo do this more elegant
216      if( element->Value() == "SkyBox" && created->isA(SkyBox::staticClassID()))
217      {
218        this->sky = dynamic_cast<WorldEntity*>(created);
219        State::setSkyBox(dynamic_cast<SkyBox*>(this->sky));
220      }
221      if( element->Value() == "Terrain" && created->isA(Terrain::staticClassID()))
222      {
223        this->terrain = dynamic_cast<Terrain*>(created);
224        CDEngine::getInstance()->setTerrain(terrain);
225      }
226      element = element->NextSiblingElement();
227      this->glmis->step(); //! @todo temporary
228    }
229    PRINTF(4)("Done loading WorldEntities\n");
230  }
231
232  // Create a Player
233  this->localPlayer = new Player();
234  State::setPlayer(this->localPlayer);
235
236  if (!Playable::objectList().empty())
237  {
238    /// TODO Make this also loadable
239    this->localPlayer->setPlayable(Playable::objectList().front());
240  }
241
242  // Fill the EntityLists. Tick then Draw:
243  this->tickLists.push_back(OM_DEAD_TICK);
244  this->tickLists.push_back(OM_ENVIRON);
245  this->tickLists.push_back(OM_COMMON);
246  this->tickLists.push_back(OM_GROUP_00);
247  this->tickLists.push_back(OM_GROUP_00_PROJ);
248  this->tickLists.push_back(OM_GROUP_01);
249  this->tickLists.push_back(OM_GROUP_01_PROJ);
250  this->tickLists.push_back(OM_GROUP_02);
251
252  this->drawLists.push_back(OM_ENVIRON_NOTICK);
253  this->drawLists.push_back(OM_ENVIRON);
254  this->drawLists.push_back(OM_GROUP_00);
255  this->drawLists.push_back(OM_GROUP_00_PROJ);
256  this->drawLists.push_back(OM_GROUP_01);
257  this->drawLists.push_back(OM_GROUP_01_PROJ);
258  this->drawLists.push_back(OM_GROUP_02);
259  this->drawLists.push_back(OM_COMMON);
260
261  /* init the pnode tree */
262  PNode::getNullParent()->init();
263
264  EventHandler::getInstance()->grabEvents(mouseCaptured);
265
266  return ErrorMessage();
267}
268
269
270/**
271 *  unloads the world entities
272 */
273ErrorMessage GameWorldData::unloadWorldEntities()
274{
275  FastFactory::flushAll(true);
276  GraphicsEngine::getInstance()->displayFPS(false);
277  // erease everything that is left.
278  //secondary cleanup of PNodes;
279  while (!PNode::objectList().empty())
280    delete PNode::objectList().front();
281
282  /* remove the player object */
283  if( this->localPlayer)
284    delete this->localPlayer;
285  State::setPlayer(NULL);
286  this->localPlayer = NULL;
287  State::setCamera(NULL, NULL);
288  this->sky = NULL;
289  this->terrain = NULL;
290
291  while (!GraphicsEffect::objectList().empty())
292    delete GraphicsEffect::objectList().front();
293
294
295  while (!Element2D::objectList().empty())
296    delete Element2D::objectList().front();
297
298  // At this Point all the WorldEntites should be unloaded.
299  this->tickLists.clear();
300  this->drawLists.clear();
301
302  // unload the resources loaded in this Level !!
303  /// FIXME TODO HACK!!
304//  ResourceManager::getInstance()->unloadAllByPriority(RP_LEVEL);
305
306  if (State::getObjectManager() == this->objectManager)
307  {
308    State::setObjectManager(NULL);
309    delete this->objectManager;
310  }
311  this->objectManager = NULL;
312
313  if(State::getSkyBox())
314    State::setSkyBox(NULL);
315
316  this->glmis = NULL;
317
318  return ErrorMessage();
319}
320
321
322/**
323 * @brief loads the scene data
324 * @param root reference to the xml root element
325 */
326ErrorMessage GameWorldData::loadScene(const TiXmlElement* root)
327{
328  LoadParamXML(root, "LightManager", LightManager::getInstance(), LightManager, loadParams);
329  LoadParamXML(root, "GraphicsEngine", GraphicsEngine::getInstance(), GraphicsEngine, loadParams);
330  LoadParamXML(root, "AtmosphericEngine", AtmosphericEngine::getInstance(), AtmosphericEngine, loadParams);
331
332  LoadParam(root, "Music", this, GameWorldData, setSoundTrack);
333
334  LoadParamXML(root, "GameRule", this, GameWorldData, loadGameRule);
335
336  LoadParam(root, "clip-region", State::getCameraman(), CameraMan, setClipRegion);
337
338
339  //LoadParamXML(root, "ParticleEngine", ParticleEngine::getInstance(), ParticleEngine, loadParams);
340  //LoadParamXML(root, "PhysicsEngine", PhysicsEngine::getInstance(), PhysicsEngine, loadParams);
341
342
343  OrxSound::SoundEngine::getInstance()->setListener(State::getCamera());
344
345  return ErrorMessage();
346}
347
348
349
350/**
351 *  unloads the scene data
352 */
353ErrorMessage GameWorldData::unloadScene()
354{
355  /* delete some garphics and scene eingines */
356  delete LightManager::getInstance();
357  delete AtmosphericEngine::getInstance();
358
359  if (this->music != NULL)
360    this->setSoundTrack("");
361
362  /* unload the shaders */
363  Shader::suspendShader();
364
365  State::setGameRules(NULL);
366
367  return ErrorMessage();
368}
369
370
371void GameWorldData::setSoundTrack(const std::string& name)
372{
373  if (this->music != NULL)
374    delete this->music;
375  this->music = NULL;
376
377  if (!name.empty())
378  {
379    PRINTF(3)("Setting Sound Track to %s\n", name.c_str());
380    std::string oggFile = Resources::ResourceManager::getInstance()->prependAbsoluteMainPath(name);
381    this->music = new OrxSound::OggPlayer(oggFile);
382    if (this->localPlayer != NULL)
383      this->localPlayer->hud().notifyUser(std::string("Playing SoundTrack: ") + this->music->artist() + " - " + this->music->title());
384
385    //(OggPlayer*)ResourceManager::getInstance()->load(name, OGG, RP_LEVEL);
386    //assert(this->music->isA(CL_SOUND_OGG_PLAYER));
387  }
388}
389
390
391void GameWorldData::loadGameRule(const TiXmlElement* root)
392{
393  const TiXmlElement* element = root->FirstChildElement();
394  while( element != NULL)
395  {
396    PRINTF(2)("============ GameRules ==\n");
397    PRINTF(2)("creating %s\n", element->Value());
398    BaseObject* created = Factory::fabricate(element);
399    if (created != NULL && created->isA(GameRules::staticClassID()))
400    {
401      this->gameRule = dynamic_cast<GameRules*>(created);
402      State::setGameRules(this->gameRule);
403      // if there is a valid game rule loaded, return because it is not thought to load multiple game rules
404      return;
405    }
406    else
407    {
408      PRINTF(1)("Could not create a %s\n", element->Value());
409      delete created;
410    }
411    element = element->NextSiblingElement();
412  }
413}
414
415
416
Note: See TracBrowser for help on using the repository browser.