Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/GraphicsEngine.cc @ 1219

Last change on this file since 1219 was 1214, checked in by landauf, 17 years ago

merged console-branch back to trunk.
IMPORTANT: update your media directory!

you need TCL to compile. TCL is available here: http://www.tcl.tk/
another option is to check out https://svn.orxonox.net/ogre/tcl8.5.2/ and compile it by yourself. makefiles are in the 'macosx', 'unix' and 'win' subfolders.
FindTCL.cmake searches in the usual locations and in ../libs/tcl8.5.2/

the orxonox console can be activated with numpad-enter. whatever you enter will be parsed by TCL. if TCL doesn't know a command, it gets executed by orxonox.

simple tcl commands are: "puts text" to write "text" into the console, "expr 1+1" to calculate the result of the given expression. just try it by yourself with "puts [expr 1+1]".
[x] means: evaluate x and use the returnvalue as an argument. in this case the returned value is "2" and the resulting command therefore "puts 2".

you can combine orxonox and tcl commands. a simple orxonox command is "log text" that writes text into the console and the logfile. test it with "log [expr 1+1]" to write "2" into all output channels of orxonox. something more advanced: "log [clock seconds]" writes the seconds since 1970 into the logfile. feel free to combine both: "log [clock seconds]: 1+1 is [expr 1+1]"

TCL uses variables. to set a new variable, use "set varname value". you can use the variable wherever you want with $varname. with this we can make the above command a bit more elegant:
set myexpression 1+1
log [clock seconds]: $myexpression is [expr $myexpression]

read more about tcl in the wiki: http://wiki.tcl.tk/

