Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/input/src/orxonox/GraphicsEngine.cc @ 1109

Last change on this file since 1109 was 1090, checked in by rgrieder, 17 years ago
  • ..\..\media —> ..\..\Media as the default folder for the media files
File size: 9.1 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Benjamin Knecht <beni_at_orxonox.net>, (C) 2007
24 *   Co-authors:
25 *      Reto Grieder
26 *
27 */
28
29 /**
30    @file orxonox.cc
31    @brief Orxonox class
32  */
33
34#include "OrxonoxStableHeaders.h"
35#include "GraphicsEngine.h"
36
37#include <OgreRoot.h>
38#include <OgreException.h>
39#include <OgreConfigFile.h>
40#include <OgreLogManager.h>
41#include <OgreTextureManager.h>
42#include <OgreRenderWindow.h>
43
44#include "core/CoreIncludes.h"
45#include "core/ConfigValueIncludes.h"
46#include "core/Debug.h"
47
48
49namespace orxonox {
50
51  /**
52    @brief Returns the singleton instance and creates it the first time.
53    @return The only instance of GraphicsEngine.
54  */
55  GraphicsEngine& GraphicsEngine::getSingleton()
56  {
57    static GraphicsEngine theOnlyInstance;
58    return theOnlyInstance;
59  }
60
61  /**
62    @brief Only use constructor to initialise variables and pointers!
63  */
64  GraphicsEngine::GraphicsEngine()
65  {
66    RegisterObject(GraphicsEngine);
67    //this->bOverwritePath_ = false;
68    this->setConfigValues();
69    // set to standard values
70    this->configPath_ = "";
71    this->root_ = 0;
72    this->scene_ = 0;
73    this->renderWindow_ = 0;
74    COUT(4) << "*** GraphicsEngine: Constructed" << std::endl;
75  }
76
77  /**
78    @brief Called after main() --> call destroyObjects()!
79  */
80  GraphicsEngine::~GraphicsEngine()
81  {
82    this->destroy();
83  }
84
85  /**
86    @brief Destroys all the internal objects. Call this method when you
87           normally would call the destructor.
88  */
89  void GraphicsEngine::destroy()
90  {
91    COUT(4) << "*** GraphicsEngine: Destroying objects..." << std::endl;
92    if (this->root_)
93      delete this->root_;
94    this->root_ = 0;
95    this->scene_ = 0;
96    this->renderWindow_ = 0;
97    // delete the ogre log and the logManager (since we have created it).
98    if (Ogre::LogManager::getSingletonPtr() != 0)
99    {
100      Ogre::LogManager::getSingleton().getDefaultLog()->removeListener(this);
101      Ogre::LogManager::getSingleton().destroyLog(Ogre::LogManager::getSingleton().getDefaultLog());
102      delete Ogre::LogManager::getSingletonPtr();
103    }
104    COUT(4) << "*** GraphicsEngine: Destroying objects done" << std::endl;
105  }
106
107  void GraphicsEngine::setConfigValues()
108  {
109    SetConfigValue(dataPath_, "../../Media/").description("relative path to media data");
110    SetConfigValue(ogreLogfile_, "ogre.log").description("Logfile for messages from Ogre. Use \"\" to suppress log file creation.");
111    SetConfigValue(ogreLogLevelTrivial_ , 5).description("Corresponding orxonox debug level for ogre Trivial");
112    SetConfigValue(ogreLogLevelNormal_  , 4).description("Corresponding orxonox debug level for ogre Normal");
113    SetConfigValue(ogreLogLevelCritical_, 2).description("Corresponding orxonox debug level for ogre Critical");
114  }
115
116  /**
117    @brief Creates the Ogre Root object and sets up the ogre log.
118  */
119  void GraphicsEngine::setup()
120  {
121    //TODO: Check if file exists (maybe not here)
122/*#ifndef OGRE_STATIC_LIB
123    root_ = new Ogre::Root(configPath_ + "plugins.cfg", configPath_ + "ogre.cfg",
124                     configPath_ + "Ogre.log");
125#else
126    root_ = new Ogre::Root(NULL, configPath_ + "ogre.cfg", configPath_ + "Ogre.log");
127#endif*/
128#if ORXONOX_COMPILER == ORXONOX_COMPILER_MSVC && defined(_DEBUG)
129    std::string plugin_filename = "plugins_d.cfg";
130#else
131    std::string plugin_filename = "plugins.cfg";
132#endif
133
134    // create a logManager
135    Ogre::LogManager *logger;
136                if (Ogre::LogManager::getSingletonPtr() == 0)
137                        logger = new Ogre::LogManager();
138    else
139      logger = Ogre::LogManager::getSingletonPtr();
140    COUT(4) << "*** GraphicsEngine: Ogre LogManager created/assigned" << std::endl;
141
142    // create our own log that we can listen to
143    Ogre::Log *myLog;
144    if (this->ogreLogfile_ == "")
145      myLog = logger->createLog("ogre.log", true, false, true);
146    else
147      myLog = logger->createLog(this->ogreLogfile_, true, false, false);
148    COUT(4) << "*** GraphicsEngine: Ogre Log created" << std::endl;
149
150    myLog->setLogDetail(Ogre::LL_BOREME);
151    myLog->addListener(this);
152
153    // Root will detect that we've already created a Log
154    COUT(4) << "*** GraphicsEngine: Creating Ogre Root..." << std::endl;
155    root_ = new Ogre::Root(plugin_filename);
156    COUT(4) << "*** GraphicsEngine: Creating Ogre Root done" << std::endl;
157  }
158
159  /**
160   * @return scene manager
161   */
162  Ogre::SceneManager* GraphicsEngine::getSceneManager()
163  {
164    if(!scene_)
165    {
166      scene_ = root_->createSceneManager(Ogre::ST_GENERIC, "Default SceneManager");
167      COUT(3) << "Info: Created SceneMan: " << scene_ << std::endl;
168    }
169    return scene_;
170  }
171
172  bool GraphicsEngine::load(std::string dataPath)
173  {
174    // temporary overwrite of dataPath, change ini file for permanent change
175    if( dataPath != "" )
176      dataPath_ = dataPath + "/";
177    loadRessourceLocations(this->dataPath_);
178    if (!root_->restoreConfig() && !root_->showConfigDialog())
179      return false;
180    return true;
181  }
182
183  void GraphicsEngine::initialise()
184  {
185    this->renderWindow_ = root_->initialise(true, "OrxonoxV2");
186    Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5);
187    //TODO: Do NOT load all the groups, why are we doing that? And do we really do that? initialise != load...
188    Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
189  }
190
191  void GraphicsEngine::loadRessourceLocations(std::string dataPath)
192  {
193    //TODO: Specify layout of data file and maybe use xml-loader
194    //TODO: Work with ressource groups (should be generated by a special loader)
195    // Load resource paths from data file using configfile ressource type
196    Ogre::ConfigFile cf;
197    cf.load(dataPath + "resources.cfg");
198
199    // Go through all sections & settings in the file
200    Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
201
202    std::string secName, typeName, archName;
203    while (seci.hasMoreElements())
204    {
205      secName = seci.peekNextKey();
206      Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
207      Ogre::ConfigFile::SettingsMultiMap::iterator i;
208      for (i = settings->begin(); i != settings->end(); ++i)
209      {
210        typeName = i->first; // for instance "FileSystem" or "Zip"
211        archName = i->second; // name (and location) of archive
212
213        Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
214                                           std::string(dataPath + archName),
215                                           typeName, secName);
216      }
217    }
218  }
219
220  /**
221    Returns the window handle of the render window.
222    At least the InputHandler uses this to create the OIS::InputManager
223    @return The window handle of the render window
224  */
225  size_t GraphicsEngine::getWindowHandle()
226  {
227    if (this->renderWindow_)
228    {
229      size_t windowHnd = 0;
230      this->renderWindow_->getCustomAttribute("WINDOW", &windowHnd);
231      return windowHnd;
232    }
233    else
234      return 0;
235  }
236
237  /**
238    Get the width of the current render window
239    @return The width of the current render window
240  */
241  int GraphicsEngine::getWindowWidth() const
242  {
243    if (this->renderWindow_)
244      return this->renderWindow_->getWidth();
245    else
246      return 0;
247  }
248
249  /**
250    Get the height of the current render window
251    @return The height of the current render window
252  */
253  int GraphicsEngine::getWindowHeight() const
254  {
255    if (this->renderWindow_)
256      return this->renderWindow_->getHeight();
257    else
258      return 0;
259  }
260
261  /**
262    @brief Method called by the LogListener interface from Ogre.
263    We use it to capture Ogre log messages and handle it ourselves.
264    @param message The message to be logged
265    @param lml The message level the log is using
266    @param maskDebug If we are printing to the console or not
267    @param logName the name of this log (so you can have several listeners
268                   for different logs, and identify them)
269  */
270  void GraphicsEngine::messageLogged(const std::string& message,
271    Ogre::LogMessageLevel lml, bool maskDebug, const std::string &logName)
272  {
273    int orxonoxLevel;
274    switch (lml)
275    {
276      case Ogre::LML_TRIVIAL:
277        orxonoxLevel = this->ogreLogLevelTrivial_;
278        break;
279      case Ogre::LML_NORMAL:
280        orxonoxLevel = this->ogreLogLevelNormal_;
281        break;
282      case Ogre::LML_CRITICAL:
283        orxonoxLevel = this->ogreLogLevelCritical_;
284        break;
285      default:
286        orxonoxLevel = 0;
287    }
288    OutputHandler::getOutStream().setOutputLevel(orxonoxLevel)
289        << "*** Ogre: " << message << std::endl;
290  }
291}
Note: See TracBrowser for help on using the repository browser.