Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/console/src/core/InputManager.cc @ 1322

Last change on this file since 1322 was 1322, checked in by landauf, 16 years ago

The InGameConsole is now using the new Shell. There's a clear separation between the two classes: InGameConsole implements all graphical parts of the console (and has a tick), while Shell handles the internal actions (like listening on input and output changes). That's why InGameConsole has no longer it's own InputBuffer and doesn't care about command-executing or anything else.

There are currently three new features:

  • Every output through COUT(level) is now visible in the InGameConsole, provided the configured output-level for the shell matches. default: 1 (only forced output and errors)
  • The cursor in the input-line is movable with the left and right arrow keys (home and end works too)
  • You can scroll through all output-lines by pressing page up and page down

There's another feature to come, providing a command history, accessible with up and down arrow keys, but I couldn't finish it yet, because there's still a bug, causing Orxonox to scroll through the entire memory - that's maybe a bit too much history ;)

File size: 7.6 KB
RevLine 
[918]1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
[1056]3 *                    > www.orxonox.net <
[918]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:
[934]25 *      ...
[918]26 *
27 */
[973]28
[918]29/**
30 @file
31 @brief Implementation of a little Input handler that distributes everything
32        coming from OIS.
33 */
34
[1062]35#include "InputManager.h"
36#include "CoreIncludes.h"
37#include "Debug.h"
[922]38#include "InputEventListener.h"
[1022]39#include "InputHandler.h"
[1066]40#include "InputBuffer.h"
[1084]41#include "ConsoleCommand.h"
[918]42
43namespace orxonox
44{
[1084]45  ConsoleCommand(InputManager, setInputMode, AccessLevel::Admin, true).setDefaultValue(0, IM_INGAME);
46
[919]47  /**
48    @brief Constructor only resets the pointer values to 0.
49  */
[973]50  InputManager::InputManager() :
[1034]51      inputSystem_(0), keyboard_(0), mouse_(0),
[1022]52      currentMode_(IM_UNINIT), setMode_(IM_UNINIT),
[1034]53      handlerGUI_(0), handlerBuffer_(0), handlerGame_(0)
[918]54  {
[1089]55    RegisterObject(InputManager);
[918]56  }
57
[919]58  /**
[929]59    @brief Destructor only called at the end of the program
60  */
[973]61  InputManager::~InputManager()
[929]62  {
[1035]63    this->destroy();
[929]64  }
65
66  /**
[973]67    @brief The one instance of the InputManager is stored in this function.
[1035]68    @return A reference to the only instance of the InputManager
[919]69  */
[1035]70  InputManager& InputManager::getSingleton()
[919]71  {
[1035]72    static InputManager theOnlyInstance;
73    return theOnlyInstance;
[919]74  }
75
76  /**
[922]77    @brief Creates the OIS::InputMananger, the keyboard and the mouse and
78           assigns the key bindings.
[919]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  */
[973]83  bool InputManager::initialise(size_t windowHnd, int windowWidth, int windowHeight)
[919]84  {
[934]85    if (!this->inputSystem_)
[918]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
[928]95#if defined OIS_LINUX_PLATFORM
96      paramList.insert(std::make_pair(std::string("XAutoRepeatOn"), std::string("true")));
97#endif
98
[934]99      try
[918]100      {
[934]101        // Create inputsystem
102        inputSystem_ = OIS::InputManager::createInputSystem(paramList);
[973]103        COUT(ORX_DEBUG) << "*** InputManager: Created OIS input system" << std::endl;
[918]104
[940]105        // create a keyboard. If none are available the exception is caught.
106        keyboard_ = static_cast<OIS::Keyboard*>(inputSystem_->createInputObject(OIS::OISKeyboard, true));
[1322]107        COUT(ORX_DEBUG) << "*** InputManager: Created OIS keyboard" << std::endl;
108
109        if (this->handlerBuffer_)
110            this->handlerBuffer_->setKeyboard(this->keyboard_);
[918]111
[940]112        // create a mouse. If none are available the exception is caught.
113        mouse_ = static_cast<OIS::Mouse*>(inputSystem_->createInputObject(OIS::OISMouse, true));
[1322]114        COUT(ORX_DEBUG) << "*** InputManager: Created OIS mouse" << std::endl;
[934]115
[940]116        // Set mouse region
117        this->setWindowExtents(windowWidth, windowHeight);
[918]118      }
[934]119      catch (OIS::Exception ex)
120      {
121        // something went wrong with the initialisation
[944]122        COUT(ORX_ERROR) << "Error: Failed creating an input system/keyboard/mouse. Message: \"" << ex.eText << "\"" << std::endl;
[934]123        this->inputSystem_ = 0;
124        return false;
125      }
[918]126    }
[922]127
[1022]128    // create the handlers
129    this->handlerGUI_ = new InputHandlerGUI();
130    this->handlerGame_ = new InputHandlerGame();
[1066]131    //this->handlerBuffer_ = new InputBuffer();
[1022]132    this->handlerGame_->loadBindings();
133
134    /*COUT(ORX_DEBUG) << "*** InputManager: Loading key bindings..." << std::endl;
[922]135    // load the key bindings
136    InputEvent empty = {0, false, 0, 0, 0};
137    for (int i = 0; i < this->numberOfKeys_; i++)
138      this->bindingsKeyPressed_[i] = empty;
139
140    //assign 'abort' to the escape key
141    this->bindingsKeyPressed_[(int)OIS::KC_ESCAPE].id = 1;
[1022]142    COUT(ORX_DEBUG) << "*** InputManager: Loading done." << std::endl;*/
[934]143
144    return true;
[918]145  }
146
[919]147  /**
[1035]148    @brief Destroys all the created input devices and handlers.
[928]149  */
[1035]150  void InputManager::destroy()
[928]151  {
[1035]152    COUT(ORX_DEBUG) << "*** InputManager: Destroying ..." << std::endl;
[930]153    if (this->mouse_)
154      this->inputSystem_->destroyInputObject(mouse_);
155    if (this->keyboard_)
156      this->inputSystem_->destroyInputObject(keyboard_);
157    if (this->inputSystem_)
[929]158      OIS::InputManager::destroyInputSystem(this->inputSystem_);
[928]159
[930]160    this->mouse_         = 0;
161    this->keyboard_      = 0;
162    this->inputSystem_   = 0;
[1035]163
164    if (this->handlerBuffer_)
165      delete this->handlerBuffer_;
166    if (this->handlerGame_)
167      delete this->handlerGame_;
168    if (this->handlerGUI_)
169      delete this->handlerGUI_;
170
171    this->handlerBuffer_ = 0;
172    this->handlerGame_   = 0;
173    this->handlerGUI_    = 0;
174
[973]175    COUT(ORX_DEBUG) << "*** InputManager: Destroying done." << std::endl;
[928]176  }
177
178  /**
[973]179    @brief Updates the InputManager
[919]180    @param dt Delta time
181  */
[973]182  void InputManager::tick(float dt)
[918]183  {
[1022]184    // reset the game if it has changed
185    if (this->currentMode_ != this->setMode_)
186    {
187      switch (this->setMode_)
188      {
189      case IM_GUI:
190        this->mouse_->setEventCallback(this->handlerGUI_);
191        this->keyboard_->setEventCallback(this->handlerGUI_);
192        break;
193      case IM_INGAME:
194        this->mouse_->setEventCallback(this->handlerGame_);
195        this->keyboard_->setEventCallback(this->handlerGame_);
196        break;
197      case IM_KEYBOARD:
198        this->mouse_->setEventCallback(this->handlerGame_);
199        this->keyboard_->setEventCallback(this->handlerBuffer_);
200        break;
201      case IM_UNINIT:
202        this->mouse_->setEventCallback(0);
203        this->keyboard_->setEventCallback(0);
204        break;
205      }
206      this->currentMode_ = this->setMode_;
207    }
208
[918]209    // capture all the input. That calls the event handlers.
210    if (mouse_)
211      mouse_->capture();
212
213    if (keyboard_)
214      keyboard_->capture();
215  }
216
[919]217  /**
218    @brief Adjusts the mouse window metrics.
219    This method has to be called every time the size of the window changes.
220    @param width The new width of the render window
221    @param height the new height of the render window
222  */
[973]223  void InputManager::setWindowExtents(int width, int height)
[918]224  {
225    // Set mouse region (if window resizes, we should alter this to reflect as well)
226    const OIS::MouseState &mouseState = mouse_->getMouseState();
227    mouseState.width  = width;
228    mouseState.height = height;
229  }
230
[919]231  /**
[1022]232    @brief Sets the input mode to either GUI, inGame or Buffer
233    @param mode The new input mode
234    @remark Only has an affect if the mode actually changes
[922]235  */
[1084]236  void InputManager::setInputMode(int mode)
[922]237  {
[1084]238    if (mode > 0 && mode < 4)
239      getSingleton().setMode_ = (InputMode)mode;
[922]240  }
241
242  /**
[1022]243    @brief Returns the current input handling method
244    @return The current input mode.
[919]245  */
[1022]246  InputMode InputManager::getInputMode()
[918]247  {
[1022]248    return this->currentMode_;
[918]249  }
250
[1066]251  void InputManager::feedInputBuffer(InputBuffer* buffer)
252  {
253    this->handlerBuffer_ = buffer;
254  }
255
256
[918]257}
Note: See TracBrowser for help on using the repository browser.