File size: 10.0 KB
RevLine 
[612]1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
[1056]3 *                    > www.orxonox.net <
[612]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:
[1032]25 *      Reto Grieder
[612]26 *
27 */
[1035]28
[612]29 /**
30    @file orxonox.cc
31    @brief Orxonox class
32  */
33
[1021]34#include "OrxonoxStableHeaders.h"
[1039]35#include "GraphicsEngine.h"
[612]36
37#include <OgreRoot.h>
[1021]38#include <OgreException.h>
[612]39#include <OgreConfigFile.h>
[1024]40#include <OgreLogManager.h>
[612]41#include <OgreTextureManager.h>
[1214]42#include "core/InputManager.h"
[1052]43#include "core/CoreIncludes.h"
44#include "core/ConfigValueIncludes.h"
[1214]45#include "core/Debug.h"
46#include "core/TclBind.h"
[1032]47
[612]48
49namespace orxonox {
50
[1032]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  */
[612]64  GraphicsEngine::GraphicsEngine()
65  {
[1021]66    RegisterObject(GraphicsEngine);
67    //this->bOverwritePath_ = false;
68    this->setConfigValues();
[612]69    // set to standard values
70    this->configPath_ = "";
[1021]71    this->root_ = 0;
72    this->scene_ = 0;
73    this->renderWindow_ = 0;
[1032]74    COUT(4) << "*** GraphicsEngine: Constructed" << std::endl;
[612]75  }
76
[1032]77  /**
78    @brief Called after main() --> call destroyObjects()!
79  */
[612]80  GraphicsEngine::~GraphicsEngine()
81  {
[1032]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;
[1214]92    Ogre::WindowEventUtilities::removeWindowEventListener(this->renderWindow_, this);
[1024]93    if (this->root_)
[1021]94      delete this->root_;
[1032]95    this->root_ = 0;
96    this->scene_ = 0;
97    this->renderWindow_ = 0;
98    // delete the ogre log and the logManager (since we have created it).
[1052]99    if (Ogre::LogManager::getSingletonPtr() != 0)
[1024]100    {
[1052]101      Ogre::LogManager::getSingleton().getDefaultLog()->removeListener(this);
102      Ogre::LogManager::getSingleton().destroyLog(Ogre::LogManager::getSingleton().getDefaultLog());
103      delete Ogre::LogManager::getSingletonPtr();
[1024]104    }
[1032]105    COUT(4) << "*** GraphicsEngine: Destroying objects done" << std::endl;
[612]106  }
107
[1021]108  void GraphicsEngine::setConfigValues()
109  {
[1090]110    SetConfigValue(dataPath_, "../../Media/").description("relative path to media data");
[1024]111    SetConfigValue(ogreLogfile_, "ogre.log").description("Logfile for messages from Ogre. Use \"\" to suppress log file creation.");
[1032]112    SetConfigValue(ogreLogLevelTrivial_ , 5).description("Corresponding orxonox debug level for ogre Trivial");
113    SetConfigValue(ogreLogLevelNormal_  , 4).description("Corresponding orxonox debug level for ogre Normal");
[1214]114    SetConfigValue(ogreLogLevelCritical_, 2).description("Corresponding orxonox debug level for ogre Critical");
115
116    TclBind::getInstance().setDataPath(this->dataPath_);
[1021]117  }
118
[1024]119  /**
120    @brief Creates the Ogre Root object and sets up the ogre log.
121  */
[612]122  void GraphicsEngine::setup()
123  {
124    //TODO: Check if file exists (maybe not here)
125/*#ifndef OGRE_STATIC_LIB
[1052]126    root_ = new Ogre::Root(configPath_ + "plugins.cfg", configPath_ + "ogre.cfg",
[612]127                     configPath_ + "Ogre.log");
128#else
[1052]129    root_ = new Ogre::Root(NULL, configPath_ + "ogre.cfg", configPath_ + "Ogre.log");
[612]130#endif*/
[1021]131#if ORXONOX_COMPILER == ORXONOX_COMPILER_MSVC && defined(_DEBUG)
[715]132    std::string plugin_filename = "plugins_d.cfg";
[679]133#else
[715]134    std::string plugin_filename = "plugins.cfg";
[679]135#endif
[1024]136
137    // create a logManager
[1062]138    Ogre::LogManager *logger;
139                if (Ogre::LogManager::getSingletonPtr() == 0)
140                        logger = new Ogre::LogManager();
[1024]141    else
[1062]142      logger = Ogre::LogManager::getSingletonPtr();
[1032]143    COUT(4) << "*** GraphicsEngine: Ogre LogManager created/assigned" << std::endl;
[1024]144
145    // create our own log that we can listen to
[1062]146    Ogre::Log *myLog;
[1024]147    if (this->ogreLogfile_ == "")
148      myLog = logger->createLog("ogre.log", true, false, true);
149    else
150      myLog = logger->createLog(this->ogreLogfile_, true, false, false);
[1032]151    COUT(4) << "*** GraphicsEngine: Ogre Log created" << std::endl;
[1024]152
[1062]153    myLog->setLogDetail(Ogre::LL_BOREME);
154    myLog->addListener(this);
[1024]155
156    // Root will detect that we've already created a Log
[1032]157    COUT(4) << "*** GraphicsEngine: Creating Ogre Root..." << std::endl;
[1052]158    root_ = new Ogre::Root(plugin_filename);
[1032]159    COUT(4) << "*** GraphicsEngine: Creating Ogre Root done" << std::endl;
[612]160  }
161
162  /**
163   * @return scene manager
164   */
[1052]165  Ogre::SceneManager* GraphicsEngine::getSceneManager()
[612]166  {
167    if(!scene_)
168    {
[1052]169      scene_ = root_->createSceneManager(Ogre::ST_GENERIC, "Default SceneManager");
[612]170      COUT(3) << "Info: Created SceneMan: " << scene_ << std::endl;
171    }
172    return scene_;
173  }
174
[1021]175  bool GraphicsEngine::load(std::string dataPath)
[612]176  {
[1021]177    // temporary overwrite of dataPath, change ini file for permanent change
178    if( dataPath != "" )
[1024]179      dataPath_ = dataPath + "/";
[612]180    loadRessourceLocations(this->dataPath_);
181    if (!root_->restoreConfig() && !root_->showConfigDialog())
182      return false;
183    return true;
184  }
185
[1021]186  void GraphicsEngine::initialise()
[612]187  {
[1021]188    this->renderWindow_ = root_->initialise(true, "OrxonoxV2");
[1214]189    Ogre::WindowEventUtilities::addWindowEventListener(this->renderWindow_, this);
[1052]190    Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5);
[1021]191    //TODO: Do NOT load all the groups, why are we doing that? And do we really do that? initialise != load...
[1052]192    Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
[612]193  }
194
[715]195  void GraphicsEngine::loadRessourceLocations(std::string dataPath)
[612]196  {
197    //TODO: Specify layout of data file and maybe use xml-loader
198    //TODO: Work with ressource groups (should be generated by a special loader)
199    // Load resource paths from data file using configfile ressource type
[1052]200    Ogre::ConfigFile cf;
[612]201    cf.load(dataPath + "resources.cfg");
202
203    // Go through all sections & settings in the file
[1052]204    Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
[612]205
[715]206    std::string secName, typeName, archName;
[612]207    while (seci.hasMoreElements())
208    {
209      secName = seci.peekNextKey();
[1052]210      Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
211      Ogre::ConfigFile::SettingsMultiMap::iterator i;
[612]212      for (i = settings->begin(); i != settings->end(); ++i)
213      {
214        typeName = i->first; // for instance "FileSystem" or "Zip"
215        archName = i->second; // name (and location) of archive
216
[1052]217        Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
[715]218                                           std::string(dataPath + archName),
[612]219                                           typeName, secName);
220      }
221    }
222  }
223
[1021]224  /**
225    Returns the window handle of the render window.
226    At least the InputHandler uses this to create the OIS::InputManager
227    @return The window handle of the render window
228  */
229  size_t GraphicsEngine::getWindowHandle()
230  {
231    if (this->renderWindow_)
232    {
[1024]233      size_t windowHnd = 0;
[1032]234      this->renderWindow_->getCustomAttribute("WINDOW", &windowHnd);
[1024]235      return windowHnd;
236    }
[1021]237    else
238      return 0;
239  }
[612]240
[1021]241  /**
242    Get the width of the current render window
243    @return The width of the current render window
244  */
245  int GraphicsEngine::getWindowWidth() const
246  {
247    if (this->renderWindow_)
248      return this->renderWindow_->getWidth();
249    else
250      return 0;
251  }
252
253  /**
254    Get the height of the current render window
255    @return The height of the current render window
256  */
257  int GraphicsEngine::getWindowHeight() const
258  {
259    if (this->renderWindow_)
260      return this->renderWindow_->getHeight();
261    else
262      return 0;
263  }
264
[1024]265  /**
266    @brief Method called by the LogListener interface from Ogre.
267    We use it to capture Ogre log messages and handle it ourselves.
268    @param message The message to be logged
269    @param lml The message level the log is using
270    @param maskDebug If we are printing to the console or not
271    @param logName the name of this log (so you can have several listeners
272                   for different logs, and identify them)
273  */
274  void GraphicsEngine::messageLogged(const std::string& message,
[1052]275    Ogre::LogMessageLevel lml, bool maskDebug, const std::string &logName)
[1024]276  {
277    int orxonoxLevel;
278    switch (lml)
279    {
[1052]280      case Ogre::LML_TRIVIAL:
[1024]281        orxonoxLevel = this->ogreLogLevelTrivial_;
282        break;
[1052]283      case Ogre::LML_NORMAL:
[1024]284        orxonoxLevel = this->ogreLogLevelNormal_;
285        break;
[1052]286      case Ogre::LML_CRITICAL:
[1024]287        orxonoxLevel = this->ogreLogLevelCritical_;
288        break;
289      default:
290        orxonoxLevel = 0;
291    }
292    OutputHandler::getOutStream().setOutputLevel(orxonoxLevel)
293        << "*** Ogre: " << message << std::endl;
294  }
[1214]295
296    void GraphicsEngine::windowMoved(Ogre::RenderWindow *rw){
297        int w = rw->getWidth();
298        int h = rw->getHeight();
299        InputManager::getSingleton().setWindowExtents(w, h);
300    }
301
302    void GraphicsEngine::windowResized(Ogre::RenderWindow *rw){
303        int w = rw->getWidth();
304        int h = rw->getHeight();
305        InputManager::getSingleton().setWindowExtents(w, h);
306    }
307
308    void GraphicsEngine::windowFocusChanged(Ogre::RenderWindow *rw){
309        int w = rw->getWidth();
310        int h = rw->getHeight();
311        InputManager::getSingleton().setWindowExtents(w, h);
312    }
[612]313}
Note: See TracBrowser for help on using the repository browser.