Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/input/src/core/InputManager.cc @ 1155

Last change on this file since 1155 was 1154, checked in by rgrieder, 17 years ago
  • updated input branch to trunk state. Only Input system files should differ now.
  • this revision doesn't even compile, its just an 'svn save'
File size: 7.0 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 *      ...
26 *
27 */
28
29/**
30 @file
31 @brief Implementation of a little Input handler that distributes everything
32        coming from OIS.
33 */
34
35#include "InputManager.h"
36#include "CoreIncludes.h"
37#include "Debug.h"
38#include "InputEventListener.h"
39#include "InputHandler.h"
40#include "InputBuffer.h"
41#include "ConsoleCommand.h"
42
43namespace orxonox
44{
45  ConsoleCommand(InputManager, setInputMode, AccessLevel::Admin, true).setDefaultValue(0, IM_INGAME);
46
47  /**
48    @brief Constructor only resets the pointer values to 0.
49  */
50  InputManager::InputManager() :
51      inputSystem_(0), keyboard_(0), mouse_(0),
52      currentMode_(IM_UNINIT), setMode_(IM_UNINIT),
53      handlerGUI_(0), handlerBuffer_(0), handlerGame_(0)
54  {
55    RegisterObject(InputManager);
56  }
57
58  /**
59    @brief Destructor only called at the end of the program
60  */
61  InputManager::~InputManager()
62  {
63    this->destroy();
64  }
65
66  /**
67    @brief The one instance of the InputManager is stored in this function.
68    @return A reference to the only instance of the InputManager
69  */
70  InputManager& InputManager::getSingleton()
71  {
72    static InputManager theOnlyInstance;
73    return theOnlyInstance;
74  }
75
76  /**
77    @brief Creates the OIS::InputMananger, the keyboard and the mouse and
78           assigns the key bindings.
79    @param windowHnd The window handle of the render window
80    @param windowWidth The width of the render window
81    @param windowHeight The height of the render window
82  */
83  bool InputManager::initialise(size_t windowHnd, int windowWidth, int windowHeight)
84  {
85    if (!this->inputSystem_)
86    {
87      // Setup basic variables
88      OIS::ParamList paramList;
89      std::ostringstream windowHndStr;
90
91      // Fill parameter list
92      windowHndStr << (unsigned int)windowHnd;
93      paramList.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
94
95//#if defined OIS_LINUX_PLATFORM
96//      paramList.insert(std::make_pair(std::string("XAutoRepeatOn"), std::string("true")));
97//#endif
98
99      try
100      {
101        // Create inputsystem
102        inputSystem_ = OIS::InputManager::createInputSystem(paramList);
103        COUT(ORX_DEBUG) << "*** InputManager: Created OIS input system" << std::endl;
104
105        // create a keyboard. If none are available the exception is caught.
106        keyboard_ = static_cast<OIS::Keyboard*>(inputSystem_->createInputObject(OIS::OISKeyboard, true));
107        COUT(ORX_DEBUG) << "*** InputManager: Created OIS mouse" << std::endl;
108
109        // create a mouse. If none are available the exception is caught.
110        mouse_ = static_cast<OIS::Mouse*>(inputSystem_->createInputObject(OIS::OISMouse, true));
111        COUT(ORX_DEBUG) << "*** InputManager: Created OIS keyboard" << std::endl;
112
113        // Set mouse region
114        this->setWindowExtents(windowWidth, windowHeight);
115      }
116      catch (OIS::Exception ex)
117      {
118        // something went wrong with the initialisation
119        COUT(ORX_ERROR) << "Error: Failed creating an input system/keyboard/mouse. Message: \"" << ex.eText << "\"" << std::endl;
120        this->inputSystem_ = 0;
121        return false;
122      }
123    }
124
125    // create the handlers
126    this->handlerGUI_ = new InputHandlerGUI();
127    this->handlerGUI_->initialise();
128    this->handlerGame_ = new InputHandlerGame();
129    this->handlerGame_->initialise();
130
131    COUT(ORX_DEBUG) << "*** InputManager: Loading done." << std::endl;*/
132
133    return true;
134  }
135
136  /**
137    @brief Destroys all the created input devices and handlers.
138  */
139  void InputManager::destroy()
140  {
141    COUT(ORX_DEBUG) << "*** InputManager: Destroying ..." << std::endl;
142    if (this->mouse_)
143      this->inputSystem_->destroyInputObject(mouse_);
144    if (this->keyboard_)
145      this->inputSystem_->destroyInputObject(keyboard_);
146    if (this->inputSystem_)
147      OIS::InputManager::destroyInputSystem(this->inputSystem_);
148
149    this->mouse_         = 0;
150    this->keyboard_      = 0;
151    this->inputSystem_   = 0;
152
153    if (this->handlerGame_)
154      delete this->handlerGame_;
155    if (this->handlerGUI_)
156      delete this->handlerGUI_;
157
158    this->handlerGame_   = 0;
159    this->handlerGUI_    = 0;
160
161    COUT(ORX_DEBUG) << "*** InputManager: Destroying done." << std::endl;
162  }
163
164  /**
165    @brief Updates the InputManager
166    @param dt Delta time
167  */
168  void InputManager::tick(float dt)
169  {
170    // reset the game if it has changed
171    if (this->currentMode_ != this->setMode_)
172    {
173      switch (this->setMode_)
174      {
175      case IM_GUI:
176        this->mouse_->setEventCallback(this->handlerGUI_);
177        this->keyboard_->setEventCallback(this->handlerGUI_);
178        break;
179      case IM_INGAME:
180        this->mouse_->setEventCallback(this->handlerGame_);
181        this->keyboard_->setEventCallback(this->handlerGame_);
182        break;
183      case IM_UNINIT:
184        this->mouse_->setEventCallback(0);
185        this->keyboard_->setEventCallback(0);
186        break;
187      }
188      this->currentMode_ = this->setMode_;
189    }
190
191    // capture all the input. That calls the event handlers.
192    if (mouse_)
193      mouse_->capture();
194    if (keyboard_)
195      keyboard_->capture();
196
197    // Give the listeners the chance to do additional calculations
198    this->currentHandler_->tick(dt);
199  }
200
201  /**
202    @brief Adjusts the mouse window metrics.
203    This method has to be called every time the size of the window changes.
204    @param width The new width of the render window
205    @param height the new height of the render window
206  */
207  void InputManager::setWindowExtents(int width, int height)
208  {
209    // Set mouse region (if window resizes, we should alter this to reflect as well)
210    const OIS::MouseState &mouseState = mouse_->getMouseState();
211    mouseState.width  = width;
212    mouseState.height = height;
213  }
214
215  /**
216    @brief Sets the input mode to either GUI, inGame or Buffer
217    @param mode The new input mode
218    @remark Only has an affect if the mode actually changes
219  */
220  void InputManager::setInputMode(int mode)
221  {
222    if (mode > 0 && mode < 4)
223      getSingleton().setMode_ = (InputMode)mode;
224  }
225
226  /**
227    @brief Returns the current input handling method
228    @return The current input mode.
229  */
230  InputMode InputManager::getInputMode()
231  {
232    return this->currentMode_;
233  }
234
235  void InputManager::feedInputBuffer(InputBuffer* buffer)
236  {
237    this->handlerBuffer_ = buffer;
238  }
239
240
241}
Note: See TracBrowser for help on using the repository browser.