Changeset 1219 for code/trunk/src/core/InputManager.cc
- Timestamp:
- May 2, 2008, 10:44:57 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/trunk/src/core/InputManager.cc
r1089 r1219 28 28 29 29 /** 30 @file31 @brief Implementation of a little Input handler that distributes everything32 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. 33 33 */ 34 34 … … 36 36 #include "CoreIncludes.h" 37 37 #include "Debug.h" 38 #include "Input EventListener.h"38 #include "InputBuffer.h" 39 39 #include "InputHandler.h" 40 #include "InputBuffer.h"41 #include "ConsoleCommand.h"42 40 43 41 namespace orxonox 44 42 { 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. 49 51 */ 50 52 InputManager::InputManager() : 51 53 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) 54 55 { 55 56 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); 64 62 } 65 63 … … 68 66 @return A reference to the only instance of the InputManager 69 67 */ 70 InputManager& InputManager:: getSingleton()68 InputManager& InputManager::_getSingleton() 71 69 { 72 70 static InputManager theOnlyInstance; … … 75 73 76 74 /** 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. 79 85 @param windowHnd The window handle of the render window 80 86 @param windowWidth The width of the render window 81 87 @param windowHeight The height of the render window 82 88 */ 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 88 96 OIS::ParamList paramList; 89 97 std::ostringstream windowHndStr; … … 93 101 paramList.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str())); 94 102 95 #if defined OIS_LINUX_PLATFORM96 paramList.insert(std::make_pair(std::string("XAutoRepeatOn"), std::string("true")));97 #endif103 //#if defined OIS_LINUX_PLATFORM 104 // paramList.insert(std::make_pair(std::string("XAutoRepeatOn"), std::string("true"))); 105 //#endif 98 106 99 107 try 100 108 { 101 // Create inputsystem102 109 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 { 110 209 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; 121 218 return false; 122 219 } 123 220 } 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. 177 360 @param dt Delta time 178 361 */ 179 362 void InputManager::tick(float dt) 180 363 { 364 if (state_ == IS_UNINIT) 365 return; 366 181 367 // 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. 207 410 if (mouse_) 208 411 mouse_->capture(); 209 210 412 if (keyboard_) 211 413 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 213 711 214 712 /** … … 218 716 @param height the new height of the render window 219 717 */ 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 } 226 727 } 227 728 … … 231 732 @remark Only has an affect if the mode actually changes 232 733 */ 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; 237 737 } 238 738 … … 241 741 @return The current input mode. 242 742 */ 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 } 253 1147 254 1148 }
Note: See TracChangeset
for help on using the changeset viewer.