Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
May 2, 2008, 10:44:57 PM (17 years ago)
Author:
rgrieder
Message:

merged input branch back to trunk. Not yet tested on tardis

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/trunk/src/core/InputManager.cc

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