Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/network/src/core/InputManager.cc @ 1455

Last change on this file since 1455 was 1455, checked in by rgrieder, 16 years ago
  • 'fixed' a bug in CppTcl.cc, but why would map::find pose a problem if the map is empty?
  • 'fixed' InGameConsole destructor: commented everything. We should probably use OverlayManager::destroyOverlay to delete the created overlay elements. Unfortunately that didn't work either. And I changed delete to delete[] for the list.
File size: 48.8 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 the InputManager that captures all the input from OIS
32         and redirects it to handlers.
33 */
34
35#include "InputManager.h"
36#include "util/Convert.h"
37#include "CoreIncludes.h"
38#include "ConfigValueIncludes.h"
39#include "Debug.h"
40#include "InputBuffer.h"
41#include "KeyBinder.h"
42#include "CommandExecutor.h"
43#include "ConsoleCommand.h"
44#include "Shell.h"
45
46namespace orxonox
47{
48  SetConsoleCommandShortcut(InputManager, keyBind);
49  SetConsoleCommandShortcut(InputManager, storeKeyStroke);
50  SetConsoleCommandShortcut(InputManager, calibrate);
51
52  // ###############################
53  // ###    Internal Methods     ###
54  // ###############################
55  // ###############################
56
57  /**
58    @brief Constructor only sets member fields to initial zero values
59           and registers the class in the class hierarchy.
60  */
61  InputManager::InputManager() :
62      inputSystem_(0), keyboard_(0), mouse_(0),
63      joySticksSize_(0),
64      keyBinder_(0), keyDetector_(0), buffer_(0), calibratorCallback_(0),
65      state_(IS_UNINIT), stateRequest_(IS_UNINIT), savedState_(IS_UNINIT),
66      keyboardModifiers_(0)
67  {
68    RegisterObject(InputManager);
69  }
70
71  /**
72    @brief The one instance of the InputManager is stored in this function.
73    @return A reference to the only instance of the InputManager
74  */
75  InputManager& InputManager::_getSingleton()
76  {
77    static InputManager theOnlyInstance;
78    return theOnlyInstance;
79  }
80
81  /**
82    @brief Destructor only called at the end of the program, after main.
83  */
84  InputManager::~InputManager()
85  {
86    _destroy();
87  }
88
89  /**
90    @brief Creates the OIS::InputMananger, the keyboard, the mouse and
91           the joysticks and assigns the key bindings.
92    @param windowHnd The window handle of the render window
93    @param windowWidth The width of the render window
94    @param windowHeight The height of the render window
95  */
96  bool InputManager::_initialise(const size_t windowHnd, int windowWidth, int windowHeight,
97        bool createKeyboard, bool createMouse, bool createJoySticks)
98  {
99    if (state_ == IS_UNINIT)
100    {
101      CCOUT(3) << "Initialising Input System..." << std::endl;
102      CCOUT(ORX_DEBUG) << "Initialising OIS components..." << std::endl;
103
104      OIS::ParamList paramList;
105      std::ostringstream windowHndStr;
106
107      // Fill parameter list
108      windowHndStr << (unsigned int)windowHnd;
109      paramList.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
110      //paramList.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE")));
111      //paramList.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND")));
112//#if defined OIS_LINUX_PLATFORM
113//      paramList.insert(std::make_pair(std::string("XAutoRepeatOn"), std::string("true")));
114//#endif
115
116      try
117      {
118        inputSystem_ = OIS::InputManager::createInputSystem(paramList);
119        CCOUT(ORX_DEBUG) << "Created OIS input system" << std::endl;
120      }
121      catch (OIS::Exception ex)
122      {
123        CCOUT(ORX_ERROR) << "Error: Failed creating an OIS input system."
124            << "OIS message: \"" << ex.eText << "\"" << std::endl;
125        inputSystem_ = 0;
126        return false;
127      }
128
129      if (createKeyboard)
130        _initialiseKeyboard();
131
132      if (createMouse)
133        _initialiseMouse();
134
135      if (createJoySticks)
136        _initialiseJoySticks();
137
138      // Set mouse/joystick region
139      if (mouse_)
140      {
141        //// hack the mouse position
142        //((OIS::MouseState&)mouse_->getMouseState()).X.abs = windowWidth/2;
143        //((OIS::MouseState&)mouse_->getMouseState()).Y.abs = windowHeight/2;
144        setWindowExtents(windowWidth, windowHeight);
145      }
146
147      state_ = IS_NONE;
148      CCOUT(ORX_DEBUG) << "Initialising OIS components done." << std::endl;
149
150      // InputManager holds the input buffer --> create one and add it.
151      buffer_ = new InputBuffer();
152      addKeyHandler(buffer_, "buffer");
153      Shell::getInstance().setInputBuffer(buffer_);
154
155      keyBinder_ = new KeyBinder();
156      keyBinder_->loadBindings();
157      addKeyHandler(keyBinder_, "keybinder");
158      addMouseHandler(keyBinder_, "keybinder");
159      addJoyStickHandler(keyBinder_, "keybinder");
160
161      keyDetector_ = new KeyDetector();
162      keyDetector_->loadBindings();
163      addKeyHandler(keyDetector_, "keydetector");
164      addMouseHandler(keyDetector_, "keydetector");
165      addJoyStickHandler(keyDetector_, "keydetector");
166
167      calibratorCallback_ = new CalibratorCallback();
168      addKeyHandler(calibratorCallback_, "calibratorcallback");
169
170      setConfigValues();
171
172      CCOUT(ORX_DEBUG) << "Initialising complete." << std::endl;
173    }
174    else
175    {
176      CCOUT(ORX_WARNING) << "Warning: OIS compoments already initialised, skipping" << std::endl;
177    }
178    return true;
179  }
180
181  /**
182    @brief Creates a keyboard and sets the event handler.
183    @return False if keyboard stays uninitialised, true otherwise.
184  */
185  bool InputManager::_initialiseKeyboard()
186  {
187    if (keyboard_ != 0)
188    {
189      CCOUT(2) << "Warning: Keyboard already initialised, skipping." << std::endl;
190      return true;
191    }
192    try
193    {
194      if (inputSystem_->getNumberOfDevices(OIS::OISKeyboard) > 0)
195      {
196        keyboard_ = (OIS::Keyboard*)inputSystem_->createInputObject(OIS::OISKeyboard, true);
197        // register our listener in OIS.
198        keyboard_->setEventCallback(this);
199        // note: OIS will not detect keys that have already been down when the keyboard was created.
200        CCOUT(ORX_DEBUG) << "Created OIS keyboard" << std::endl;
201        return true;
202      }
203      else
204      {
205        CCOUT(ORX_WARNING) << "Warning: No keyboard found!" << std::endl;
206        return false;
207      }
208    }
209    catch (OIS::Exception ex)
210    {
211      // TODO: Test this output regarding formatting
212      CCOUT(ORX_WARNING) << "Warning: Failed to create an OIS keyboard\n"
213          << "OIS error message: \"" << ex.eText << "\"" << std::endl;
214      keyboard_ = 0;
215      return false;
216    }
217  }
218
219  /**
220    @brief Creates a mouse and sets the event handler.
221    @return False if mouse stays uninitialised, true otherwise.
222  */
223  bool InputManager::_initialiseMouse()
224  {
225    if (mouse_ != 0)
226    {
227      CCOUT(2) << "Warning: Mouse already initialised, skipping." << std::endl;
228      return true;
229    }
230    try
231    {
232      if (inputSystem_->getNumberOfDevices(OIS::OISMouse) > 0)
233      {
234        mouse_ = static_cast<OIS::Mouse*>(inputSystem_->createInputObject(OIS::OISMouse, true));
235        // register our listener in OIS.
236        mouse_->setEventCallback(this);
237        CCOUT(ORX_DEBUG) << "Created OIS mouse" << std::endl;
238        return true;
239      }
240      else
241      {
242        CCOUT(ORX_WARNING) << "Warning: No mouse found!" << std::endl;
243        return false;
244      }
245    }
246    catch (OIS::Exception ex)
247    {
248      CCOUT(ORX_WARNING) << "Warning: Failed to create an OIS mouse\n"
249          << "OIS error message: \"" << ex.eText << "\"" << std::endl;
250      mouse_ = 0;
251      return false;
252    }
253  }
254
255  /**
256    @brief Creates all joy sticks and sets the event handler.
257    @return False joy stick stay uninitialised, true otherwise.
258  */
259  bool InputManager::_initialiseJoySticks()
260  {
261    if (joySticksSize_ > 0)
262    {
263      CCOUT(2) << "Warning: Joy sticks already initialised, skipping." << std::endl;
264      return true;
265    }
266    bool success = false;
267    if (inputSystem_->getNumberOfDevices(OIS::OISJoyStick) > 0)
268    {
269      for (int i = 0; i < inputSystem_->getNumberOfDevices(OIS::OISJoyStick); i++)
270      {
271        try
272        {
273          OIS::JoyStick* stig = static_cast<OIS::JoyStick*>(inputSystem_->createInputObject(OIS::OISJoyStick, true));
274          joySticks_.push_back(stig);
275          // register our listener in OIS.
276          stig->setEventCallback(this);
277          CCOUT(ORX_DEBUG) << "Created OIS joy stick with ID " << stig->getID() << std::endl;
278          success = true;
279        }
280        catch (OIS::Exception ex)
281        {
282          CCOUT(ORX_WARNING) << "Warning: Failed to create OIS joy number" << i << "\n"
283              << "OIS error message: \"" << ex.eText << "\"" << std::endl;
284        }
285      }
286    }
287    else
288    {
289      CCOUT(ORX_WARNING) << "Warning: Joy stick support requested, but no joy stick was found" << std::endl;
290      return false;
291    }
292    joySticksSize_ = joySticks_.size();
293    activeJoyStickHandlers_.resize(joySticksSize_);
294    joyStickButtonsDown_.resize(joySticksSize_);
295    povStates_.resize(joySticksSize_);
296    sliderStates_.resize(joySticksSize_);
297    joySticksCalibration_.resize(joySticksSize_);
298    for (unsigned int iJoyStick = 0; iJoyStick < joySticksSize_; iJoyStick++)
299    {
300      // reset the calibration with default values
301      for (unsigned int i = 0; i < 24; i++)
302      {
303        joySticksCalibration_[iJoyStick].negativeCoeff[i] = 1.0f/32767.0f;
304        joySticksCalibration_[iJoyStick].positiveCoeff[i] = 1.0f/32768.0f;
305        joySticksCalibration_[iJoyStick].zeroStates[i] = 0;
306      }
307    }
308    return success;
309  }
310
311  /**
312    @brief Sets the configurable values. Use keybindings.ini as file..
313  */
314  void InputManager::setConfigValues()
315  {
316    if (joySticksSize_)
317    {
318      std::vector<MultiTypeMath> coeffPos;
319      std::vector<MultiTypeMath> coeffNeg;
320      std::vector<MultiTypeMath> zero;
321      coeffPos.resize(24);
322      coeffNeg.resize(24);
323      zero.resize(24);
324      for (unsigned int i = 0; i < 24; i++)
325      {
326        coeffPos[i] =  1.0f/32767.0f;
327        coeffNeg[i] =  1.0f/32768.0f;
328        zero[i]     =  0;
329      }
330
331      ConfigValueContainer* cont = getIdentifier()->getConfigValueContainer("CoeffPos");
332      if (!cont)
333      {
334          cont = new ConfigValueContainer(CFT_Keybindings, getIdentifier(), "CoeffPos", coeffPos);
335          getIdentifier()->addConfigValueContainer("CoeffPos", cont);
336      }
337      cont->getValue(&coeffPos);
338
339      cont = getIdentifier()->getConfigValueContainer("CoeffNeg");
340      if (!cont)
341      {
342          cont = new ConfigValueContainer(CFT_Keybindings, getIdentifier(), "CoeffNeg", coeffNeg);
343          getIdentifier()->addConfigValueContainer("CoeffNeg", cont);
344      }
345      cont->getValue(&coeffNeg);
346
347      cont = getIdentifier()->getConfigValueContainer("Zero");
348      if (!cont)
349      {
350          cont = new ConfigValueContainer(CFT_Keybindings, getIdentifier(), "Zero", zero);
351          getIdentifier()->addConfigValueContainer("Zero", cont);
352      }
353      cont->getValue(&zero);
354
355      // copy values to our own variables
356      for (unsigned int i = 0; i < 24; i++)
357      {
358        joySticksCalibration_[0].positiveCoeff[i] = coeffPos[i];
359        joySticksCalibration_[0].negativeCoeff[i] = coeffNeg[i];
360        joySticksCalibration_[0].zeroStates[i]    = zero[i];
361      }
362    }
363  }
364
365  /**
366    @brief Destroys all the created input devices and sets the InputManager to construction state.
367  */
368  void InputManager::_destroy()
369  {
370    if (state_ != IS_UNINIT)
371    {
372      CCOUT(ORX_DEBUG) << "Destroying ..." << std::endl;
373
374      if (buffer_)
375        delete buffer_;
376
377      if (keyBinder_)
378        delete keyBinder_;
379
380      if (keyDetector_)
381        delete keyDetector_;
382
383      if (calibratorCallback_)
384        delete calibratorCallback_;
385
386      keyHandlers_.clear();
387      mouseHandlers_.clear();
388      joyStickHandlers_.clear();
389
390      _destroyKeyboard();
391      _destroyMouse();
392      _destroyJoySticks();
393
394      activeHandlers_.clear();
395
396      // inputSystem_ can never be 0, or else the code is mistaken
397      OIS::InputManager::destroyInputSystem(inputSystem_);
398      inputSystem_ = 0;
399
400      state_ = IS_UNINIT;
401      CCOUT(ORX_DEBUG) << "Destroying done." << std::endl;
402    }
403  }
404
405  /**
406    @brief Destroys the keyboard and sets it to 0.
407  */
408  void InputManager::_destroyKeyboard()
409  {
410    if (keyboard_)
411      // inputSystem_ can never be 0, or else the code is mistaken
412      inputSystem_->destroyInputObject(keyboard_);
413    keyboard_ = 0;
414    activeKeyHandlers_.clear();
415    keysDown_.clear();
416    CCOUT(ORX_DEBUG) << "Keyboard destroyed." << std::endl;
417  }
418
419  /**
420    @brief Destroys the mouse and sets it to 0.
421  */
422  void InputManager::_destroyMouse()
423  {
424    if (mouse_)
425      // inputSystem_ can never be 0, or else the code is mistaken
426      inputSystem_->destroyInputObject(mouse_);
427    mouse_ = 0;
428    activeMouseHandlers_.clear();
429    mouseButtonsDown_.clear();
430    CCOUT(ORX_DEBUG) << "Mouse destroyed." << std::endl;
431  }
432
433  /**
434    @brief Destroys all the joy sticks and resizes the lists to 0.
435  */
436  void InputManager::_destroyJoySticks()
437  {
438    if (joySticksSize_ > 0)
439    {
440      // note: inputSystem_ can never be 0, or else the code is mistaken
441      for (unsigned int i = 0; i < joySticksSize_; i++)
442        if (joySticks_[i] != 0)
443          inputSystem_->destroyInputObject(joySticks_[i]);
444
445      joySticks_.clear();
446      joySticksSize_ = 0;
447      activeJoyStickHandlers_.clear();
448      joyStickButtonsDown_.clear();
449      povStates_.clear();
450      sliderStates_.clear();
451      joySticksCalibration_.clear();
452    }
453    CCOUT(ORX_DEBUG) << "Joy sticks destroyed." << std::endl;
454  }
455
456  void InputManager::_saveState()
457  {
458    savedHandlers_.activeHandlers_ = activeHandlers_;
459    savedHandlers_.activeJoyStickHandlers_ = activeJoyStickHandlers_;
460    savedHandlers_.activeKeyHandlers_ = activeKeyHandlers_;
461    savedHandlers_.activeMouseHandlers_ = activeMouseHandlers_;
462  }
463
464  void InputManager::_restoreState()
465  {
466    activeHandlers_ = savedHandlers_.activeHandlers_;
467    activeJoyStickHandlers_ = savedHandlers_.activeJoyStickHandlers_;
468    activeKeyHandlers_ = savedHandlers_.activeKeyHandlers_;
469    activeMouseHandlers_ = savedHandlers_.activeMouseHandlers_;
470  }
471
472  void InputManager::_updateTickables()
473  {
474    // we can use a map to have a list of unique pointers (an object can implement all 3 handlers)
475    std::map<InputTickable*, HandlerState> tempSet;
476    for (unsigned int iHandler = 0; iHandler < activeKeyHandlers_.size(); iHandler++)
477      tempSet[activeKeyHandlers_[iHandler]].joyStick = true;
478    for (unsigned int iHandler = 0; iHandler < activeMouseHandlers_.size(); iHandler++)
479      tempSet[activeMouseHandlers_[iHandler]].mouse = true;
480    for (unsigned int iJoyStick  = 0; iJoyStick < joySticksSize_; iJoyStick++)
481      for (unsigned int iHandler = 0; iHandler  < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
482        tempSet[activeJoyStickHandlers_[iJoyStick][iHandler]].joyStick = true;
483
484    // copy the content of the map back to the actual vector
485    activeHandlers_.clear();
486    for (std::map<InputTickable*, HandlerState>::const_iterator itHandler = tempSet.begin();
487        itHandler != tempSet.end(); itHandler++)
488      activeHandlers_.push_back(std::pair<InputTickable*, HandlerState>((*itHandler).first, (*itHandler).second));
489  }
490
491
492  // #################################
493  // ### Private Interface Methods ###
494  // #################################
495  // #################################
496
497  /**
498    @brief Updates the InputManager. Tick is called by Orxonox.
499    @param dt Delta time
500  */
501  void InputManager::tick(float dt)
502  {
503    if (state_ == IS_UNINIT)
504      return;
505
506    if (state_ != stateRequest_)
507    {
508      InputState sr = stateRequest_;
509      switch (sr)
510      {
511      case IS_NORMAL:
512        activeKeyHandlers_.clear();
513        activeMouseHandlers_.clear();
514        for (unsigned int i = 0; i < joySticksSize_; i++)
515          activeJoyStickHandlers_[i].clear();
516
517        // normal play mode
518        // note: we assume that the handlers exist since otherwise, something's wrong anyway.
519        enableKeyHandler("keybinder");
520        enableMouseHandler("keybinder");
521        enableJoyStickHandler("keybinder", 0);
522        stateRequest_ = IS_NORMAL;
523        state_ = IS_NORMAL;
524        break;
525
526      case IS_GUI:
527        state_ = IS_GUI;
528        break;
529
530      case IS_CONSOLE:
531        activeKeyHandlers_.clear();
532        activeMouseHandlers_.clear();
533        for (unsigned int i = 0; i < joySticksSize_; i++)
534          activeJoyStickHandlers_[i].clear();
535
536        enableMouseHandler("keybinder");
537        enableJoyStickHandler("keybinder", 0);
538        enableKeyHandler("buffer");
539        stateRequest_ = IS_CONSOLE;
540        state_ = IS_CONSOLE;
541        break;
542
543      case IS_DETECT:
544        savedState_ = state_;
545        _saveState();
546
547        activeKeyHandlers_.clear();
548        activeMouseHandlers_.clear();
549        for (unsigned int i = 0; i < joySticksSize_; i++)
550          activeJoyStickHandlers_[i].clear();
551
552        enableKeyHandler("keydetector");
553        enableMouseHandler("keydetector");
554        enableJoyStickHandler("keydetector", 0);
555
556        stateRequest_ = IS_DETECT;
557        state_ = IS_DETECT;
558        break;
559
560      case IS_NODETECT:
561        _restoreState();
562        state_ = IS_NODETECT;
563        stateRequest_ = savedState_;
564        break;
565
566      case IS_CALIBRATE:
567        if (joySticksSize_)
568        {
569          savedState_ = _getSingleton().state_;
570          for (unsigned int i = 0; i < 24; i++)
571          {
572            marginalsMax_[i] = INT_MIN;
573            marginalsMin_[i] = INT_MAX;
574          }
575          COUT(3) << "Move all joy stick axes in all directions a few times. "
576            << "Then put all axes in zero state and hit enter." << std::endl;
577
578          savedState_ = state_;
579          _saveState();
580
581          activeKeyHandlers_.clear();
582          activeMouseHandlers_.clear();
583          for (unsigned int i = 0; i < joySticksSize_; i++)
584            activeJoyStickHandlers_[i].clear();
585
586          enableKeyHandler("calibratorcallback");
587          stateRequest_ = IS_CALIBRATE;
588          state_ = IS_CALIBRATE;
589        }
590        else
591        {
592          COUT(3) << "Connot calibrate, no joy stick found!" << std::endl;
593          stateRequest_ = state_;
594        }
595        break;
596
597      case IS_NOCALIBRATE:
598        _completeCalibration();
599        _restoreState();
600        state_ = IS_NOCALIBRATE;
601        stateRequest_ = savedState_;
602        break;
603
604      case IS_NONE:
605        activeKeyHandlers_.clear();
606        activeMouseHandlers_.clear();
607        for (unsigned int i = 0; i < joySticksSize_; i++)
608          activeJoyStickHandlers_[i].clear();
609        state_ = IS_NONE;
610
611      default:
612        break;
613      }
614    }
615
616    // Capture all the input. This calls the event handlers in InputManager.
617    if (mouse_)
618      mouse_->capture();
619    if (keyboard_)
620      keyboard_->capture();
621    for (unsigned  int i = 0; i < joySticksSize_; i++)
622      joySticks_[i]->capture();
623
624    if (state_ != IS_CALIBRATE)
625    {
626      // call all the handlers for the held key events
627      for (unsigned int iKey = 0; iKey < keysDown_.size(); iKey++)
628        for (unsigned int iHandler = 0; iHandler < activeKeyHandlers_.size(); iHandler++)
629          activeKeyHandlers_[iHandler]->keyHeld(KeyEvent(keysDown_[iKey], keyboardModifiers_));
630
631      // call all the handlers for the held mouse button events
632      for (unsigned int iButton = 0; iButton < mouseButtonsDown_.size(); iButton++)
633        for (unsigned int iHandler = 0; iHandler < activeMouseHandlers_.size(); iHandler++)
634          activeMouseHandlers_[iHandler]->mouseButtonHeld(mouseButtonsDown_[iButton]);
635
636      // call all the handlers for the held joy stick button events
637      for (unsigned int iJoyStick  = 0; iJoyStick < joySticksSize_; iJoyStick++)
638        for (unsigned int iButton   = 0; iButton   < joyStickButtonsDown_[iJoyStick].size(); iButton++)
639          for (unsigned int iHandler = 0; iHandler  < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
640            activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickButtonHeld(iJoyStick, joyStickButtonsDown_[iJoyStick][iButton]);
641    }
642
643    // call the ticks for the handlers (need to be treated specially)
644    for (unsigned int iHandler = 0; iHandler < activeHandlers_.size(); iHandler++)
645      activeHandlers_[iHandler].first->tickInput(dt, activeHandlers_[iHandler].second);
646  }
647
648  void InputManager::_completeCalibration()
649  {
650    for (unsigned int i = 0; i < 24; i++)
651    {
652      // positive coefficient
653      if (marginalsMax_[i] == INT_MIN)
654        marginalsMax_[i] =  32767;
655      // coefficients
656      if (marginalsMax_[i] - joySticksCalibration_[0].zeroStates[i])
657        joySticksCalibration_[0].positiveCoeff[i] =  1.0f/(marginalsMax_[i] - joySticksCalibration_[0].zeroStates[i]);
658      else
659        joySticksCalibration_[0].positiveCoeff[i] =  1.0f;
660
661      // config value
662      ConfigValueContainer* cont = getIdentifier()->getConfigValueContainer("CoeffPos");
663      assert(cont);
664      cont->set(i, joySticksCalibration_[0].positiveCoeff[i]);
665
666      // negative coefficient
667      if (marginalsMin_[i] == INT_MAX)
668        marginalsMin_[i] = -32768;
669      // coefficients
670      if (marginalsMin_[i] - joySticksCalibration_[0].zeroStates[i])
671        joySticksCalibration_[0].negativeCoeff[i] = -1.0f/(marginalsMin_[i] - joySticksCalibration_[0].zeroStates[i]);
672      else
673        joySticksCalibration_[0].negativeCoeff[i] =  1.0f;
674      // config value
675      cont = getIdentifier()->getConfigValueContainer("CoeffNeg");
676      assert(cont);
677      cont->set(i, joySticksCalibration_[0].negativeCoeff[i]);
678
679      // zero states
680      if (i < 8)
681      {
682        if (!(i & 1))
683          joySticksCalibration_[0].zeroStates[i] = joySticks_[0]->getJoyStickState().mSliders[i/2].abX;
684        else
685          joySticksCalibration_[0].zeroStates[i] = joySticks_[0]->getJoyStickState().mSliders[i/2].abY;
686      }
687      else
688      {
689        if (i - 8 < joySticks_[0]->getJoyStickState().mAxes.size())
690          joySticksCalibration_[0].zeroStates[i] = joySticks_[0]->getJoyStickState().mAxes[i - 8].abs;
691        else
692          joySticksCalibration_[0].zeroStates[i] = 0;
693      }
694      // config value
695      cont = getIdentifier()->getConfigValueContainer("Zero");
696      assert(cont);
697      cont->set(i, joySticksCalibration_[0].zeroStates[i]);
698    }
699  }
700
701  // ###### Key Events ######
702
703  /**
704    @brief Event handler for the keyPressed Event.
705    @param e Event information
706  */
707  bool InputManager::keyPressed(const OIS::KeyEvent &e)
708  {
709    // check whether the key already is in the list (can happen when focus was lost)
710    unsigned int iKey = 0;
711    while (iKey < keysDown_.size() && keysDown_[iKey].key != (KeyCode::Enum)e.key)
712      iKey++;
713    if (iKey == keysDown_.size())
714      keysDown_.push_back(Key(e));
715
716    // update modifiers
717    if(e.key == OIS::KC_RMENU    || e.key == OIS::KC_LMENU)
718      keyboardModifiers_ |= KeyboardModifier::Alt;   // alt key
719    if(e.key == OIS::KC_RCONTROL || e.key == OIS::KC_LCONTROL)
720      keyboardModifiers_ |= KeyboardModifier::Ctrl;  // ctrl key
721    if(e.key == OIS::KC_RSHIFT   || e.key == OIS::KC_LSHIFT)
722      keyboardModifiers_ |= KeyboardModifier::Shift; // shift key
723
724    for (unsigned int i = 0; i < activeKeyHandlers_.size(); i++)
725      activeKeyHandlers_[i]->keyPressed(KeyEvent(e, keyboardModifiers_));
726
727    return true;
728  }
729
730  /**
731    @brief Event handler for the keyReleased Event.
732    @param e Event information
733  */
734  bool InputManager::keyReleased(const OIS::KeyEvent &e)
735  {
736    // remove the key from the keysDown_ list
737    for (unsigned int iKey = 0; iKey < keysDown_.size(); iKey++)
738    {
739      if (keysDown_[iKey].key == (KeyCode::Enum)e.key)
740      {
741        keysDown_.erase(keysDown_.begin() + iKey);
742        break;
743      }
744    }
745
746    // update modifiers
747    if(e.key == OIS::KC_RMENU    || e.key == OIS::KC_LMENU)
748      keyboardModifiers_ &= ~KeyboardModifier::Alt;   // alt key
749    if(e.key == OIS::KC_RCONTROL || e.key == OIS::KC_LCONTROL)
750      keyboardModifiers_ &= ~KeyboardModifier::Ctrl;  // ctrl key
751    if(e.key == OIS::KC_RSHIFT   || e.key == OIS::KC_LSHIFT)
752      keyboardModifiers_ &= ~KeyboardModifier::Shift; // shift key
753
754    for (unsigned int i = 0; i < activeKeyHandlers_.size(); i++)
755      activeKeyHandlers_[i]->keyReleased(KeyEvent(e, keyboardModifiers_));
756
757    return true;
758  }
759
760
761  // ###### Mouse Events ######
762
763  /**
764    @brief Event handler for the mouseMoved Event.
765    @param e Event information
766  */
767  bool InputManager::mouseMoved(const OIS::MouseEvent &e)
768  {
769    // check for actual moved event
770    if (e.state.X.rel != 0 || e.state.Y.rel != 0)
771    {
772      for (unsigned int i = 0; i < activeMouseHandlers_.size(); i++)
773        activeMouseHandlers_[i]->mouseMoved(IntVector2(e.state.X.abs, e.state.Y.abs),
774            IntVector2(e.state.X.rel, e.state.Y.rel), IntVector2(e.state.width, e.state.height));
775    }
776
777    // check for mouse scrolled event
778    if (e.state.Z.rel != 0)
779    {
780      for (unsigned int i = 0; i < activeMouseHandlers_.size(); i++)
781        activeMouseHandlers_[i]->mouseScrolled(e.state.Z.abs, e.state.Z.rel);
782    }
783
784    return true;
785  }
786
787  /**
788    @brief Event handler for the mousePressed Event.
789    @param e Event information
790    @param id The ID of the mouse button
791  */
792  bool InputManager::mousePressed(const OIS::MouseEvent &e, OIS::MouseButtonID id)
793  {
794    // check whether the button already is in the list (can happen when focus was lost)
795    unsigned int iButton = 0;
796    while (iButton < mouseButtonsDown_.size() && mouseButtonsDown_[iButton] != (MouseButton::Enum)id)
797      iButton++;
798    if (iButton == mouseButtonsDown_.size())
799      mouseButtonsDown_.push_back((MouseButton::Enum)id);
800
801    for (unsigned int i = 0; i < activeMouseHandlers_.size(); i++)
802      activeMouseHandlers_[i]->mouseButtonPressed((MouseButton::Enum)id);
803
804    return true;
805  }
806
807  /**
808    @brief Event handler for the mouseReleased Event.
809    @param e Event information
810    @param id The ID of the mouse button
811  */
812  bool InputManager::mouseReleased(const OIS::MouseEvent &e, OIS::MouseButtonID id)
813  {
814    // remove the button from the keysDown_ list
815    for (unsigned int iButton = 0; iButton < mouseButtonsDown_.size(); iButton++)
816    {
817      if (mouseButtonsDown_[iButton] == (MouseButton::Enum)id)
818      {
819        mouseButtonsDown_.erase(mouseButtonsDown_.begin() + iButton);
820        break;
821      }
822    }
823
824    for (unsigned int i = 0; i < activeMouseHandlers_.size(); i++)
825      activeMouseHandlers_[i]->mouseButtonReleased((MouseButton::Enum)id);
826
827    return true;
828  }
829
830
831  // ###### Joy Stick Events ######
832
833  inline unsigned int InputManager::_getJoystick(const OIS::JoyStickEvent& arg)
834  {
835    // use the device to identify which one called the method
836    OIS::JoyStick* joyStick = (OIS::JoyStick*)arg.device;
837    unsigned int iJoyStick = 0;
838    while (joySticks_[iJoyStick] != joyStick)
839    {
840      iJoyStick++;
841      if (iJoyStick == joySticksSize_)
842      {
843        CCOUT(3) << "Unknown joystick fired an event. This means there is a bug somewhere! Aborting." << std::endl;
844        abort();
845      }
846    }
847    return iJoyStick;
848  }
849
850  bool InputManager::buttonPressed(const OIS::JoyStickEvent &arg, int button)
851  {
852    unsigned int iJoyStick = _getJoystick(arg);
853
854    // check whether the button already is in the list (can happen when focus was lost)
855    std::vector<int>& buttonsDown = joyStickButtonsDown_[iJoyStick];
856    unsigned int iButton = 0;
857    while (iButton < buttonsDown.size() && buttonsDown[iButton] != button)
858      iButton++;
859    if (iButton == buttonsDown.size())
860      buttonsDown.push_back(button);
861
862    for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
863      activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickButtonPressed(iJoyStick, button);
864
865    return true;
866  }
867
868  bool InputManager::buttonReleased(const OIS::JoyStickEvent &arg, int button)
869  {
870    unsigned int iJoyStick = _getJoystick(arg);
871
872    // remove the button from the joyStickButtonsDown_ list
873    std::vector<int>& buttonsDown = joyStickButtonsDown_[iJoyStick];
874    for (unsigned int iButton = 0; iButton < buttonsDown.size(); iButton++)
875    {
876      if (buttonsDown[iButton] == button)
877      {
878        buttonsDown.erase(buttonsDown.begin() + iButton);
879        break;
880      }
881    }
882
883    for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
884      activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickButtonReleased(iJoyStick, button);
885
886    return true;
887  }
888
889  void InputManager::_fireAxis(unsigned int iJoyStick, int axis, int value)
890  {
891    if (state_ == IS_CALIBRATE)
892    {
893      if (value > marginalsMax_[axis])
894        marginalsMax_[axis] = value;
895      if (value < marginalsMin_[axis])
896        marginalsMin_[axis] = value;
897    }
898    else
899    {
900      float fValue = value - joySticksCalibration_[iJoyStick].zeroStates[axis];
901      if (fValue > 0.0f)
902        fValue *= joySticksCalibration_[iJoyStick].positiveCoeff[axis];
903      else
904        fValue *= joySticksCalibration_[iJoyStick].negativeCoeff[axis];
905
906      for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
907        activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickAxisMoved(iJoyStick, axis, fValue);
908    }
909  }
910
911  bool InputManager::axisMoved(const OIS::JoyStickEvent &arg, int axis)
912  {
913    //if (arg.state.mAxes[axis].abs > 10000 || arg.state.mAxes[axis].abs < -10000)
914    //{ CCOUT(3) << "axis " << axis << " moved" << arg.state.mAxes[axis].abs << std::endl;}
915
916    unsigned int iJoyStick = _getJoystick(arg);
917
918    // keep in mind that the first 8 axes are reserved for the sliders
919    _fireAxis(iJoyStick, axis + 8, arg.state.mAxes[axis].abs);
920
921    return true;
922  }
923
924  bool InputManager::sliderMoved(const OIS::JoyStickEvent &arg, int id)
925  {
926    //if (arg.state.mSliders[id].abX > 10000 || arg.state.mSliders[id].abX < -10000)
927    //{CCOUT(3) << "slider " << id << " moved" << arg.state.mSliders[id].abX << std::endl;}
928    //CCOUT(3) << arg.state.mSliders[id].abX << "\t |" << arg.state.mSliders[id].abY << std::endl;
929
930    unsigned int iJoyStick = _getJoystick(arg);
931
932    if (sliderStates_[iJoyStick].sliderStates[id].x != arg.state.mSliders[id].abX)
933      _fireAxis(iJoyStick, id * 2, arg.state.mSliders[id].abX);
934    else if (sliderStates_[iJoyStick].sliderStates[id].y != arg.state.mSliders[id].abY)
935      _fireAxis(iJoyStick, id * 2 + 1, arg.state.mSliders[id].abY);
936
937    return true;
938  }
939
940  bool InputManager::povMoved(const OIS::JoyStickEvent &arg, int id)
941  {
942    unsigned int iJoyStick = _getJoystick(arg);
943
944    // translate the POV into 8 simple buttons
945    int lastState = povStates_[iJoyStick][id];
946    if (lastState & OIS::Pov::North)
947      buttonReleased(arg, 32 + id * 4 + 0);
948    if (lastState & OIS::Pov::South)
949      buttonReleased(arg, 32 + id * 4 + 1);
950    if (lastState & OIS::Pov::East)
951      buttonReleased(arg, 32 + id * 4 + 2);
952    if (lastState & OIS::Pov::West)
953      buttonReleased(arg, 32 + id * 4 + 3);
954
955    povStates_[iJoyStick].povStates[id] = arg.state.mPOV[id].direction;
956
957    int currentState = povStates_[iJoyStick][id];
958    if (currentState & OIS::Pov::North)
959      buttonPressed(arg, 32 + id * 4 + 0);
960    if (currentState & OIS::Pov::South)
961      buttonPressed(arg, 32 + id * 4 + 1);
962    if (currentState & OIS::Pov::East)
963      buttonPressed(arg, 32 + id * 4 + 2);
964    if (currentState & OIS::Pov::West)
965      buttonPressed(arg, 32 + id * 4 + 3);
966
967    return true;
968  }
969
970  /*bool InputManager::vector3Moved(const OIS::JoyStickEvent &arg, int id)
971  {
972    unsigned int iJoyStick = _getJoystick(arg);
973
974    for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
975      activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickVector3Moved(JoyStickState(arg.state, iJoyStick), id);
976
977    return true;
978  }*/
979
980
981  // ################################
982  // ### Static Interface Methods ###
983  // ################################
984  // ################################
985
986  std::string InputManager::bindingCommmandString_s = "";
987
988  bool InputManager::initialise(const size_t windowHnd, int windowWidth, int windowHeight,
989    bool createKeyboard, bool createMouse, bool createJoySticks)
990  {
991    return _getSingleton()._initialise(windowHnd, windowWidth, windowHeight,
992          createKeyboard, createMouse, createJoySticks);
993  }
994
995  bool InputManager::initialiseKeyboard()
996  {
997    return _getSingleton()._initialiseKeyboard();
998  }
999
1000  bool InputManager::initialiseMouse()
1001  {
1002    return _getSingleton()._initialiseMouse();
1003  }
1004
1005  bool InputManager::initialiseJoySticks()
1006  {
1007    return _getSingleton()._initialiseJoySticks();
1008  }
1009
1010  int InputManager::numberOfKeyboards()
1011  {
1012    if (_getSingleton().keyboard_ != 0)
1013      return 1;
1014    else
1015      return 0;
1016  }
1017
1018  int InputManager::numberOfMice()
1019  {
1020    if (_getSingleton().mouse_ != 0)
1021      return 1;
1022    else
1023      return 0;
1024  }
1025
1026  int InputManager::numberOfJoySticks()
1027  {
1028    return _getSingleton().joySticksSize_;
1029  }
1030
1031  /*bool InputManager::isKeyDown(KeyCode::Enum key)
1032  {
1033    if (_getSingleton().keyboard_)
1034      return _getSingleton().keyboard_->isKeyDown((OIS::KeyCode)key);
1035    else
1036      return false;
1037  }*/
1038
1039  /*bool InputManager::isModifierDown(KeyboardModifier::Enum modifier)
1040  {
1041    if (_getSingleton().keyboard_)
1042      return isModifierDown(modifier);
1043    else
1044      return false;
1045  }*/
1046
1047  /*const MouseState InputManager::getMouseState()
1048  {
1049    if (_getSingleton().mouse_)
1050      return _getSingleton().mouse_->getMouseState();
1051    else
1052      return MouseState();
1053  }*/
1054
1055  /*const JoyStickState InputManager::getJoyStickState(unsigned int ID)
1056  {
1057    if (ID < _getSingleton().joySticksSize_)
1058      return JoyStickState(_getSingleton().joySticks_[ID]->getJoyStickState(), ID);
1059    else
1060      return JoyStickState();
1061  }*/
1062
1063  void InputManager::destroy()
1064  {
1065    _getSingleton()._destroy();
1066  }
1067
1068  void InputManager::destroyKeyboard()
1069  {
1070    return _getSingleton()._destroyKeyboard();
1071  }
1072
1073  void InputManager::destroyMouse()
1074  {
1075    return _getSingleton()._destroyMouse();
1076  }
1077
1078  void InputManager::destroyJoySticks()
1079  {
1080    return _getSingleton()._destroyJoySticks();
1081  }
1082
1083
1084  /**
1085    @brief Adjusts the mouse window metrics.
1086    This method has to be called every time the size of the window changes.
1087    @param width The new width of the render window
1088    @param height the new height of the render window
1089  */
1090  void InputManager::setWindowExtents(const int width, const int height)
1091  {
1092    if (_getSingleton().mouse_)
1093    {
1094      // Set mouse region (if window resizes, we should alter this to reflect as well)
1095      const OIS::MouseState &mouseState = _getSingleton().mouse_->getMouseState();
1096      mouseState.width  = width;
1097      mouseState.height = height;
1098    }
1099  }
1100
1101  /**
1102    @brief Sets the input mode to either GUI, inGame or Buffer
1103    @param mode The new input mode
1104    @remark Only has an affect if the mode actually changes
1105  */
1106  void InputManager::setInputState(const InputState state)
1107  {
1108    _getSingleton().stateRequest_ = state;
1109  }
1110
1111  /**
1112    @brief Returns the current input handling method
1113    @return The current input mode.
1114  */
1115  InputManager::InputState InputManager::getInputState()
1116  {
1117    return _getSingleton().state_;
1118  }
1119
1120  void InputManager::storeKeyStroke(const std::string& name)
1121  {
1122    setInputState(IS_NODETECT);
1123    COUT(3) << "Binding string \"" << bindingCommmandString_s << "\" on key '" << name << "'" << std::endl;
1124    CommandExecutor::execute("set KeyBinder " + name + " " + bindingCommmandString_s, false);
1125  }
1126
1127  void InputManager::keyBind(const std::string& command)
1128  {
1129    bindingCommmandString_s = command;
1130    setInputState(IS_DETECT);
1131    COUT(3) << "Press any button/key or move a mouse/joystick axis" << std::endl;
1132  }
1133
1134  void InputManager::calibrate()
1135  {
1136    _getSingleton().setInputState(IS_CALIBRATE);
1137  }
1138
1139  // ###### KeyHandler ######
1140
1141  /**
1142    @brief Adds a new key handler.
1143    @param handler Pointer to the handler object.
1144    @param name Unique name of the handler.
1145    @return True if added, false if name already existed.
1146  */
1147  bool InputManager::addKeyHandler(KeyHandler* handler, const std::string& name)
1148  {
1149    if (!handler)
1150      return false;
1151    if (_getSingleton().keyHandlers_.find(name) == _getSingleton().keyHandlers_.end())
1152    {
1153      _getSingleton().keyHandlers_[name] = handler;
1154      return true;
1155    }
1156    else
1157      return false;
1158  }
1159
1160  /**
1161    @brief Removes a Key handler from the list.
1162    @param name Unique name of the handler.
1163    @return True if removal was successful, false if name was not found.
1164  */
1165  bool InputManager::removeKeyHandler(const std::string &name)
1166  {
1167    disableKeyHandler(name);
1168    std::map<std::string, KeyHandler*>::iterator it = _getSingleton().keyHandlers_.find(name);
1169    if (it != _getSingleton().keyHandlers_.end())
1170    {
1171      _getSingleton().keyHandlers_.erase(it);
1172      return true;
1173    }
1174    else
1175      return false;
1176  }
1177
1178  /**
1179    @brief Returns the pointer to a handler.
1180    @param name Unique name of the handler.
1181    @return Pointer to the instance, 0 if name was not found.
1182  */
1183  KeyHandler* InputManager::getKeyHandler(const std::string& name)
1184  {
1185    std::map<std::string, KeyHandler*>::iterator it = _getSingleton().keyHandlers_.find(name);
1186    if (it != _getSingleton().keyHandlers_.end())
1187    {
1188      return (*it).second;
1189    }
1190    else
1191      return 0;
1192  }
1193
1194  /**
1195    @brief Enables a specific key handler that has already been added.
1196    @param name Unique name of the handler.
1197    @return False if name was not found, true otherwise.
1198  */
1199  bool InputManager::enableKeyHandler(const std::string& name)
1200  {
1201    // get pointer from the map with all stored handlers
1202    std::map<std::string, KeyHandler*>::const_iterator mapIt = _getSingleton().keyHandlers_.find(name);
1203    if (mapIt == _getSingleton().keyHandlers_.end())
1204      return false;
1205    // see whether the handler already is in the list
1206    for (std::vector<KeyHandler*>::iterator it = _getSingleton().activeKeyHandlers_.begin();
1207          it != _getSingleton().activeKeyHandlers_.end(); it++)
1208    {
1209      if ((*it) == (*mapIt).second)
1210      {
1211        return true;
1212      }
1213    }
1214    _getSingleton().activeKeyHandlers_.push_back((*mapIt).second);
1215    _getSingleton().stateRequest_ = IS_CUSTOM;
1216    _getSingleton()._updateTickables();
1217    return true;
1218  }
1219
1220  /**
1221    @brief Disables a specific key handler.
1222    @param name Unique name of the handler.
1223    @return False if name was not found, true otherwise.
1224  */
1225  bool InputManager::disableKeyHandler(const std::string &name)
1226  {
1227    // get pointer from the map with all stored handlers
1228    std::map<std::string, KeyHandler*>::const_iterator mapIt = _getSingleton().keyHandlers_.find(name);
1229    if (mapIt == _getSingleton().keyHandlers_.end())
1230      return false;
1231    // look for the handler in the list
1232    for (std::vector<KeyHandler*>::iterator it = _getSingleton().activeKeyHandlers_.begin();
1233          it != _getSingleton().activeKeyHandlers_.end(); it++)
1234    {
1235      if ((*it) == (*mapIt).second)
1236      {
1237        _getSingleton().activeKeyHandlers_.erase(it);
1238        _getSingleton().stateRequest_ = IS_CUSTOM;
1239        _getSingleton()._updateTickables();
1240        return true;
1241      }
1242    }
1243    return true;
1244  }
1245
1246  /**
1247    @brief Checks whether a key handler is active
1248    @param name Unique name of the handler.
1249    @return False if key handler is not active or doesn't exist, true otherwise.
1250  */
1251  bool InputManager::isKeyHandlerActive(const std::string& name)
1252  {
1253    // get pointer from the map with all stored handlers
1254    std::map<std::string, KeyHandler*>::const_iterator mapIt = _getSingleton().keyHandlers_.find(name);
1255    if (mapIt == _getSingleton().keyHandlers_.end())
1256      return false;
1257    // see whether the handler already is in the list
1258    for (std::vector<KeyHandler*>::iterator it = _getSingleton().activeKeyHandlers_.begin();
1259          it != _getSingleton().activeKeyHandlers_.end(); it++)
1260    {
1261      if ((*it) == (*mapIt).second)
1262        return true;
1263    }
1264    return false;
1265  }
1266
1267
1268  // ###### MouseHandler ######
1269  /**
1270    @brief Adds a new mouse handler.
1271    @param handler Pointer to the handler object.
1272    @param name Unique name of the handler.
1273    @return True if added, false if name already existed.
1274  */
1275  bool InputManager::addMouseHandler(MouseHandler* handler, const std::string& name)
1276  {
1277    if (!handler)
1278      return false;
1279    if (_getSingleton().mouseHandlers_.find(name) == _getSingleton().mouseHandlers_.end())
1280    {
1281      _getSingleton().mouseHandlers_[name] = handler;
1282      return true;
1283    }
1284    else
1285      return false;
1286  }
1287
1288  /**
1289    @brief Removes a Mouse handler from the list.
1290    @param name Unique name of the handler.
1291    @return True if removal was successful, false if name was not found.
1292  */
1293  bool InputManager::removeMouseHandler(const std::string &name)
1294  {
1295    disableMouseHandler(name);
1296    std::map<std::string, MouseHandler*>::iterator it = _getSingleton().mouseHandlers_.find(name);
1297    if (it != _getSingleton().mouseHandlers_.end())
1298    {
1299      _getSingleton().mouseHandlers_.erase(it);
1300      return true;
1301    }
1302    else
1303      return false;
1304  }
1305
1306  /**
1307    @brief Returns the pointer to a handler.
1308    @param name Unique name of the handler.
1309    @return Pointer to the instance, 0 if name was not found.
1310  */
1311  MouseHandler* InputManager::getMouseHandler(const std::string& name)
1312  {
1313    std::map<std::string, MouseHandler*>::iterator it = _getSingleton().mouseHandlers_.find(name);
1314    if (it != _getSingleton().mouseHandlers_.end())
1315    {
1316      return (*it).second;
1317    }
1318    else
1319      return 0;
1320  }
1321
1322  /**
1323    @brief Enables a specific mouse handler that has already been added.
1324    @param name Unique name of the handler.
1325    @return False if name was not found, true otherwise.
1326  */
1327  bool InputManager::enableMouseHandler(const std::string& name)
1328  {
1329    // get pointer from the map with all stored handlers
1330    std::map<std::string, MouseHandler*>::const_iterator mapIt = _getSingleton().mouseHandlers_.find(name);
1331    if (mapIt == _getSingleton().mouseHandlers_.end())
1332      return false;
1333    // see whether the handler already is in the list
1334    for (std::vector<MouseHandler*>::iterator it = _getSingleton().activeMouseHandlers_.begin();
1335          it != _getSingleton().activeMouseHandlers_.end(); it++)
1336    {
1337      if ((*it) == (*mapIt).second)
1338      {
1339        return true;
1340      }
1341    }
1342    _getSingleton().activeMouseHandlers_.push_back((*mapIt).second);
1343    _getSingleton().stateRequest_ = IS_CUSTOM;
1344    _getSingleton()._updateTickables();
1345    return true;
1346  }
1347
1348  /**
1349    @brief Disables a specific mouse handler.
1350    @param name Unique name of the handler.
1351    @return False if name was not found, true otherwise.
1352  */
1353  bool InputManager::disableMouseHandler(const std::string &name)
1354  {
1355    // get pointer from the map with all stored handlers
1356    std::map<std::string, MouseHandler*>::const_iterator mapIt = _getSingleton().mouseHandlers_.find(name);
1357    if (mapIt == _getSingleton().mouseHandlers_.end())
1358      return false;
1359    // look for the handler in the list
1360    for (std::vector<MouseHandler*>::iterator it = _getSingleton().activeMouseHandlers_.begin();
1361          it != _getSingleton().activeMouseHandlers_.end(); it++)
1362    {
1363      if ((*it) == (*mapIt).second)
1364      {
1365        _getSingleton().activeMouseHandlers_.erase(it);
1366        _getSingleton().stateRequest_ = IS_CUSTOM;
1367        _getSingleton()._updateTickables();
1368        return true;
1369      }
1370    }
1371    return true;
1372  }
1373
1374  /**
1375    @brief Checks whether a mouse handler is active
1376    @param name Unique name of the handler.
1377    @return False if key handler is not active or doesn't exist, true otherwise.
1378  */
1379  bool InputManager::isMouseHandlerActive(const std::string& name)
1380  {
1381    // get pointer from the map with all stored handlers
1382    std::map<std::string, MouseHandler*>::const_iterator mapIt = _getSingleton().mouseHandlers_.find(name);
1383    if (mapIt == _getSingleton().mouseHandlers_.end())
1384      return false;
1385    // see whether the handler already is in the list
1386    for (std::vector<MouseHandler*>::iterator it = _getSingleton().activeMouseHandlers_.begin();
1387          it != _getSingleton().activeMouseHandlers_.end(); it++)
1388    {
1389      if ((*it) == (*mapIt).second)
1390        return true;
1391    }
1392    return false;
1393  }
1394
1395
1396  // ###### JoyStickHandler ######
1397
1398  /**
1399    @brief Adds a new joy stick handler.
1400    @param handler Pointer to the handler object.
1401    @param name Unique name of the handler.
1402    @return True if added, false if name already existed.
1403  */
1404  bool InputManager::addJoyStickHandler(JoyStickHandler* handler, const std::string& name)
1405  {
1406    if (!handler)
1407      return false;
1408    if (_getSingleton().joyStickHandlers_.find(name) == _getSingleton().joyStickHandlers_.end())
1409    {
1410      _getSingleton().joyStickHandlers_[name] = handler;
1411      return true;
1412    }
1413    else
1414      return false;
1415  }
1416
1417  /**
1418    @brief Removes a JoyStick handler from the list.
1419    @param name Unique name of the handler.
1420    @return True if removal was successful, false if name was not found.
1421  */
1422  bool InputManager::removeJoyStickHandler(const std::string &name)
1423  {
1424    for (std::vector<OIS::JoyStick*>::iterator itstick = _getSingleton().joySticks_.begin();
1425          itstick != _getSingleton().joySticks_.end(); itstick++)
1426      disableJoyStickHandler(name, itstick - _getSingleton().joySticks_.begin());
1427
1428    std::map<std::string, JoyStickHandler*>::iterator it = _getSingleton().joyStickHandlers_.find(name);
1429    if (it != _getSingleton().joyStickHandlers_.end())
1430    {
1431      _getSingleton().joyStickHandlers_.erase(it);
1432      return true;
1433    }
1434    else
1435      return false;
1436  }
1437
1438  /**
1439    @brief Returns the pointer to a handler.
1440    @param name Unique name of the handler.
1441    @return Pointer to the instance, 0 if name was not found.
1442  */
1443  JoyStickHandler* InputManager::getJoyStickHandler(const std::string& name)
1444  {
1445    std::map<std::string, JoyStickHandler*>::iterator it = _getSingleton().joyStickHandlers_.find(name);
1446    if (it != _getSingleton().joyStickHandlers_.end())
1447    {
1448      return (*it).second;
1449    }
1450    else
1451      return 0;
1452  }
1453
1454  /**
1455    @brief Enables a specific joy stick handler that has already been added.
1456    @param name Unique name of the handler.
1457    @return False if name or id was not found, true otherwise.
1458  */
1459  bool InputManager::enableJoyStickHandler(const std::string& name, unsigned int ID)
1460  {
1461    // get handler pointer from the map with all stored handlers
1462    std::map<std::string, JoyStickHandler*>::const_iterator handlerIt = _getSingleton().joyStickHandlers_.find(name);
1463    if (handlerIt == _getSingleton().joyStickHandlers_.end())
1464      return false;
1465
1466    // check for existence of the ID
1467    if (ID >= _getSingleton().joySticksSize_)
1468      return false;
1469
1470    // see whether the handler already is in the list
1471    for (std::vector<JoyStickHandler*>::iterator it = _getSingleton().activeJoyStickHandlers_[ID].begin();
1472          it != _getSingleton().activeJoyStickHandlers_[ID].end(); it++)
1473    {
1474      if ((*it) == (*handlerIt).second)
1475      {
1476        return true;
1477      }
1478    }
1479    _getSingleton().activeJoyStickHandlers_[ID].push_back((*handlerIt).second);
1480    _getSingleton().stateRequest_ = IS_CUSTOM;
1481    _getSingleton()._updateTickables();
1482    return true;
1483  }
1484
1485  /**
1486    @brief Disables a specific joy stick handler.
1487    @param name Unique name of the handler.
1488    @return False if name or id was not found, true otherwise.
1489  */
1490  bool InputManager::disableJoyStickHandler(const std::string &name, unsigned int ID)
1491  {
1492    // get handler pointer from the map with all stored handlers
1493    std::map<std::string, JoyStickHandler*>::const_iterator handlerIt = _getSingleton().joyStickHandlers_.find(name);
1494    if (handlerIt == _getSingleton().joyStickHandlers_.end())
1495      return false;
1496
1497    // check for existence of the ID
1498    if (ID >= _getSingleton().joySticksSize_)
1499      return false;
1500
1501    // look for the handler in the list
1502    for (std::vector<JoyStickHandler*>::iterator it = _getSingleton().activeJoyStickHandlers_[ID].begin();
1503          it != _getSingleton().activeJoyStickHandlers_[ID].end(); it++)
1504    {
1505      if ((*it) == (*handlerIt).second)
1506      {
1507        _getSingleton().activeJoyStickHandlers_[ID].erase(it);
1508        _getSingleton().stateRequest_ = IS_CUSTOM;
1509        _getSingleton()._updateTickables();
1510        return true;
1511      }
1512    }
1513    return true;
1514  }
1515
1516  /**
1517    @brief Checks whether a joy stick handler is active
1518    @param name Unique name of the handler.
1519    @return False if key handler is not active or doesn't exist, true otherwise.
1520  */
1521  bool InputManager::isJoyStickHandlerActive(const std::string& name, unsigned int ID)
1522  {
1523    // get handler pointer from the map with all stored handlers
1524    std::map<std::string, JoyStickHandler*>::const_iterator handlerIt = _getSingleton().joyStickHandlers_.find(name);
1525    if (handlerIt == _getSingleton().joyStickHandlers_.end())
1526      return false;
1527
1528    // check for existence of the ID
1529    if (ID >= _getSingleton().joySticksSize_)
1530      return false;
1531
1532    // see whether the handler already is in the list
1533    for (std::vector<JoyStickHandler*>::iterator it = _getSingleton().activeJoyStickHandlers_[ID].begin();
1534          it != _getSingleton().activeJoyStickHandlers_[ID].end(); it++)
1535    {
1536      if ((*it) == (*handlerIt).second)
1537        return true;
1538    }
1539    return false;
1540  }
1541
1542}
Note: See TracBrowser for help on using the repository browser.