Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/resource/src/orxonox/gamestates/GSGraphics.cc @ 3355

Last change on this file since 3355 was 3355, checked in by rgrieder, 15 years ago

Loading and unloading graphics automatically: As soon as a GameState requires graphics (defined at the GameState declaration with a bool) it gets loaded. And vice versa.

  • Property svn:eol-style set to native
File size: 5.2 KB
RevLine 
[1661]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 *      Reto Grieder
24 *   Co-authors:
[2896]25 *      Benjamin Knecht
[1661]26 *
27 */
28
[2896]29/**
[3196]30@file
31@brief
32    Implementation of Graphics GameState class.
[2896]33 */
34
[1661]35#include "GSGraphics.h"
36
[3327]37#include "util/Convert.h"
[2896]38#include "core/Clock.h"
[3327]39#include "core/CommandExecutor.h"
[1662]40#include "core/ConsoleCommand.h"
[2896]41#include "core/Core.h"
42#include "core/Game.h"
[3346]43#include "core/GUIManager.h"
[1661]44#include "core/input/InputManager.h"
[1788]45#include "core/input/KeyBinder.h"
[3327]46#include "core/input/InputState.h"
[2087]47#include "core/Loader.h"
48#include "core/XMLFile.h"
[1661]49#include "overlays/console/InGameConsole.h"
[3196]50#include "sound/SoundManager.h"
[1686]51
[3346]52// HACK:
53#include "overlays/map/Map.h"
54
[1661]55namespace orxonox
56{
[3349]57    DeclareGameState(GSGraphics, "graphics", false, true);
[2896]58
[3355]59    GSGraphics::GSGraphics(const GameStateInfo& info)
60        : GameState(info)
[1661]61        , console_(0)
[3196]62        , soundManager_(0)
[1788]63        , masterKeyBinder_(0)
[2896]64        , masterInputState_(0)
[2087]65        , debugOverlay_(0)
[1661]66    {
67    }
68
69    GSGraphics::~GSGraphics()
70    {
71    }
72
[2896]73    /**
74    @brief
75        This function is called when we enter this game state.
76
77        Since graphics is very important for our game this function does quite a lot:
78        \li starts graphics manager
79        \li loads debug overlay
80        \li manages render window
81        \li creates input manager
82        \li loads master key bindings
[3196]83        \li loads the SoundManager
[2896]84        \li loads ingame console
85        \li loads GUI interface (GUIManager)
86        \li creates console command to toggle GUI
87    */
88    void GSGraphics::activate()
[1661]89    {
[2087]90        // load debug overlay
91        COUT(3) << "Loading Debug Overlay..." << std::endl;
[3349]92        this->debugOverlay_ = new XMLFile(Core::getMediaPathString() + "overlay/debug.oxo");
[2087]93        Loader::open(debugOverlay_);
[2896]94        // load master key bindings
[3327]95        masterInputState_ = InputManager::getInstance().createInputState("master", true);
[2103]96        masterKeyBinder_ = new KeyBinder();
[2710]97        masterKeyBinder_->loadBindings("masterKeybindings.ini");
[2896]98        masterInputState_->setKeyHandler(masterKeyBinder_);
[1661]99
[3196]100        // Load the SoundManager
101        soundManager_ = new SoundManager();
102
[1661]103        // Load the InGameConsole
104        console_ = new InGameConsole();
[3327]105        console_->initialise();
[1661]106
[2896]107        // add console command to toggle GUI
108        FunctorMember<GSGraphics>* functor = createFunctor(&GSGraphics::toggleGUI);
109        functor->setObject(this);
110        this->ccToggleGUI_ = createConsoleCommand(functor, "toggleGUI");
111        CommandExecutor::addConsoleCommandShortcut(this->ccToggleGUI_);
112
113        // enable master input
[3327]114        InputManager::getInstance().enterState("master");
[1661]115    }
116
[2896]117    /**
118    @brief
119        This function is called when the game state is left
120
121        Created references, input states and console commands are deleted.
122    */
123    void GSGraphics::deactivate()
[1661]124    {
[2928]125/*
[2896]126        if (this->ccToggleGUI_)
127        {
128            delete this->ccToggleGUI_;
129            this->ccToggleGUI_ = 0;
130        }
[2928]131*/
[2662]132
[2896]133        masterInputState_->setHandler(0);
[3327]134        InputManager::getInstance().destroyState("master");
[2896]135        delete this->masterKeyBinder_;
[1878]136
[1662]137        delete this->console_;
[1661]138
[2087]139        Loader::unload(this->debugOverlay_);
140        delete this->debugOverlay_;
141
[3196]142        delete this->soundManager_;
143
[3349]144        // HACK: (destroys a resource smart pointer)
[3346]145        Map::hackDestroyMap();
[2896]146    }
[1824]147
[2896]148    /**
149    @brief
150        Toggles the visibility of the current GUI
[1824]151
[2896]152        This function just executes a Lua function in the main script of the GUI by accessing the GUIManager.
153        For more details on this function check out the Lua code.
154    */
155    void GSGraphics::toggleGUI()
156    {
[3280]157        GUIManager::getInstance().executeCode("toggleGUI()");
[1661]158    }
159
[1662]160    /**
[2662]161    @note
[1662]162        A note about the Ogre::FrameListener: Even though we don't use them,
163        they still get called. However, the delta times are not correct (except
164        for timeSinceLastFrame, which is the most important). A little research
165        as shown that there is probably only one FrameListener that doesn't even
166        need the time. So we shouldn't run into problems.
167    */
[2896]168    void GSGraphics::update(const Clock& time)
[1661]169    {
[2896]170        if (this->getActivity().topState)
[2087]171        {
[2896]172            // This state can not 'survive' on its own.
173            // Load a user interface therefore
174            Game::getInstance().requestState("mainMenu");
[2087]175        }
176
[2896]177        this->console_->update(time);
[1661]178    }
179}
Note: See TracBrowser for help on using the repository browser.