Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/merge/src/core/InputManager.cc @ 1273

Last change on this file since 1273 was 1273, checked in by rgrieder, 16 years ago
  • fixed the visual problem with overlays: They're now correctly displayed (Problem was RTT Mode in ogre.cfg which I have changed half a year ago. hope it does't cause any segfaults now…)
  • removed false debug output in InputManager
  • removed 2 gcc warnings
File size: 37.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/**
[1219]30  @file
31  @brief Implementation of the InputManager that captures all the input from OIS
[1272]32         and redirects it to handlers.
[918]33 */
34
[1062]35#include "InputManager.h"
36#include "CoreIncludes.h"
37#include "Debug.h"
[1219]38#include "InputBuffer.h"
[1022]39#include "InputHandler.h"
[918]40
41namespace orxonox
42{
[1219]43  // ###############################
44  // ###    Internal Methods     ###
45  // ###############################
46  // ###############################
[1084]47
[919]48  /**
[1219]49    @brief Constructor only sets member fields to initial zero values
50           and registers the class in the class hierarchy.
[919]51  */
[973]52  InputManager::InputManager() :
[1034]53      inputSystem_(0), keyboard_(0), mouse_(0),
[1272]54      joySticksSize_(0),
55      state_(IS_UNINIT), stateRequest_(IS_UNINIT),
56      keyboardModifiers_(0)
[918]57  {
[1089]58    RegisterObject(InputManager);
[929]59  }
60
61  /**
[973]62    @brief The one instance of the InputManager is stored in this function.
[1035]63    @return A reference to the only instance of the InputManager
[919]64  */
[1219]65  InputManager& InputManager::_getSingleton()
[919]66  {
[1035]67    static InputManager theOnlyInstance;
68    return theOnlyInstance;
[919]69  }
70
71  /**
[1219]72    @brief Destructor only called at the end of the program, after main.
73  */
74  InputManager::~InputManager()
75  {
76    _destroy();
77  }
78
79  /**
80    @brief Creates the OIS::InputMananger, the keyboard, the mouse and
81           the joysticks and assigns the key bindings.
[919]82    @param windowHnd The window handle of the render window
83    @param windowWidth The width of the render window
84    @param windowHeight The height of the render window
85  */
[1272]86  bool InputManager::_initialise(const size_t windowHnd, int windowWidth, int windowHeight,
87        bool createKeyboard, bool createMouse, bool createJoySticks)
[919]88  {
[1219]89    if (state_ == IS_UNINIT)
[918]90    {
[1268]91      CCOUT(3) << "Initialising Input System..." << std::endl;
[1219]92      CCOUT(ORX_DEBUG) << "Initialising OIS components..." << std::endl;
93
[918]94      OIS::ParamList paramList;
95      std::ostringstream windowHndStr;
96
97      // Fill parameter list
98      windowHndStr << (unsigned int)windowHnd;
99      paramList.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
100
[1219]101//#if defined OIS_LINUX_PLATFORM
102//      paramList.insert(std::make_pair(std::string("XAutoRepeatOn"), std::string("true")));
103//#endif
[928]104
[934]105      try
[918]106      {
[934]107        inputSystem_ = OIS::InputManager::createInputSystem(paramList);
[1219]108        CCOUT(ORX_DEBUG) << "Created OIS input system" << std::endl;
[918]109      }
[934]110      catch (OIS::Exception ex)
111      {
[1219]112        CCOUT(ORX_ERROR) << "Error: Failed creating an OIS input system."
113            << "OIS message: \"" << ex.eText << "\"" << std::endl;
114        inputSystem_ = 0;
[934]115        return false;
116      }
[1219]117
118      if (createKeyboard)
119        _initialiseKeyboard();
120
121      if (createMouse)
122        _initialiseMouse();
123
124      if (createJoySticks)
125        _initialiseJoySticks();
126
127      // Set mouse/joystick region
128      setWindowExtents(windowWidth, windowHeight);
129
130      state_ = IS_NONE;
131      CCOUT(ORX_DEBUG) << "Initialising OIS components done." << std::endl;
[918]132    }
[1219]133    else
134    {
135      CCOUT(ORX_WARNING) << "Warning: OIS compoments already initialised, skipping" << std::endl;
136    }
[922]137
[1219]138    // InputManager holds the input buffer --> create one and add it.
139    addKeyHandler(new InputBuffer(), "buffer");
[1022]140
[1219]141    KeyBinder* binder = new KeyBinder();
142    binder->loadBindings();
143    addKeyHandler(binder, "keybinder");
144    addMouseHandler(binder, "keybinder");
[1272]145    addJoyStickHandler(binder, "keybinder");
[922]146
[1219]147    // Read all the key bindings and assign them
148    //if (!_loadBindings())
149    //  return false;
[934]150
[1219]151    CCOUT(ORX_DEBUG) << "Initialising complete." << std::endl;
[934]152    return true;
[918]153  }
154
[919]155  /**
[1219]156    @brief Creates a keyboard and sets the event handler.
157    @return False if keyboard stays uninitialised, true otherwise.
[928]158  */
[1219]159  bool InputManager::_initialiseKeyboard()
[928]160  {
[1219]161    if (keyboard_ != 0)
162    {
163      CCOUT(2) << "Warning: Keyboard already initialised, skipping." << std::endl;
164      return true;
165    }
166    try
167    {
168      if (inputSystem_->getNumberOfDevices(OIS::OISKeyboard) > 0)
169      {
170        keyboard_ = (OIS::Keyboard*)inputSystem_->createInputObject(OIS::OISKeyboard, true);
171        // register our listener in OIS.
172        keyboard_->setEventCallback(this);
173        // note: OIS will not detect keys that have already been down when the keyboard was created.
174        CCOUT(ORX_DEBUG) << "Created OIS keyboard" << std::endl;
175        return true;
176      }
177      else
178      {
179        CCOUT(ORX_WARNING) << "Warning: No keyboard found!" << std::endl;
180        return false;
181      }
182    }
183    catch (OIS::Exception ex)
184    {
185      // TODO: Test this output regarding formatting
186      CCOUT(ORX_WARNING) << "Warning: Failed to create an OIS keyboard\n"
187          << "OIS error message: \"" << ex.eText << "\"" << std::endl;
188      keyboard_ = 0;
189      return false;
190    }
191  }
[928]192
[1219]193  /**
194    @brief Creates a mouse and sets the event handler.
195    @return False if mouse stays uninitialised, true otherwise.
196  */
197  bool InputManager::_initialiseMouse()
198  {
199    if (mouse_ != 0)
200    {
201      CCOUT(2) << "Warning: Mouse already initialised, skipping." << std::endl;
202      return true;
203    }
204    try
205    {
206      if (inputSystem_->getNumberOfDevices(OIS::OISMouse) > 0)
207      {
208        mouse_ = static_cast<OIS::Mouse*>(inputSystem_->createInputObject(OIS::OISMouse, true));
209        // register our listener in OIS.
210        mouse_->setEventCallback(this);
211        CCOUT(ORX_DEBUG) << "Created OIS keyboard" << std::endl;
212        return true;
213      }
214      else
215      {
216        CCOUT(ORX_WARNING) << "Warning: No mouse found!" << std::endl;
217        return false;
218      }
219    }
220    catch (OIS::Exception ex)
221    {
222      CCOUT(ORX_WARNING) << "Warning: Failed to create an OIS mouse\n"
223          << "OIS error message: \"" << ex.eText << "\"" << std::endl;
224      mouse_ = 0;
225      return false;
226    }
227  }
[1035]228
[1219]229  /**
230    @brief Creates all joy sticks and sets the event handler.
231    @return False joy stick stay uninitialised, true otherwise.
232  */
233  bool InputManager::_initialiseJoySticks()
234  {
[1272]235    if (joySticksSize_ > 0)
[1219]236    {
237      CCOUT(2) << "Warning: Joy sticks already initialised, skipping." << std::endl;
238      return true;
239    }
240    bool success = false;
241    if (inputSystem_->getNumberOfDevices(OIS::OISJoyStick) > 0)
242    {
243      for (int i = 0; i < inputSystem_->getNumberOfDevices(OIS::OISJoyStick); i++)
244      {
245        try
246        {
247          OIS::JoyStick* stig = static_cast<OIS::JoyStick*>(inputSystem_->createInputObject(OIS::OISJoyStick, true));
248          joySticks_.push_back(stig);
249          // register our listener in OIS.
250          stig->setEventCallback(this);
251          CCOUT(ORX_DEBUG) << "Created OIS joy stick with ID " << stig->getID() << std::endl;
252          success = true;
253        }
254        catch (OIS::Exception ex)
255        {
256          CCOUT(ORX_WARNING) << "Warning: Failed to create OIS joy number" << i << "\n"
257              << "OIS error message: \"" << ex.eText << "\"" << std::endl;
258        }
259      }
260    }
261    else
262    {
263      CCOUT(ORX_WARNING) << "Warning: Joy stick support requested, but no joy stick was found" << std::endl;
264      return false;
265    }
[1272]266    joySticksSize_ = joySticks_.size();
267    activeJoyStickHandlers_.resize(joySticksSize_);
268    joyStickButtonsDown_.resize(joySticksSize_);
[1219]269    return success;
270  }
[1035]271
[1219]272  /**
273    @brief Destroys all the created input devices and sets the InputManager to construction state.
274  */
275  void InputManager::_destroy()
276  {
277    if (state_ != IS_UNINIT)
278    {
[1273]279      CCOUT(ORX_DEBUG) << "Destroying ..." << std::endl;
280
[1219]281      if (keyHandlers_.find("buffer") != keyHandlers_.end())
282        delete keyHandlers_["buffer"];
283
284      if (keyHandlers_.find("keybinder") != keyHandlers_.end())
285        delete keyHandlers_["keybinder"];
286
287      keyHandlers_.clear();
288      mouseHandlers_.clear();
289      joyStickHandlers_.clear();
290
291      _destroyKeyboard();
292      _destroyMouse();
293      _destroyJoySticks();
294
295      // inputSystem_ can never be 0, or else the code is mistaken
296      OIS::InputManager::destroyInputSystem(inputSystem_);
297      inputSystem_ = 0;
298
299      state_ = IS_UNINIT;
[1273]300      CCOUT(ORX_DEBUG) << "Destroying done." << std::endl;
[1219]301    }
[928]302  }
303
304  /**
[1219]305    @brief Destroys the keyboard and sets it to 0.
306  */
307  void InputManager::_destroyKeyboard()
308  {
309    if (keyboard_)
310      // inputSystem_ can never be 0, or else the code is mistaken
311      inputSystem_->destroyInputObject(keyboard_);
312    keyboard_ = 0;
313    activeKeyHandlers_.clear();
314    keysDown_.clear();
315    CCOUT(ORX_DEBUG) << "Keyboard destroyed." << std::endl;
316  }
317
318  /**
319    @brief Destroys the mouse and sets it to 0.
320  */
321  void InputManager::_destroyMouse()
322  {
323    if (mouse_)
324      // inputSystem_ can never be 0, or else the code is mistaken
325      inputSystem_->destroyInputObject(mouse_);
326    mouse_ = 0;
327    activeMouseHandlers_.clear();
328    mouseButtonsDown_.clear();
329    CCOUT(ORX_DEBUG) << "Mouse destroyed." << std::endl;
330  }
331
332  /**
333    @brief Destroys all the joy sticks and resizes the lists to 0.
334  */
335  void InputManager::_destroyJoySticks()
336  {
[1272]337    if (joySticksSize_ > 0)
[1219]338    {
339      // note: inputSystem_ can never be 0, or else the code is mistaken
[1272]340      for (unsigned int i = 0; i < joySticksSize_; i++)
[1219]341        if (joySticks_[i] != 0)
342          inputSystem_->destroyInputObject(joySticks_[i]);
343
344      joySticks_.clear();
[1272]345      joySticksSize_ = 0;
[1219]346      activeJoyStickHandlers_.clear();
347      joyStickButtonsDown_.clear();
348    }
349    CCOUT(ORX_DEBUG) << "Joy sticks destroyed." << std::endl;
350  }
351
352
353  // #################################
354  // ### Private Interface Methods ###
355  // #################################
356  // #################################
357
358  /**
359    @brief Updates the InputManager. Tick is called by Orxonox.
[919]360    @param dt Delta time
361  */
[973]362  void InputManager::tick(float dt)
[918]363  {
[1219]364    if (state_ == IS_UNINIT)
365      return;
366
[1022]367    // reset the game if it has changed
[1219]368    if (state_ != stateRequest_)
[1022]369    {
[1219]370      if (stateRequest_ != IS_CUSTOM)
[1022]371      {
[1219]372        activeKeyHandlers_.clear();
373        activeMouseHandlers_.clear();
[1272]374        for (unsigned int i = 0; i < joySticksSize_; i++)
375          activeJoyStickHandlers_[i].clear();
[1219]376
377        switch (stateRequest_)
378        {
379        case IS_NORMAL:
380          // normal play mode
381          // note: we assume that the handlers exist since otherwise, something's wrong anyway.
382          activeKeyHandlers_.push_back(keyHandlers_["keybinder"]);
383          activeMouseHandlers_.push_back(mouseHandlers_["keybinder"]);
384          activeMouseHandlers_.push_back(mouseHandlers_["SpaceShip"]);
[1272]385          for (unsigned int i = 0; i < joySticksSize_; i++)
386            activeJoyStickHandlers_[i].push_back(joyStickHandlers_["keybinder"]);
[1219]387          break;
388
389        case IS_GUI:
390          // FIXME: do stuff
391          break;
392
393        case IS_CONSOLE:
394          activeMouseHandlers_.push_back(mouseHandlers_["keybinder"]);
[1272]395          activeMouseHandlers_.push_back(mouseHandlers_["SpaceShip"]);
396          for (unsigned int i = 0; i < joySticksSize_; i++)
397            activeJoyStickHandlers_[i].push_back(joyStickHandlers_["keybinder"]);
[1219]398
399          activeKeyHandlers_.push_back(keyHandlers_["buffer"]);
400          break;
401
402        default:
403          break;
404        }
405        state_ = stateRequest_;
406      }
407    }
408
409    // Capture all the input. This calls the event handlers in InputManager.
410    if (mouse_)
411      mouse_->capture();
412    if (keyboard_)
413      keyboard_->capture();
[1272]414    for (unsigned  int i = 0; i < joySticksSize_; i++)
415      joySticks_[i]->capture();
[1219]416
417
418    // call all the handlers for the held key events
[1272]419    for (unsigned int iKey = 0; iKey < keysDown_.size(); iKey++)
420      for (unsigned int iHandler = 0; iHandler < activeKeyHandlers_.size(); iHandler++)
421        activeKeyHandlers_[iHandler]->keyHeld(KeyEvent(keysDown_[iKey], keyboardModifiers_));
[1219]422
423    // call all the handlers for the held mouse button events
[1272]424    for (unsigned int iButton = 0; iButton < mouseButtonsDown_.size(); iButton++)
425      for (unsigned int iHandler = 0; iHandler < activeMouseHandlers_.size(); iHandler++)
426        activeMouseHandlers_[iHandler]->mouseButtonHeld(mouse_->getMouseState(), mouseButtonsDown_[iButton]);
[1219]427
428    // call all the handlers for the held joy stick button events
[1272]429    for (unsigned int iJoyStick  = 0; iJoyStick < joySticksSize_; iJoyStick++)
430      for (unsigned int iButton   = 0; iButton   < joyStickButtonsDown_[iJoyStick].size(); iButton++)
431        for (unsigned int iHandler = 0; iHandler  < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
432          activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickButtonHeld(
433              JoyStickState(joySticks_[iJoyStick]->getJoyStickState(), iJoyStick), joyStickButtonsDown_[iJoyStick][iButton]);
[1219]434  }
435
436  // ###### Key Events ######
437
438  /**
439    @brief Event handler for the keyPressed Event.
440    @param e Event information
441  */
442  bool InputManager::keyPressed(const OIS::KeyEvent &e)
443  {
444    // check whether the key already is in the list (can happen when focus was lost)
[1272]445    unsigned int iKey = 0;
446    while (iKey < keysDown_.size() && keysDown_[iKey].key != (KeyCode::Enum)e.key)
447      iKey++;
448    if (iKey == keysDown_.size())
449      keysDown_.push_back(Key(e));
[1219]450
[1272]451    // update modifiers
452    if(e.key == OIS::KC_RMENU    || e.key == OIS::KC_LMENU)
453      keyboardModifiers_ |= KeyboardModifier::Alt;   // alt key
454    if(e.key == OIS::KC_RCONTROL || e.key == OIS::KC_LCONTROL)
455      keyboardModifiers_ |= KeyboardModifier::Ctrl;  // ctrl key
456    if(e.key == OIS::KC_RSHIFT   || e.key == OIS::KC_LSHIFT)
457      keyboardModifiers_ |= KeyboardModifier::Shift; // shift key
458
[1219]459    for (unsigned int i = 0; i < activeKeyHandlers_.size(); i++)
[1272]460      activeKeyHandlers_[i]->keyPressed(KeyEvent(e, keyboardModifiers_));
[1219]461
462    return true;
463  }
464
465  /**
466    @brief Event handler for the keyReleased Event.
467    @param e Event information
468  */
469  bool InputManager::keyReleased(const OIS::KeyEvent &e)
470  {
471    // remove the key from the keysDown_ list
[1272]472    for (unsigned int iKey = 0; iKey < keysDown_.size(); iKey++)
[1219]473    {
[1272]474      if (keysDown_[iKey].key == (KeyCode::Enum)e.key)
[1219]475      {
[1272]476        keysDown_.erase(keysDown_.begin() + iKey);
[1022]477        break;
[1219]478      }
479    }
480
[1272]481    // update modifiers
482    if(e.key == OIS::KC_RMENU    || e.key == OIS::KC_LMENU)
483      keyboardModifiers_ &= ~KeyboardModifier::Alt;   // alt key
484    if(e.key == OIS::KC_RCONTROL || e.key == OIS::KC_LCONTROL)
485      keyboardModifiers_ &= ~KeyboardModifier::Ctrl;  // ctrl key
486    if(e.key == OIS::KC_RSHIFT   || e.key == OIS::KC_LSHIFT)
487      keyboardModifiers_ &= ~KeyboardModifier::Shift; // shift key
488
[1219]489    for (unsigned int i = 0; i < activeKeyHandlers_.size(); i++)
[1272]490      activeKeyHandlers_[i]->keyReleased(KeyEvent(e, keyboardModifiers_));
[1219]491
492    return true;
493  }
494
495
496  // ###### Mouse Events ######
497
498  /**
499    @brief Event handler for the mouseMoved Event.
500    @param e Event information
501  */
502  bool InputManager::mouseMoved(const OIS::MouseEvent &e)
503  {
[1272]504    // check for actual moved event
505    if (e.state.X.rel != 0 || e.state.Y.rel != 0)
506    {
507      for (unsigned int i = 0; i < activeMouseHandlers_.size(); i++)
508        activeMouseHandlers_[i]->mouseMoved(e.state);
509    }
[1219]510
[1272]511    // check for mouse scrolled event
512    if (e.state.Z.rel != 0)
513    {
514      for (unsigned int i = 0; i < activeMouseHandlers_.size(); i++)
515        activeMouseHandlers_[i]->mouseScrolled(e.state);
516    }
517
[1219]518    return true;
519  }
520
521  /**
522    @brief Event handler for the mousePressed Event.
523    @param e Event information
524    @param id The ID of the mouse button
525  */
526  bool InputManager::mousePressed(const OIS::MouseEvent &e, OIS::MouseButtonID id)
527  {
528    // check whether the button already is in the list (can happen when focus was lost)
[1272]529    unsigned int iButton = 0;
530    while (iButton < mouseButtonsDown_.size() && mouseButtonsDown_[iButton] != (MouseButton::Enum)id)
531      iButton++;
532    if (iButton == mouseButtonsDown_.size())
533      mouseButtonsDown_.push_back((MouseButton::Enum)id);
[1219]534
535    for (unsigned int i = 0; i < activeMouseHandlers_.size(); i++)
[1272]536      activeMouseHandlers_[i]->mouseButtonPressed(e.state, (MouseButton::Enum)id);
[1219]537
538    return true;
539  }
540
541  /**
542    @brief Event handler for the mouseReleased Event.
543    @param e Event information
544    @param id The ID of the mouse button
545  */
546  bool InputManager::mouseReleased(const OIS::MouseEvent &e, OIS::MouseButtonID id)
547  {
548    // remove the button from the keysDown_ list
[1272]549    for (unsigned int iButton = 0; iButton < mouseButtonsDown_.size(); iButton++)
[1219]550    {
[1272]551      if (mouseButtonsDown_[iButton] == (MouseButton::Enum)id)
[1219]552      {
[1272]553        mouseButtonsDown_.erase(mouseButtonsDown_.begin() + iButton);
[1022]554        break;
555      }
556    }
557
[1219]558    for (unsigned int i = 0; i < activeMouseHandlers_.size(); i++)
[1272]559      activeMouseHandlers_[i]->mouseButtonReleased(e.state, (MouseButton::Enum)id);
[918]560
[1219]561    return true;
[918]562  }
563
[1219]564
565  // ###### Joy Stick Events ######
566
567  bool InputManager::buttonPressed(const OIS::JoyStickEvent &arg, int button)
568  {
[1272]569    // use the device to identify which one called the method
[1219]570    OIS::JoyStick* joyStick = (OIS::JoyStick*)arg.device;
[1272]571    unsigned int iJoyStick = 0;
572    while (joySticks_[iJoyStick] != joyStick)
573      iJoyStick++;
[1219]574
575    // check whether the button already is in the list (can happen when focus was lost)
[1272]576    std::vector<int> buttonsDown = joyStickButtonsDown_[iJoyStick];
577    unsigned int iButton = 0;
578    while (iButton < buttonsDown.size() && buttonsDown[iButton] != button)
579      iButton++;
580    if (iButton == buttonsDown.size())
581      buttonsDown.push_back(button);
[1219]582
[1272]583    for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
584      activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickButtonPressed(JoyStickState(arg.state, iJoyStick), button);
[1219]585
586    return true;
587  }
588
589  bool InputManager::buttonReleased(const OIS::JoyStickEvent &arg, int button)
590  {
[1272]591    // use the device to identify which one called the method
[1219]592    OIS::JoyStick* joyStick = (OIS::JoyStick*)arg.device;
[1272]593    unsigned int iJoyStick = 0;
594    while (joySticks_[iJoyStick] != joyStick)
595      iJoyStick++;
[1219]596
597    // remove the button from the joyStickButtonsDown_ list
[1272]598    std::vector<int> buttonsDown = joyStickButtonsDown_[iJoyStick];
599    for (unsigned int iButton = 0; iButton < buttonsDown.size(); iButton++)
[1219]600    {
[1272]601      if (buttonsDown[iButton] == button)
[1219]602      {
[1272]603        buttonsDown.erase(buttonsDown.begin() + iButton);
[1219]604        break;
605      }
606    }
607
[1272]608    for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
609      activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickButtonReleased(JoyStickState(arg.state, iJoyStick), button);
[1219]610
611    return true;
612  }
613
614  bool InputManager::axisMoved(const OIS::JoyStickEvent &arg, int axis)
615  {
[1272]616    // use the device to identify which one called the method
[1219]617    OIS::JoyStick* joyStick = (OIS::JoyStick*)arg.device;
[1272]618    unsigned int iJoyStick = 0;
619    while (joySticks_[iJoyStick] != joyStick)
620      iJoyStick++;
[1219]621
[1272]622    for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
623      activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickAxisMoved(JoyStickState(arg.state, iJoyStick), axis);
624
[1219]625    return true;
626  }
627
628  bool InputManager::sliderMoved(const OIS::JoyStickEvent &arg, int id)
629  {
[1272]630    // use the device to identify which one called the method
[1219]631    OIS::JoyStick* joyStick = (OIS::JoyStick*)arg.device;
[1272]632    unsigned int iJoyStick = 0;
633    while (joySticks_[iJoyStick] != joyStick)
634      iJoyStick++;
635
636    for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
637      activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickSliderMoved(JoyStickState(arg.state, iJoyStick), id);
[1219]638
639    return true;
640  }
641
642  bool InputManager::povMoved(const OIS::JoyStickEvent &arg, int id)
643  {
[1272]644    // use the device to identify which one called the method
[1219]645    OIS::JoyStick* joyStick = (OIS::JoyStick*)arg.device;
[1272]646    unsigned int iJoyStick = 0;
647    while (joySticks_[iJoyStick] != joyStick)
648      iJoyStick++;
649
650    for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
651      activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickPovMoved(JoyStickState(arg.state, iJoyStick), id);
[1219]652
653    return true;
654  }
655
656  bool InputManager::vector3Moved(const OIS::JoyStickEvent &arg, int id)
657  {
[1272]658    // use the device to identify which one called the method
[1219]659    OIS::JoyStick* joyStick = (OIS::JoyStick*)arg.device;
[1272]660    unsigned int iJoyStick = 0;
661    while (joySticks_[iJoyStick] != joyStick)
662      iJoyStick++;
663
664    for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
665      activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickVector3Moved(JoyStickState(arg.state, iJoyStick), id);
[1219]666
667    return true;
668  }
669
670
671  // ################################
672  // ### Static Interface Methods ###
673  // ################################
674  // ################################
675
[1272]676  bool InputManager::initialise(const size_t windowHnd, int windowWidth, int windowHeight,
677    bool createKeyboard, bool createMouse, bool createJoySticks)
[1219]678  {
679    return _getSingleton()._initialise(windowHnd, windowWidth, windowHeight,
680          createKeyboard, createMouse, createJoySticks);
681  }
682
683  bool InputManager::initialiseKeyboard()
684  {
685    return _getSingleton()._initialiseKeyboard();
686  }
687
688  bool InputManager::initialiseMouse()
689  {
690    return _getSingleton()._initialiseMouse();
691  }
692
693  bool InputManager::initialiseJoySticks()
694  {
695    return _getSingleton()._initialiseJoySticks();
696  }
697
698  int InputManager::numberOfKeyboards()
699  {
700    if (_getSingleton().keyboard_ != 0)
701      return 1;
702    else
703      return 0;
704  }
705
706  int InputManager::numberOfMice()
707  {
708    if (_getSingleton().mouse_ != 0)
709      return 1;
710    else
711      return 0;
712  }
713
714  int InputManager::numberOfJoySticks()
715  {
[1272]716    return _getSingleton().joySticksSize_;
[1219]717  }
718
[1272]719  bool InputManager::isKeyDown(KeyCode::Enum key)
720  {
721    if (_getSingleton().keyboard_)
722      return _getSingleton().keyboard_->isKeyDown((OIS::KeyCode)key);
723    else
724      return false;
725  }
[1219]726
[1272]727  bool InputManager::isModifierDown(KeyboardModifier::Enum modifier)
728  {
729    if (_getSingleton().keyboard_)
730      return isModifierDown(modifier);
731    else
732      return false;
733  }
734
735  const MouseState InputManager::getMouseState()
736  {
737    if (_getSingleton().mouse_)
738      return _getSingleton().mouse_->getMouseState();
739    else
740      return MouseState();
741  }
742
743  const JoyStickState InputManager::getJoyStickState(unsigned int ID)
744  {
745    if (ID < _getSingleton().joySticksSize_)
746      return JoyStickState(_getSingleton().joySticks_[ID]->getJoyStickState(), ID);
747    else
748      return JoyStickState();
749  }
750
751
[1219]752  void InputManager::destroy()
753  {
754    _getSingleton()._destroy();
755  }
756
757  void InputManager::destroyKeyboard()
758  {
759    return _getSingleton()._destroyKeyboard();
760  }
761
762  void InputManager::destroyMouse()
763  {
764    return _getSingleton()._destroyMouse();
765  }
766
767  void InputManager::destroyJoySticks()
768  {
769    return _getSingleton()._destroyJoySticks();
770  }
771
772
[919]773  /**
774    @brief Adjusts the mouse window metrics.
775    This method has to be called every time the size of the window changes.
776    @param width The new width of the render window
777    @param height the new height of the render window
778  */
[1219]779  void InputManager::setWindowExtents(const int width, const int height)
[918]780  {
[1219]781    if (_getSingleton().mouse_)
782    {
783      // Set mouse region (if window resizes, we should alter this to reflect as well)
784      const OIS::MouseState &mouseState = _getSingleton().mouse_->getMouseState();
785      mouseState.width  = width;
786      mouseState.height = height;
787    }
[918]788  }
789
[919]790  /**
[1022]791    @brief Sets the input mode to either GUI, inGame or Buffer
792    @param mode The new input mode
793    @remark Only has an affect if the mode actually changes
[922]794  */
[1219]795  void InputManager::setInputState(const InputState state)
[922]796  {
[1219]797    _getSingleton().stateRequest_ = state;
[922]798  }
799
800  /**
[1022]801    @brief Returns the current input handling method
802    @return The current input mode.
[919]803  */
[1219]804  InputManager::InputState InputManager::getInputState()
[918]805  {
[1219]806    return _getSingleton().state_;
[918]807  }
808
[1219]809
810  // ###### KeyHandler ######
811
812  /**
813    @brief Adds a new key handler.
814    @param handler Pointer to the handler object.
815    @param name Unique name of the handler.
816    @return True if added, false if name already existed.
817  */
818  bool InputManager::addKeyHandler(KeyHandler* handler, const std::string& name)
[1066]819  {
[1219]820    if (_getSingleton().keyHandlers_.find(name) == _getSingleton().keyHandlers_.end())
821    {
822      _getSingleton().keyHandlers_[name] = handler;
823      return true;
824    }
825    else
826      return false;
[1066]827  }
828
[1219]829  /**
830    @brief Removes a Key handler from the list.
831    @param name Unique name of the handler.
832    @return True if removal was successful, false if name was not found.
833  */
834  bool InputManager::removeKeyHandler(const std::string &name)
835  {
836    disableKeyHandler(name);
837    std::map<std::string, KeyHandler*>::iterator it = _getSingleton().keyHandlers_.find(name);
838    if (it != _getSingleton().keyHandlers_.end())
839    {
840      _getSingleton().keyHandlers_.erase(it);
841      return true;
842    }
843    else
844      return false;
845  }
[1066]846
[1219]847  /**
848    @brief Returns the pointer to a handler.
849    @param name Unique name of the handler.
850    @return Pointer to the instance, 0 if name was not found.
851  */
852  KeyHandler* InputManager::getKeyHandler(const std::string& name)
853  {
854    std::map<std::string, KeyHandler*>::iterator it = _getSingleton().keyHandlers_.find(name);
855    if (it != _getSingleton().keyHandlers_.end())
856    {
857      return (*it).second;
858    }
859    else
860      return 0;
861  }
862
863  /**
864    @brief Enables a specific key handler that has already been added.
865    @param name Unique name of the handler.
866    @return False if name was not found, true otherwise.
867  */
868  bool InputManager::enableKeyHandler(const std::string& name)
869  {
870    // get pointer from the map with all stored handlers
871    std::map<std::string, KeyHandler*>::const_iterator mapIt = _getSingleton().keyHandlers_.find(name);
872    if (mapIt == _getSingleton().keyHandlers_.end())
873      return false;
874    // see whether the handler already is in the list
875    for (std::vector<KeyHandler*>::iterator it = _getSingleton().activeKeyHandlers_.begin();
876          it != _getSingleton().activeKeyHandlers_.end(); it++)
877    {
878      if ((*it) == (*mapIt).second)
879      {
880        _getSingleton().stateRequest_ = IS_CUSTOM;
881        return true;
882      }
883    }
884    _getSingleton().activeKeyHandlers_.push_back((*mapIt).second);
885    _getSingleton().stateRequest_ = IS_CUSTOM;
886    return true;
887  }
888
889  /**
890    @brief Disables a specific key handler.
891    @param name Unique name of the handler.
892    @return False if name was not found, true otherwise.
893  */
894  bool InputManager::disableKeyHandler(const std::string &name)
895  {
896    // get pointer from the map with all stored handlers
897    std::map<std::string, KeyHandler*>::const_iterator mapIt = _getSingleton().keyHandlers_.find(name);
898    if (mapIt == _getSingleton().keyHandlers_.end())
899      return false;
900    // look for the handler in the list
901    for (std::vector<KeyHandler*>::iterator it = _getSingleton().activeKeyHandlers_.begin();
902          it != _getSingleton().activeKeyHandlers_.end(); it++)
903    {
904      if ((*it) == (*mapIt).second)
905      {
906        _getSingleton().activeKeyHandlers_.erase(it);
907        _getSingleton().stateRequest_ = IS_CUSTOM;
908        return true;
909      }
910    }
911    _getSingleton().stateRequest_ = IS_CUSTOM;
912    return true;
913  }
914
915  /**
916    @brief Checks whether a key handler is active
917    @param name Unique name of the handler.
918    @return False if key handler is not active or doesn't exist, true otherwise.
919  */
920  bool InputManager::isKeyHandlerActive(const std::string& name)
921  {
922    // get pointer from the map with all stored handlers
923    std::map<std::string, KeyHandler*>::const_iterator mapIt = _getSingleton().keyHandlers_.find(name);
924    if (mapIt == _getSingleton().keyHandlers_.end())
925      return false;
926    // see whether the handler already is in the list
927    for (std::vector<KeyHandler*>::iterator it = _getSingleton().activeKeyHandlers_.begin();
928          it != _getSingleton().activeKeyHandlers_.end(); it++)
929    {
930      if ((*it) == (*mapIt).second)
931        return true;
932    }
933    return false;
934  }
935
936
937  // ###### MouseHandler ######
938  /**
939    @brief Adds a new mouse handler.
940    @param handler Pointer to the handler object.
941    @param name Unique name of the handler.
942    @return True if added, false if name already existed.
943  */
944  bool InputManager::addMouseHandler(MouseHandler* handler, const std::string& name)
945  {
946    if (_getSingleton().mouseHandlers_.find(name) == _getSingleton().mouseHandlers_.end())
947    {
948      _getSingleton().mouseHandlers_[name] = handler;
949      return true;
950    }
951    else
952      return false;
953  }
954
955  /**
956    @brief Removes a Mouse handler from the list.
957    @param name Unique name of the handler.
958    @return True if removal was successful, false if name was not found.
959  */
960  bool InputManager::removeMouseHandler(const std::string &name)
961  {
962    disableMouseHandler(name);
963    std::map<std::string, MouseHandler*>::iterator it = _getSingleton().mouseHandlers_.find(name);
964    if (it != _getSingleton().mouseHandlers_.end())
965    {
966      _getSingleton().mouseHandlers_.erase(it);
967      return true;
968    }
969    else
970      return false;
971  }
972
973  /**
974    @brief Returns the pointer to a handler.
975    @param name Unique name of the handler.
976    @return Pointer to the instance, 0 if name was not found.
977  */
978  MouseHandler* InputManager::getMouseHandler(const std::string& name)
979  {
980    std::map<std::string, MouseHandler*>::iterator it = _getSingleton().mouseHandlers_.find(name);
981    if (it != _getSingleton().mouseHandlers_.end())
982    {
983      return (*it).second;
984    }
985    else
986      return 0;
987  }
988
989  /**
990    @brief Enables a specific mouse handler that has already been added.
991    @param name Unique name of the handler.
992    @return False if name was not found, true otherwise.
993  */
994  bool InputManager::enableMouseHandler(const std::string& name)
995  {
996    // get pointer from the map with all stored handlers
997    std::map<std::string, MouseHandler*>::const_iterator mapIt = _getSingleton().mouseHandlers_.find(name);
998    if (mapIt == _getSingleton().mouseHandlers_.end())
999      return false;
1000    // see whether the handler already is in the list
1001    for (std::vector<MouseHandler*>::iterator it = _getSingleton().activeMouseHandlers_.begin();
1002          it != _getSingleton().activeMouseHandlers_.end(); it++)
1003    {
1004      if ((*it) == (*mapIt).second)
1005      {
1006        _getSingleton().stateRequest_ = IS_CUSTOM;
1007        return true;
1008      }
1009    }
1010    _getSingleton().activeMouseHandlers_.push_back((*mapIt).second);
1011    _getSingleton().stateRequest_ = IS_CUSTOM;
1012    return true;
1013  }
1014
1015  /**
1016    @brief Disables a specific mouse handler.
1017    @param name Unique name of the handler.
1018    @return False if name was not found, true otherwise.
1019  */
1020  bool InputManager::disableMouseHandler(const std::string &name)
1021  {
1022    // get pointer from the map with all stored handlers
1023    std::map<std::string, MouseHandler*>::const_iterator mapIt = _getSingleton().mouseHandlers_.find(name);
1024    if (mapIt == _getSingleton().mouseHandlers_.end())
1025      return false;
1026    // look for the handler in the list
1027    for (std::vector<MouseHandler*>::iterator it = _getSingleton().activeMouseHandlers_.begin();
1028          it != _getSingleton().activeMouseHandlers_.end(); it++)
1029    {
1030      if ((*it) == (*mapIt).second)
1031      {
1032        _getSingleton().activeMouseHandlers_.erase(it);
1033        _getSingleton().stateRequest_ = IS_CUSTOM;
1034        return true;
1035      }
1036    }
1037    _getSingleton().stateRequest_ = IS_CUSTOM;
1038    return true;
1039  }
1040
1041  /**
1042    @brief Checks whether a mouse handler is active
1043    @param name Unique name of the handler.
1044    @return False if key handler is not active or doesn't exist, true otherwise.
1045  */
1046  bool InputManager::isMouseHandlerActive(const std::string& name)
1047  {
1048    // get pointer from the map with all stored handlers
1049    std::map<std::string, MouseHandler*>::const_iterator mapIt = _getSingleton().mouseHandlers_.find(name);
1050    if (mapIt == _getSingleton().mouseHandlers_.end())
1051      return false;
1052    // see whether the handler already is in the list
1053    for (std::vector<MouseHandler*>::iterator it = _getSingleton().activeMouseHandlers_.begin();
1054          it != _getSingleton().activeMouseHandlers_.end(); it++)
1055    {
1056      if ((*it) == (*mapIt).second)
1057        return true;
1058    }
1059    return false;
1060  }
1061
1062
1063  // ###### JoyStickHandler ######
1064
1065  /**
1066    @brief Adds a new joy stick handler.
1067    @param handler Pointer to the handler object.
1068    @param name Unique name of the handler.
1069    @return True if added, false if name already existed.
1070  */
1071  bool InputManager::addJoyStickHandler(JoyStickHandler* handler, const std::string& name)
1072  {
1073    if (_getSingleton().joyStickHandlers_.find(name) == _getSingleton().joyStickHandlers_.end())
1074    {
1075      _getSingleton().joyStickHandlers_[name] = handler;
1076      return true;
1077    }
1078    else
1079      return false;
1080  }
1081
1082  /**
1083    @brief Removes a JoyStick handler from the list.
1084    @param name Unique name of the handler.
1085    @return True if removal was successful, false if name was not found.
1086  */
1087  bool InputManager::removeJoyStickHandler(const std::string &name)
1088  {
1089    for (std::vector<OIS::JoyStick*>::iterator itstick = _getSingleton().joySticks_.begin();
1090          itstick != _getSingleton().joySticks_.end(); itstick++)
1091      disableJoyStickHandler(name, itstick - _getSingleton().joySticks_.begin());
1092
1093    std::map<std::string, JoyStickHandler*>::iterator it = _getSingleton().joyStickHandlers_.find(name);
1094    if (it != _getSingleton().joyStickHandlers_.end())
1095    {
1096      _getSingleton().joyStickHandlers_.erase(it);
1097      return true;
1098    }
1099    else
1100      return false;
1101  }
1102
1103  /**
1104    @brief Returns the pointer to a handler.
1105    @param name Unique name of the handler.
1106    @return Pointer to the instance, 0 if name was not found.
1107  */
1108  JoyStickHandler* InputManager::getJoyStickHandler(const std::string& name)
1109  {
1110    std::map<std::string, JoyStickHandler*>::iterator it = _getSingleton().joyStickHandlers_.find(name);
1111    if (it != _getSingleton().joyStickHandlers_.end())
1112    {
1113      return (*it).second;
1114    }
1115    else
1116      return 0;
1117  }
1118
1119  /**
1120    @brief Enables a specific joy stick handler that has already been added.
1121    @param name Unique name of the handler.
1122    @return False if name or id was not found, true otherwise.
1123  */
[1272]1124  bool InputManager::enableJoyStickHandler(const std::string& name, unsigned int ID)
[1219]1125  {
1126    // get handler pointer from the map with all stored handlers
1127    std::map<std::string, JoyStickHandler*>::const_iterator handlerIt = _getSingleton().joyStickHandlers_.find(name);
1128    if (handlerIt == _getSingleton().joyStickHandlers_.end())
1129      return false;
1130
1131    // check for existence of the ID
[1272]1132    if (ID >= _getSingleton().joySticksSize_)
[1219]1133      return false;
1134
1135    // see whether the handler already is in the list
[1272]1136    for (std::vector<JoyStickHandler*>::iterator it = _getSingleton().activeJoyStickHandlers_[ID].begin();
1137          it != _getSingleton().activeJoyStickHandlers_[ID].end(); it++)
[1219]1138    {
1139      if ((*it) == (*handlerIt).second)
1140      {
1141        _getSingleton().stateRequest_ = IS_CUSTOM;
1142        return true;
1143      }
1144    }
[1272]1145    _getSingleton().activeJoyStickHandlers_[ID].push_back((*handlerIt).second);
[1219]1146    _getSingleton().stateRequest_ = IS_CUSTOM;
1147    return true;
1148  }
1149
1150  /**
1151    @brief Disables a specific joy stick handler.
1152    @param name Unique name of the handler.
1153    @return False if name or id was not found, true otherwise.
1154  */
[1272]1155  bool InputManager::disableJoyStickHandler(const std::string &name, unsigned int ID)
[1219]1156  {
1157    // get handler pointer from the map with all stored handlers
1158    std::map<std::string, JoyStickHandler*>::const_iterator handlerIt = _getSingleton().joyStickHandlers_.find(name);
1159    if (handlerIt == _getSingleton().joyStickHandlers_.end())
1160      return false;
1161
1162    // check for existence of the ID
[1272]1163    if (ID >= _getSingleton().joySticksSize_)
[1219]1164      return false;
1165
1166    // look for the handler in the list
[1272]1167    for (std::vector<JoyStickHandler*>::iterator it = _getSingleton().activeJoyStickHandlers_[ID].begin();
1168          it != _getSingleton().activeJoyStickHandlers_[ID].end(); it++)
[1219]1169    {
1170      if ((*it) == (*handlerIt).second)
1171      {
[1272]1172        _getSingleton().activeJoyStickHandlers_[ID].erase(it);
[1219]1173        _getSingleton().stateRequest_ = IS_CUSTOM;
1174        return true;
1175      }
1176    }
1177    return true;
1178  }
1179
1180  /**
1181    @brief Checks whether a joy stick handler is active
1182    @param name Unique name of the handler.
1183    @return False if key handler is not active or doesn't exist, true otherwise.
1184  */
[1272]1185  bool InputManager::isJoyStickHandlerActive(const std::string& name, unsigned int ID)
[1219]1186  {
1187    // get handler pointer from the map with all stored handlers
1188    std::map<std::string, JoyStickHandler*>::const_iterator handlerIt = _getSingleton().joyStickHandlers_.find(name);
1189    if (handlerIt == _getSingleton().joyStickHandlers_.end())
1190      return false;
1191
1192    // check for existence of the ID
[1272]1193    if (ID >= _getSingleton().joySticksSize_)
[1219]1194      return false;
1195
1196    // see whether the handler already is in the list
[1272]1197    for (std::vector<JoyStickHandler*>::iterator it = _getSingleton().activeJoyStickHandlers_[ID].begin();
1198          it != _getSingleton().activeJoyStickHandlers_[ID].end(); it++)
[1219]1199    {
1200      if ((*it) == (*handlerIt).second)
1201        return true;
1202    }
1203    return false;
1204  }
1205
[918]1206}
Note: See TracBrowser for help on using the repository browser.