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
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 *      Reto Grieder
24 *   Co-authors:
25 *      Benjamin Knecht
26 *
27 */
28
29/**
30@file
31@brief
32    Implementation of Graphics GameState class.
33 */
34
35#include "GSGraphics.h"
36
37#include "util/Convert.h"
38#include "core/Clock.h"
39#include "core/CommandExecutor.h"
40#include "core/ConsoleCommand.h"
41#include "core/Core.h"
42#include "core/Game.h"
43#include "core/GUIManager.h"
44#include "core/input/InputManager.h"
45#include "core/input/KeyBinder.h"
46#include "core/input/InputState.h"
47#include "core/Loader.h"
48#include "core/XMLFile.h"
49#include "overlays/console/InGameConsole.h"
50#include "sound/SoundManager.h"
51
52// HACK:
53#include "overlays/map/Map.h"
54
55namespace orxonox
56{
57    DeclareGameState(GSGraphics, "graphics", false, true);
58
59    GSGraphics::GSGraphics(const GameStateInfo& info)
60        : GameState(info)
61        , console_(0)
62        , soundManager_(0)
63        , masterKeyBinder_(0)
64        , masterInputState_(0)
65        , debugOverlay_(0)
66    {
67    }
68
69    GSGraphics::~GSGraphics()
70    {
71    }
72
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
83        \li loads the SoundManager
84        \li loads ingame console
85        \li loads GUI interface (GUIManager)
86        \li creates console command to toggle GUI
87    */
88    void GSGraphics::activate()
89    {
90        // load debug overlay
91        COUT(3) << "Loading Debug Overlay..." << std::endl;
92        this->debugOverlay_ = new XMLFile(Core::getMediaPathString() + "overlay/debug.oxo");
93        Loader::open(debugOverlay_);
94        // load master key bindings
95        masterInputState_ = InputManager::getInstance().createInputState("master", true);
96        masterKeyBinder_ = new KeyBinder();
97        masterKeyBinder_->loadBindings("masterKeybindings.ini");
98        masterInputState_->setKeyHandler(masterKeyBinder_);
99
100        // Load the SoundManager
101        soundManager_ = new SoundManager();
102
103        // Load the InGameConsole
104        console_ = new InGameConsole();
105        console_->initialise();
106
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
114        InputManager::getInstance().enterState("master");
115    }
116
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()
124    {
125/*
126        if (this->ccToggleGUI_)
127        {
128            delete this->ccToggleGUI_;
129            this->ccToggleGUI_ = 0;
130        }
131*/
132
133        masterInputState_->setHandler(0);
134        InputManager::getInstance().destroyState("master");
135        delete this->masterKeyBinder_;
136
137        delete this->console_;
138
139        Loader::unload(this->debugOverlay_);
140        delete this->debugOverlay_;
141
142        delete this->soundManager_;
143
144        // HACK: (destroys a resource smart pointer)
145        Map::hackDestroyMap();
146    }
147
148    /**
149    @brief
150        Toggles the visibility of the current GUI
151
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    {
157        GUIManager::getInstance().executeCode("toggleGUI()");
158    }
159
160    /**
161    @note
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    */
168    void GSGraphics::update(const Clock& time)
169    {
170        if (this->getActivity().topState)
171        {
172            // This state can not 'survive' on its own.
173            // Load a user interface therefore
174            Game::getInstance().requestState("mainMenu");
175        }
176
177        this->console_->update(time);
178    }
179}
Note: See TracBrowser for help on using the repository browser.