Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 1468 was 1468, checked in by rgrieder, 16 years ago
  • InGameConsole: - Tickable —> TickableReal (cursor now blinks independently of timeFactor_)
    • made console scroll down speed independent of frame rate
  • InputManager: - COUT(1) —> COUT(0)
File size: 49.0 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Reto Grieder
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30  @file
31  @brief Implementation of 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        keysDown_.clear();
563        mouseButtonsDown_.clear();
564        joyStickButtonsDown_[0].clear();
565        state_ = IS_NODETECT;
566        stateRequest_ = savedState_;
567        break;
568
569      case IS_CALIBRATE:
570        if (joySticksSize_)
571        {
572          savedState_ = _getSingleton().state_;
573          for (unsigned int i = 0; i < 24; i++)
574          {
575            marginalsMax_[i] = INT_MIN;
576            marginalsMin_[i] = INT_MAX;
577          }
578          COUT(0) << "Move all joy stick axes in all directions a few times. "
579            << "Then put all axes in zero state and hit enter." << std::endl;
580
581          savedState_ = state_;
582          _saveState();
583
584          activeKeyHandlers_.clear();
585          activeMouseHandlers_.clear();
586          for (unsigned int i = 0; i < joySticksSize_; i++)
587            activeJoyStickHandlers_[i].clear();
588
589          enableKeyHandler("calibratorcallback");
590          stateRequest_ = IS_CALIBRATE;
591          state_ = IS_CALIBRATE;
592        }
593        else
594        {
595          COUT(3) << "Connot calibrate, no joy stick found!" << std::endl;
596          stateRequest_ = state_;
597        }
598        break;
599
600      case IS_NOCALIBRATE:
601        _completeCalibration();
602        _restoreState();
603        keyBinder_->resetJoyStickAxes();
604        state_ = IS_NOCALIBRATE;
605        stateRequest_ = savedState_;
606        break;
607
608      case IS_NONE:
609        activeKeyHandlers_.clear();
610        activeMouseHandlers_.clear();
611        for (unsigned int i = 0; i < joySticksSize_; i++)
612          activeJoyStickHandlers_[i].clear();
613        state_ = IS_NONE;
614
615      default:
616        break;
617      }
618    }
619
620    // Capture all the input. This calls the event handlers in InputManager.
621    if (mouse_)
622      mouse_->capture();
623    if (keyboard_)
624      keyboard_->capture();
625    for (unsigned  int i = 0; i < joySticksSize_; i++)
626      joySticks_[i]->capture();
627
628    if (state_ != IS_CALIBRATE)
629    {
630      // call all the handlers for the held key events
631      for (unsigned int iKey = 0; iKey < keysDown_.size(); iKey++)
632        for (unsigned int iHandler = 0; iHandler < activeKeyHandlers_.size(); iHandler++)
633          activeKeyHandlers_[iHandler]->keyHeld(KeyEvent(keysDown_[iKey], keyboardModifiers_));
634
635      // call all the handlers for the held mouse button events
636      for (unsigned int iButton = 0; iButton < mouseButtonsDown_.size(); iButton++)
637        for (unsigned int iHandler = 0; iHandler < activeMouseHandlers_.size(); iHandler++)
638          activeMouseHandlers_[iHandler]->mouseButtonHeld(mouseButtonsDown_[iButton]);
639
640      // call all the handlers for the held joy stick button events
641      for (unsigned int iJoyStick  = 0; iJoyStick < joySticksSize_; iJoyStick++)
642        for (unsigned int iButton   = 0; iButton   < joyStickButtonsDown_[iJoyStick].size(); iButton++)
643          for (unsigned int iHandler = 0; iHandler  < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
644            activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickButtonHeld(iJoyStick, joyStickButtonsDown_[iJoyStick][iButton]);
645    }
646
647    // call the ticks for the handlers (need to be treated specially)
648    for (unsigned int iHandler = 0; iHandler < activeHandlers_.size(); iHandler++)
649      activeHandlers_[iHandler].first->tickInput(dt, activeHandlers_[iHandler].second);
650  }
651
652  void InputManager::_completeCalibration()
653  {
654    for (unsigned int i = 0; i < 24; i++)
655    {
656      // positive coefficient
657      if (marginalsMax_[i] == INT_MIN)
658        marginalsMax_[i] =  32767;
659      // coefficients
660      if (marginalsMax_[i] - joySticksCalibration_[0].zeroStates[i])
661        joySticksCalibration_[0].positiveCoeff[i] =  1.0f/(marginalsMax_[i] - joySticksCalibration_[0].zeroStates[i]);
662      else
663        joySticksCalibration_[0].positiveCoeff[i] =  1.0f;
664
665      // config value
666      ConfigValueContainer* cont = getIdentifier()->getConfigValueContainer("CoeffPos");
667      assert(cont);
668      cont->set(i, joySticksCalibration_[0].positiveCoeff[i]);
669
670      // negative coefficient
671      if (marginalsMin_[i] == INT_MAX)
672        marginalsMin_[i] = -32768;
673      // coefficients
674      if (marginalsMin_[i] - joySticksCalibration_[0].zeroStates[i])
675        joySticksCalibration_[0].negativeCoeff[i] = -1.0f/(marginalsMin_[i] - joySticksCalibration_[0].zeroStates[i]);
676      else
677        joySticksCalibration_[0].negativeCoeff[i] =  1.0f;
678      // config value
679      cont = getIdentifier()->getConfigValueContainer("CoeffNeg");
680      assert(cont);
681      cont->set(i, joySticksCalibration_[0].negativeCoeff[i]);
682
683      // zero states
684      if (i < 8)
685      {
686        if (!(i & 1))
687          joySticksCalibration_[0].zeroStates[i] = joySticks_[0]->getJoyStickState().mSliders[i/2].abX;
688        else
689          joySticksCalibration_[0].zeroStates[i] = joySticks_[0]->getJoyStickState().mSliders[i/2].abY;
690      }
691      else
692      {
693        if (i - 8 < joySticks_[0]->getJoyStickState().mAxes.size())
694          joySticksCalibration_[0].zeroStates[i] = joySticks_[0]->getJoyStickState().mAxes[i - 8].abs;
695        else
696          joySticksCalibration_[0].zeroStates[i] = 0;
697      }
698      // config value
699      cont = getIdentifier()->getConfigValueContainer("Zero");
700      assert(cont);
701      cont->set(i, joySticksCalibration_[0].zeroStates[i]);
702    }
703  }
704
705  // ###### Key Events ######
706
707  /**
708    @brief Event handler for the keyPressed Event.
709    @param e Event information
710  */
711  bool InputManager::keyPressed(const OIS::KeyEvent &e)
712  {
713    // check whether the key already is in the list (can happen when focus was lost)
714    unsigned int iKey = 0;
715    while (iKey < keysDown_.size() && keysDown_[iKey].key != (KeyCode::Enum)e.key)
716      iKey++;
717    if (iKey == keysDown_.size())
718      keysDown_.push_back(Key(e));
719
720    // update modifiers
721    if(e.key == OIS::KC_RMENU    || e.key == OIS::KC_LMENU)
722      keyboardModifiers_ |= KeyboardModifier::Alt;   // alt key
723    if(e.key == OIS::KC_RCONTROL || e.key == OIS::KC_LCONTROL)
724      keyboardModifiers_ |= KeyboardModifier::Ctrl;  // ctrl key
725    if(e.key == OIS::KC_RSHIFT   || e.key == OIS::KC_LSHIFT)
726      keyboardModifiers_ |= KeyboardModifier::Shift; // shift key
727
728    for (unsigned int i = 0; i < activeKeyHandlers_.size(); i++)
729      activeKeyHandlers_[i]->keyPressed(KeyEvent(e, keyboardModifiers_));
730
731    return true;
732  }
733
734  /**
735    @brief Event handler for the keyReleased Event.
736    @param e Event information
737  */
738  bool InputManager::keyReleased(const OIS::KeyEvent &e)
739  {
740    // remove the key from the keysDown_ list
741    for (unsigned int iKey = 0; iKey < keysDown_.size(); iKey++)
742    {
743      if (keysDown_[iKey].key == (KeyCode::Enum)e.key)
744      {
745        keysDown_.erase(keysDown_.begin() + iKey);
746        break;
747      }
748    }
749
750    // update modifiers
751    if(e.key == OIS::KC_RMENU    || e.key == OIS::KC_LMENU)
752      keyboardModifiers_ &= ~KeyboardModifier::Alt;   // alt key
753    if(e.key == OIS::KC_RCONTROL || e.key == OIS::KC_LCONTROL)
754      keyboardModifiers_ &= ~KeyboardModifier::Ctrl;  // ctrl key
755    if(e.key == OIS::KC_RSHIFT   || e.key == OIS::KC_LSHIFT)
756      keyboardModifiers_ &= ~KeyboardModifier::Shift; // shift key
757
758    for (unsigned int i = 0; i < activeKeyHandlers_.size(); i++)
759      activeKeyHandlers_[i]->keyReleased(KeyEvent(e, keyboardModifiers_));
760
761    return true;
762  }
763
764
765  // ###### Mouse Events ######
766
767  /**
768    @brief Event handler for the mouseMoved Event.
769    @param e Event information
770  */
771  bool InputManager::mouseMoved(const OIS::MouseEvent &e)
772  {
773    // check for actual moved event
774    if (e.state.X.rel != 0 || e.state.Y.rel != 0)
775    {
776      for (unsigned int i = 0; i < activeMouseHandlers_.size(); i++)
777        activeMouseHandlers_[i]->mouseMoved(IntVector2(e.state.X.abs, e.state.Y.abs),
778            IntVector2(e.state.X.rel, e.state.Y.rel), IntVector2(e.state.width, e.state.height));
779    }
780
781    // check for mouse scrolled event
782    if (e.state.Z.rel != 0)
783    {
784      for (unsigned int i = 0; i < activeMouseHandlers_.size(); i++)
785        activeMouseHandlers_[i]->mouseScrolled(e.state.Z.abs, e.state.Z.rel);
786    }
787
788    return true;
789  }
790
791  /**
792    @brief Event handler for the mousePressed Event.
793    @param e Event information
794    @param id The ID of the mouse button
795  */
796  bool InputManager::mousePressed(const OIS::MouseEvent &e, OIS::MouseButtonID id)
797  {
798    // check whether the button already is in the list (can happen when focus was lost)
799    unsigned int iButton = 0;
800    while (iButton < mouseButtonsDown_.size() && mouseButtonsDown_[iButton] != (MouseButton::Enum)id)
801      iButton++;
802    if (iButton == mouseButtonsDown_.size())
803      mouseButtonsDown_.push_back((MouseButton::Enum)id);
804
805    for (unsigned int i = 0; i < activeMouseHandlers_.size(); i++)
806      activeMouseHandlers_[i]->mouseButtonPressed((MouseButton::Enum)id);
807
808    return true;
809  }
810
811  /**
812    @brief Event handler for the mouseReleased Event.
813    @param e Event information
814    @param id The ID of the mouse button
815  */
816  bool InputManager::mouseReleased(const OIS::MouseEvent &e, OIS::MouseButtonID id)
817  {
818    // remove the button from the keysDown_ list
819    for (unsigned int iButton = 0; iButton < mouseButtonsDown_.size(); iButton++)
820    {
821      if (mouseButtonsDown_[iButton] == (MouseButton::Enum)id)
822      {
823        mouseButtonsDown_.erase(mouseButtonsDown_.begin() + iButton);
824        break;
825      }
826    }
827
828    for (unsigned int i = 0; i < activeMouseHandlers_.size(); i++)
829      activeMouseHandlers_[i]->mouseButtonReleased((MouseButton::Enum)id);
830
831    return true;
832  }
833
834
835  // ###### Joy Stick Events ######
836
837  inline unsigned int InputManager::_getJoystick(const OIS::JoyStickEvent& arg)
838  {
839    // use the device to identify which one called the method
840    OIS::JoyStick* joyStick = (OIS::JoyStick*)arg.device;
841    unsigned int iJoyStick = 0;
842    while (joySticks_[iJoyStick] != joyStick)
843    {
844      iJoyStick++;
845      if (iJoyStick == joySticksSize_)
846      {
847        CCOUT(3) << "Unknown joystick fired an event. This means there is a bug somewhere! Aborting." << std::endl;
848        abort();
849      }
850    }
851    return iJoyStick;
852  }
853
854  bool InputManager::buttonPressed(const OIS::JoyStickEvent &arg, int button)
855  {
856    unsigned int iJoyStick = _getJoystick(arg);
857
858    // check whether the button already is in the list (can happen when focus was lost)
859    std::vector<int>& buttonsDown = joyStickButtonsDown_[iJoyStick];
860    unsigned int iButton = 0;
861    while (iButton < buttonsDown.size() && buttonsDown[iButton] != button)
862      iButton++;
863    if (iButton == buttonsDown.size())
864      buttonsDown.push_back(button);
865
866    for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
867      activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickButtonPressed(iJoyStick, button);
868
869    return true;
870  }
871
872  bool InputManager::buttonReleased(const OIS::JoyStickEvent &arg, int button)
873  {
874    unsigned int iJoyStick = _getJoystick(arg);
875
876    // remove the button from the joyStickButtonsDown_ list
877    std::vector<int>& buttonsDown = joyStickButtonsDown_[iJoyStick];
878    for (unsigned int iButton = 0; iButton < buttonsDown.size(); iButton++)
879    {
880      if (buttonsDown[iButton] == button)
881      {
882        buttonsDown.erase(buttonsDown.begin() + iButton);
883        break;
884      }
885    }
886
887    for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
888      activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickButtonReleased(iJoyStick, button);
889
890    return true;
891  }
892
893  void InputManager::_fireAxis(unsigned int iJoyStick, int axis, int value)
894  {
895    if (state_ == IS_CALIBRATE)
896    {
897      if (value > marginalsMax_[axis])
898        marginalsMax_[axis] = value;
899      if (value < marginalsMin_[axis])
900        marginalsMin_[axis] = value;
901    }
902    else
903    {
904      float fValue = value - joySticksCalibration_[iJoyStick].zeroStates[axis];
905      if (fValue > 0.0f)
906        fValue *= joySticksCalibration_[iJoyStick].positiveCoeff[axis];
907      else
908        fValue *= joySticksCalibration_[iJoyStick].negativeCoeff[axis];
909
910      for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
911        activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickAxisMoved(iJoyStick, axis, fValue);
912    }
913  }
914
915  bool InputManager::axisMoved(const OIS::JoyStickEvent &arg, int axis)
916  {
917    //if (arg.state.mAxes[axis].abs > 10000 || arg.state.mAxes[axis].abs < -10000)
918    //{ CCOUT(3) << "axis " << axis << " moved" << arg.state.mAxes[axis].abs << std::endl;}
919
920    unsigned int iJoyStick = _getJoystick(arg);
921
922    // keep in mind that the first 8 axes are reserved for the sliders
923    _fireAxis(iJoyStick, axis + 8, arg.state.mAxes[axis].abs);
924
925    return true;
926  }
927
928  bool InputManager::sliderMoved(const OIS::JoyStickEvent &arg, int id)
929  {
930    //if (arg.state.mSliders[id].abX > 10000 || arg.state.mSliders[id].abX < -10000)
931    //{CCOUT(3) << "slider " << id << " moved" << arg.state.mSliders[id].abX << std::endl;}
932    //CCOUT(3) << arg.state.mSliders[id].abX << "\t |" << arg.state.mSliders[id].abY << std::endl;
933
934    unsigned int iJoyStick = _getJoystick(arg);
935
936    if (sliderStates_[iJoyStick].sliderStates[id].x != arg.state.mSliders[id].abX)
937      _fireAxis(iJoyStick, id * 2, arg.state.mSliders[id].abX);
938    else if (sliderStates_[iJoyStick].sliderStates[id].y != arg.state.mSliders[id].abY)
939      _fireAxis(iJoyStick, id * 2 + 1, arg.state.mSliders[id].abY);
940
941    return true;
942  }
943
944  bool InputManager::povMoved(const OIS::JoyStickEvent &arg, int id)
945  {
946    unsigned int iJoyStick = _getJoystick(arg);
947
948    // translate the POV into 8 simple buttons
949    int lastState = povStates_[iJoyStick][id];
950    if (lastState & OIS::Pov::North)
951      buttonReleased(arg, 32 + id * 4 + 0);
952    if (lastState & OIS::Pov::South)
953      buttonReleased(arg, 32 + id * 4 + 1);
954    if (lastState & OIS::Pov::East)
955      buttonReleased(arg, 32 + id * 4 + 2);
956    if (lastState & OIS::Pov::West)
957      buttonReleased(arg, 32 + id * 4 + 3);
958
959    povStates_[iJoyStick].povStates[id] = arg.state.mPOV[id].direction;
960
961    int currentState = povStates_[iJoyStick][id];
962    if (currentState & OIS::Pov::North)
963      buttonPressed(arg, 32 + id * 4 + 0);
964    if (currentState & OIS::Pov::South)
965      buttonPressed(arg, 32 + id * 4 + 1);
966    if (currentState & OIS::Pov::East)
967      buttonPressed(arg, 32 + id * 4 + 2);
968    if (currentState & OIS::Pov::West)
969      buttonPressed(arg, 32 + id * 4 + 3);
970
971    return true;
972  }
973
974  /*bool InputManager::vector3Moved(const OIS::JoyStickEvent &arg, int id)
975  {
976    unsigned int iJoyStick = _getJoystick(arg);
977
978    for (unsigned int iHandler = 0; iHandler < activeJoyStickHandlers_[iJoyStick].size(); iHandler++)
979      activeJoyStickHandlers_[iJoyStick][iHandler]->joyStickVector3Moved(JoyStickState(arg.state, iJoyStick), id);
980
981    return true;
982  }*/
983
984
985  // ################################
986  // ### Static Interface Methods ###
987  // ################################
988  // ################################
989
990  std::string InputManager::bindingCommmandString_s = "";
991
992  bool InputManager::initialise(const size_t windowHnd, int windowWidth, int windowHeight,
993    bool createKeyboard, bool createMouse, bool createJoySticks)
994  {
995    return _getSingleton()._initialise(windowHnd, windowWidth, windowHeight,
996          createKeyboard, createMouse, createJoySticks);
997  }
998
999  bool InputManager::initialiseKeyboard()
1000  {
1001    return _getSingleton()._initialiseKeyboard();
1002  }
1003
1004  bool InputManager::initialiseMouse()
1005  {
1006    return _getSingleton()._initialiseMouse();
1007  }
1008
1009  bool InputManager::initialiseJoySticks()
1010  {
1011    return _getSingleton()._initialiseJoySticks();
1012  }
1013
1014  int InputManager::numberOfKeyboards()
1015  {
1016    if (_getSingleton().keyboard_ != 0)
1017      return 1;
1018    else
1019      return 0;
1020  }
1021
1022  int InputManager::numberOfMice()
1023  {
1024    if (_getSingleton().mouse_ != 0)
1025      return 1;
1026    else
1027      return 0;
1028  }
1029
1030  int InputManager::numberOfJoySticks()
1031  {
1032    return _getSingleton().joySticksSize_;
1033  }
1034
1035  /*bool InputManager::isKeyDown(KeyCode::Enum key)
1036  {
1037    if (_getSingleton().keyboard_)
1038      return _getSingleton().keyboard_->isKeyDown((OIS::KeyCode)key);
1039    else
1040      return false;
1041  }*/
1042
1043  /*bool InputManager::isModifierDown(KeyboardModifier::Enum modifier)
1044  {
1045    if (_getSingleton().keyboard_)
1046      return isModifierDown(modifier);
1047    else
1048      return false;
1049  }*/
1050
1051  /*const MouseState InputManager::getMouseState()
1052  {
1053    if (_getSingleton().mouse_)
1054      return _getSingleton().mouse_->getMouseState();
1055    else
1056      return MouseState();
1057  }*/
1058
1059  /*const JoyStickState InputManager::getJoyStickState(unsigned int ID)
1060  {
1061    if (ID < _getSingleton().joySticksSize_)
1062      return JoyStickState(_getSingleton().joySticks_[ID]->getJoyStickState(), ID);
1063    else
1064      return JoyStickState();
1065  }*/
1066
1067  void InputManager::destroy()
1068  {
1069    _getSingleton()._destroy();
1070  }
1071
1072  void InputManager::destroyKeyboard()
1073  {
1074    return _getSingleton()._destroyKeyboard();
1075  }
1076
1077  void InputManager::destroyMouse()
1078  {
1079    return _getSingleton()._destroyMouse();
1080  }
1081
1082  void InputManager::destroyJoySticks()
1083  {
1084    return _getSingleton()._destroyJoySticks();
1085  }
1086
1087
1088  /**
1089    @brief Adjusts the mouse window metrics.
1090    This method has to be called every time the size of the window changes.
1091    @param width The new width of the render window
1092    @param height the new height of the render window
1093  */
1094  void InputManager::setWindowExtents(const int width, const int height)
1095  {
1096    if (_getSingleton().mouse_)
1097    {
1098      // Set mouse region (if window resizes, we should alter this to reflect as well)
1099      const OIS::MouseState &mouseState = _getSingleton().mouse_->getMouseState();
1100      mouseState.width  = width;
1101      mouseState.height = height;
1102    }
1103  }
1104
1105  /**
1106    @brief Sets the input mode to either GUI, inGame or Buffer
1107    @param mode The new input mode
1108    @remark Only has an affect if the mode actually changes
1109  */
1110  void InputManager::setInputState(const InputState state)
1111  {
1112    _getSingleton().stateRequest_ = state;
1113  }
1114
1115  /**
1116    @brief Returns the current input handling method
1117    @return The current input mode.
1118  */
1119  InputManager::InputState InputManager::getInputState()
1120  {
1121    return _getSingleton().state_;
1122  }
1123
1124  void InputManager::storeKeyStroke(const std::string& name)
1125  {
1126    setInputState(IS_NODETECT);
1127    COUT(0) << "Binding string \"" << bindingCommmandString_s << "\" on key '" << name << "'" << std::endl;
1128    CommandExecutor::execute("config KeyBinder " + name + " " + bindingCommmandString_s, false);
1129  }
1130
1131  void InputManager::keyBind(const std::string& command)
1132  {
1133    bindingCommmandString_s = command;
1134    setInputState(IS_DETECT);
1135    COUT(0) << "Press any button/key or move a mouse/joystick axis" << std::endl;
1136  }
1137
1138  void InputManager::calibrate()
1139  {
1140    _getSingleton().setInputState(IS_CALIBRATE);
1141  }
1142
1143  // ###### KeyHandler ######
1144
1145  /**
1146    @brief Adds a new key handler.
1147    @param handler Pointer to the handler object.
1148    @param name Unique name of the handler.
1149    @return True if added, false if name already existed.
1150  */
1151  bool InputManager::addKeyHandler(KeyHandler* handler, const std::string& name)
1152  {
1153    if (!handler)
1154      return false;
1155    if (_getSingleton().keyHandlers_.find(name) == _getSingleton().keyHandlers_.end())
1156    {
1157      _getSingleton().keyHandlers_[name] = handler;
1158      return true;
1159    }
1160    else
1161      return false;
1162  }
1163
1164  /**
1165    @brief Removes a Key handler from the list.
1166    @param name Unique name of the handler.
1167    @return True if removal was successful, false if name was not found.
1168  */
1169  bool InputManager::removeKeyHandler(const std::string &name)
1170  {
1171    disableKeyHandler(name);
1172    std::map<std::string, KeyHandler*>::iterator it = _getSingleton().keyHandlers_.find(name);
1173    if (it != _getSingleton().keyHandlers_.end())
1174    {
1175      _getSingleton().keyHandlers_.erase(it);
1176      return true;
1177    }
1178    else
1179      return false;
1180  }
1181
1182  /**
1183    @brief Returns the pointer to a handler.
1184    @param name Unique name of the handler.
1185    @return Pointer to the instance, 0 if name was not found.
1186  */
1187  KeyHandler* InputManager::getKeyHandler(const std::string& name)
1188  {
1189    std::map<std::string, KeyHandler*>::iterator it = _getSingleton().keyHandlers_.find(name);
1190    if (it != _getSingleton().keyHandlers_.end())
1191    {
1192      return (*it).second;
1193    }
1194    else
1195      return 0;
1196  }
1197
1198  /**
1199    @brief Enables a specific key handler that has already been added.
1200    @param name Unique name of the handler.
1201    @return False if name was not found, true otherwise.
1202  */
1203  bool InputManager::enableKeyHandler(const std::string& name)
1204  {
1205    // get pointer from the map with all stored handlers
1206    std::map<std::string, KeyHandler*>::const_iterator mapIt = _getSingleton().keyHandlers_.find(name);
1207    if (mapIt == _getSingleton().keyHandlers_.end())
1208      return false;
1209    // see whether the handler already is in the list
1210    for (std::vector<KeyHandler*>::iterator it = _getSingleton().activeKeyHandlers_.begin();
1211          it != _getSingleton().activeKeyHandlers_.end(); it++)
1212    {
1213      if ((*it) == (*mapIt).second)
1214      {
1215        return true;
1216      }
1217    }
1218    _getSingleton().activeKeyHandlers_.push_back((*mapIt).second);
1219    _getSingleton().stateRequest_ = IS_CUSTOM;
1220    _getSingleton()._updateTickables();
1221    return true;
1222  }
1223
1224  /**
1225    @brief Disables a specific key handler.
1226    @param name Unique name of the handler.
1227    @return False if name was not found, true otherwise.
1228  */
1229  bool InputManager::disableKeyHandler(const std::string &name)
1230  {
1231    // get pointer from the map with all stored handlers
1232    std::map<std::string, KeyHandler*>::const_iterator mapIt = _getSingleton().keyHandlers_.find(name);
1233    if (mapIt == _getSingleton().keyHandlers_.end())
1234      return false;
1235    // look for the handler in the list
1236    for (std::vector<KeyHandler*>::iterator it = _getSingleton().activeKeyHandlers_.begin();
1237          it != _getSingleton().activeKeyHandlers_.end(); it++)
1238    {
1239      if ((*it) == (*mapIt).second)
1240      {
1241        _getSingleton().activeKeyHandlers_.erase(it);
1242        _getSingleton().stateRequest_ = IS_CUSTOM;
1243        _getSingleton()._updateTickables();
1244        return true;
1245      }
1246    }
1247    return true;
1248  }
1249
1250  /**
1251    @brief Checks whether a key handler is active
1252    @param name Unique name of the handler.
1253    @return False if key handler is not active or doesn't exist, true otherwise.
1254  */
1255  bool InputManager::isKeyHandlerActive(const std::string& name)
1256  {
1257    // get pointer from the map with all stored handlers
1258    std::map<std::string, KeyHandler*>::const_iterator mapIt = _getSingleton().keyHandlers_.find(name);
1259    if (mapIt == _getSingleton().keyHandlers_.end())
1260      return false;
1261    // see whether the handler already is in the list
1262    for (std::vector<KeyHandler*>::iterator it = _getSingleton().activeKeyHandlers_.begin();
1263          it != _getSingleton().activeKeyHandlers_.end(); it++)
1264    {
1265      if ((*it) == (*mapIt).second)
1266        return true;
1267    }
1268    return false;
1269  }
1270
1271
1272  // ###### MouseHandler ######
1273  /**
1274    @brief Adds a new mouse handler.
1275    @param handler Pointer to the handler object.
1276    @param name Unique name of the handler.
1277    @return True if added, false if name already existed.
1278  */
1279  bool InputManager::addMouseHandler(MouseHandler* handler, const std::string& name)
1280  {
1281    if (!handler)
1282      return false;
1283    if (_getSingleton().mouseHandlers_.find(name) == _getSingleton().mouseHandlers_.end())
1284    {
1285      _getSingleton().mouseHandlers_[name] = handler;
1286      return true;
1287    }
1288    else
1289      return false;
1290  }
1291
1292  /**
1293    @brief Removes a Mouse handler from the list.
1294    @param name Unique name of the handler.
1295    @return True if removal was successful, false if name was not found.
1296  */
1297  bool InputManager::removeMouseHandler(const std::string &name)
1298  {
1299    disableMouseHandler(name);
1300    std::map<std::string, MouseHandler*>::iterator it = _getSingleton().mouseHandlers_.find(name);
1301    if (it != _getSingleton().mouseHandlers_.end())
1302    {
1303      _getSingleton().mouseHandlers_.erase(it);
1304      return true;
1305    }
1306    else
1307      return false;
1308  }
1309
1310  /**
1311    @brief Returns the pointer to a handler.
1312    @param name Unique name of the handler.
1313    @return Pointer to the instance, 0 if name was not found.
1314  */
1315  MouseHandler* InputManager::getMouseHandler(const std::string& name)
1316  {
1317    std::map<std::string, MouseHandler*>::iterator it = _getSingleton().mouseHandlers_.find(name);
1318    if (it != _getSingleton().mouseHandlers_.end())
1319    {
1320      return (*it).second;
1321    }
1322    else
1323      return 0;
1324  }
1325
1326  /**
1327    @brief Enables a specific mouse handler that has already been added.
1328    @param name Unique name of the handler.
1329    @return False if name was not found, true otherwise.
1330  */
1331  bool InputManager::enableMouseHandler(const std::string& name)
1332  {
1333    // get pointer from the map with all stored handlers
1334    std::map<std::string, MouseHandler*>::const_iterator mapIt = _getSingleton().mouseHandlers_.find(name);
1335    if (mapIt == _getSingleton().mouseHandlers_.end())
1336      return false;
1337    // see whether the handler already is in the list
1338    for (std::vector<MouseHandler*>::iterator it = _getSingleton().activeMouseHandlers_.begin();
1339          it != _getSingleton().activeMouseHandlers_.end(); it++)
1340    {
1341      if ((*it) == (*mapIt).second)
1342      {
1343        return true;
1344      }
1345    }
1346    _getSingleton().activeMouseHandlers_.push_back((*mapIt).second);
1347    _getSingleton().stateRequest_ = IS_CUSTOM;
1348    _getSingleton()._updateTickables();
1349    return true;
1350  }
1351
1352  /**
1353    @brief Disables a specific mouse handler.
1354    @param name Unique name of the handler.
1355    @return False if name was not found, true otherwise.
1356  */
1357  bool InputManager::disableMouseHandler(const std::string &name)
1358  {
1359    // get pointer from the map with all stored handlers
1360    std::map<std::string, MouseHandler*>::const_iterator mapIt = _getSingleton().mouseHandlers_.find(name);
1361    if (mapIt == _getSingleton().mouseHandlers_.end())
1362      return false;
1363    // look for the handler in the list
1364    for (std::vector<MouseHandler*>::iterator it = _getSingleton().activeMouseHandlers_.begin();
1365          it != _getSingleton().activeMouseHandlers_.end(); it++)
1366    {
1367      if ((*it) == (*mapIt).second)
1368      {
1369        _getSingleton().activeMouseHandlers_.erase(it);
1370        _getSingleton().stateRequest_ = IS_CUSTOM;
1371        _getSingleton()._updateTickables();
1372        return true;
1373      }
1374    }
1375    return true;
1376  }
1377
1378  /**
1379    @brief Checks whether a mouse handler is active
1380    @param name Unique name of the handler.
1381    @return False if key handler is not active or doesn't exist, true otherwise.
1382  */
1383  bool InputManager::isMouseHandlerActive(const std::string& name)
1384  {
1385    // get pointer from the map with all stored handlers
1386    std::map<std::string, MouseHandler*>::const_iterator mapIt = _getSingleton().mouseHandlers_.find(name);
1387    if (mapIt == _getSingleton().mouseHandlers_.end())
1388      return false;
1389    // see whether the handler already is in the list
1390    for (std::vector<MouseHandler*>::iterator it = _getSingleton().activeMouseHandlers_.begin();
1391          it != _getSingleton().activeMouseHandlers_.end(); it++)
1392    {
1393      if ((*it) == (*mapIt).second)
1394        return true;
1395    }
1396    return false;
1397  }
1398
1399
1400  // ###### JoyStickHandler ######
1401
1402  /**
1403    @brief Adds a new joy stick handler.
1404    @param handler Pointer to the handler object.
1405    @param name Unique name of the handler.
1406    @return True if added, false if name already existed.
1407  */
1408  bool InputManager::addJoyStickHandler(JoyStickHandler* handler, const std::string& name)
1409  {
1410    if (!handler)
1411      return false;
1412    if (_getSingleton().joyStickHandlers_.find(name) == _getSingleton().joyStickHandlers_.end())
1413    {
1414      _getSingleton().joyStickHandlers_[name] = handler;
1415      return true;
1416    }
1417    else
1418      return false;
1419  }
1420
1421  /**
1422    @brief Removes a JoyStick handler from the list.
1423    @param name Unique name of the handler.
1424    @return True if removal was successful, false if name was not found.
1425  */
1426  bool InputManager::removeJoyStickHandler(const std::string &name)
1427  {
1428    for (std::vector<OIS::JoyStick*>::iterator itstick = _getSingleton().joySticks_.begin();
1429          itstick != _getSingleton().joySticks_.end(); itstick++)
1430      disableJoyStickHandler(name, itstick - _getSingleton().joySticks_.begin());
1431
1432    std::map<std::string, JoyStickHandler*>::iterator it = _getSingleton().joyStickHandlers_.find(name);
1433    if (it != _getSingleton().joyStickHandlers_.end())
1434    {
1435      _getSingleton().joyStickHandlers_.erase(it);
1436      return true;
1437    }
1438    else
1439      return false;
1440  }
1441
1442  /**
1443    @brief Returns the pointer to a handler.
1444    @param name Unique name of the handler.
1445    @return Pointer to the instance, 0 if name was not found.
1446  */
1447  JoyStickHandler* InputManager::getJoyStickHandler(const std::string& name)
1448  {
1449    std::map<std::string, JoyStickHandler*>::iterator it = _getSingleton().joyStickHandlers_.find(name);
1450    if (it != _getSingleton().joyStickHandlers_.end())
1451    {
1452      return (*it).second;
1453    }
1454    else
1455      return 0;
1456  }
1457
1458  /**
1459    @brief Enables a specific joy stick handler that has already been added.
1460    @param name Unique name of the handler.
1461    @return False if name or id was not found, true otherwise.
1462  */
1463  bool InputManager::enableJoyStickHandler(const std::string& name, unsigned int ID)
1464  {
1465    // get handler pointer from the map with all stored handlers
1466    std::map<std::string, JoyStickHandler*>::const_iterator handlerIt = _getSingleton().joyStickHandlers_.find(name);
1467    if (handlerIt == _getSingleton().joyStickHandlers_.end())
1468      return false;
1469
1470    // check for existence of the ID
1471    if (ID >= _getSingleton().joySticksSize_)
1472      return false;
1473
1474    // see whether the handler already is in the list
1475    for (std::vector<JoyStickHandler*>::iterator it = _getSingleton().activeJoyStickHandlers_[ID].begin();
1476          it != _getSingleton().activeJoyStickHandlers_[ID].end(); it++)
1477    {
1478      if ((*it) == (*handlerIt).second)
1479      {
1480        return true;
1481      }
1482    }
1483    _getSingleton().activeJoyStickHandlers_[ID].push_back((*handlerIt).second);
1484    _getSingleton().stateRequest_ = IS_CUSTOM;
1485    _getSingleton()._updateTickables();
1486    return true;
1487  }
1488
1489  /**
1490    @brief Disables a specific joy stick handler.
1491    @param name Unique name of the handler.
1492    @return False if name or id was not found, true otherwise.
1493  */
1494  bool InputManager::disableJoyStickHandler(const std::string &name, unsigned int ID)
1495  {
1496    // get handler pointer from the map with all stored handlers
1497    std::map<std::string, JoyStickHandler*>::const_iterator handlerIt = _getSingleton().joyStickHandlers_.find(name);
1498    if (handlerIt == _getSingleton().joyStickHandlers_.end())
1499      return false;
1500
1501    // check for existence of the ID
1502    if (ID >= _getSingleton().joySticksSize_)
1503      return false;
1504
1505    // look for the handler in the list
1506    for (std::vector<JoyStickHandler*>::iterator it = _getSingleton().activeJoyStickHandlers_[ID].begin();
1507          it != _getSingleton().activeJoyStickHandlers_[ID].end(); it++)
1508    {
1509      if ((*it) == (*handlerIt).second)
1510      {
1511        _getSingleton().activeJoyStickHandlers_[ID].erase(it);
1512        _getSingleton().stateRequest_ = IS_CUSTOM;
1513        _getSingleton()._updateTickables();
1514        return true;
1515      }
1516    }
1517    return true;
1518  }
1519
1520  /**
1521    @brief Checks whether a joy stick handler is active
1522    @param name Unique name of the handler.
1523    @return False if key handler is not active or doesn't exist, true otherwise.
1524  */
1525  bool InputManager::isJoyStickHandlerActive(const std::string& name, unsigned int ID)
1526  {
1527    // get handler pointer from the map with all stored handlers
1528    std::map<std::string, JoyStickHandler*>::const_iterator handlerIt = _getSingleton().joyStickHandlers_.find(name);
1529    if (handlerIt == _getSingleton().joyStickHandlers_.end())
1530      return false;
1531
1532    // check for existence of the ID
1533    if (ID >= _getSingleton().joySticksSize_)
1534      return false;
1535
1536    // see whether the handler already is in the list
1537    for (std::vector<JoyStickHandler*>::iterator it = _getSingleton().activeJoyStickHandlers_[ID].begin();
1538          it != _getSingleton().activeJoyStickHandlers_[ID].end(); it++)
1539    {
1540      if ((*it) == (*handlerIt).second)
1541        return true;
1542    }
1543    return false;
1544  }
1545
1546}
Note: See TracBrowser for help on using the repository browser.