Changeset 5695 for code/trunk/src/core/input
- Timestamp:
- Aug 30, 2009, 2:22:00 AM (15 years ago)
- Location:
- code/trunk
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
code/trunk
- Property svn:mergeinfo changed
/code/branches/resource2 (added) merged: 3373-3374,5594,5597,5610-5611,5614,5624,5641,5644-5646,5650-5664,5667-5672,5682-5684,5688-5691,5694
- Property svn:mergeinfo changed
-
code/trunk/src/core/input/Button.cc
r3327 r5695 59 59 nCommands_[1]=0; 60 60 nCommands_[2]=0; 61 this->configContainer_ = 0;62 61 } 63 62 -
code/trunk/src/core/input/InputManager.cc
r3370 r5695 41 41 #include <boost/foreach.hpp> 42 42 43 #include "util/Convert.h" 43 44 #include "util/Exception.h" 44 45 #include "util/ScopeGuard.h" … … 49 50 #include "core/CommandLine.h" 50 51 #include "core/Functor.h" 52 #include "core/GraphicsManager.h" 51 53 52 54 #include "InputBuffer.h" … … 82 84 // ########## ########## 83 85 // ############################################################ 84 InputManager::InputManager( size_t windowHnd)86 InputManager::InputManager() 85 87 : internalState_(Bad) 86 88 , oisInputManager_(0) 87 89 , devices_(2) 88 , windowHnd_(0)90 , bExclusiveMouse_(false) 89 91 , emptyState_(0) 90 92 , keyDetector_(0) … … 97 99 this->setConfigValues(); 98 100 99 this->loadDevices( windowHnd);101 this->loadDevices(); 100 102 101 103 // Lowest priority empty InputState … … 147 149 Creates the OIS::InputMananger, the keyboard, the mouse and 148 150 the joys ticks. If either of the first two fail, this method throws an exception. 149 @param windowHnd150 The window handle of the render window151 151 @param windowWidth 152 152 The width of the render window … … 154 154 The height of the render window 155 155 */ 156 void InputManager::loadDevices( size_t windowHnd)157 { 158 CCOUT( 3) << "Loading input devices..." << std::endl;156 void InputManager::loadDevices() 157 { 158 CCOUT(4) << "Loading input devices..." << std::endl; 159 159 160 160 // When loading the devices they should not already be loaded … … 164 164 assert(devices_.size() == InputDeviceEnumerator::FirstJoyStick); 165 165 166 // store handle internally so we can reload OIS 167 windowHnd_ = windowHnd; 168 166 // Fill parameter list 169 167 OIS::ParamList paramList; 170 std::ostringstream windowHndStr; 171 172 // Fill parameter list 173 windowHndStr << static_cast<unsigned int>(windowHnd); 174 paramList.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str())); 168 size_t windowHnd = GraphicsManager::getInstance().getRenderWindowHandle(); 169 paramList.insert(std::make_pair("WINDOW", multi_cast<std::string>(windowHnd))); 175 170 #if defined(ORXONOX_PLATFORM_WINDOWS) 176 //paramList.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE"))); 177 //paramList.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND"))); 178 //paramList.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_NONEXCLUSIVE"))); 179 //paramList.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_FOREGROUND"))); 171 paramList.insert(std::make_pair("w32_keyboard", "DISCL_NONEXCLUSIVE")); 172 paramList.insert(std::make_pair("w32_keyboard", "DISCL_FOREGROUND")); 173 paramList.insert(std::make_pair("w32_mouse", "DISCL_FOREGROUND")); 174 if (bExclusiveMouse_ || GraphicsManager::getInstance().isFullScreen()) 175 { 176 // Disable Windows key plus special keys (like play, stop, next, etc.) 177 paramList.insert(std::make_pair("w32_keyboard", "DISCL_NOWINKEY")); 178 paramList.insert(std::make_pair("w32_mouse", "DISCL_EXCLUSIVE")); 179 } 180 else 181 paramList.insert(std::make_pair("w32_mouse", "DISCL_NONEXCLUSIVE")); 180 182 #elif defined(ORXONOX_PLATFORM_LINUX) 181 paramList.insert(std::make_pair(std::string("XAutoRepeatOn"), std::string("true"))); 182 paramList.insert(std::make_pair(std::string("x11_mouse_grab"), "true")); 183 paramList.insert(std::make_pair(std::string("x11_mouse_hide"), "true")); 184 bool kbNoGrab; 185 CommandLine::getValue("keyboard_no_grab", &kbNoGrab); 186 if (kbNoGrab) 187 paramList.insert(std::make_pair(std::string("x11_keyboard_grab"), std::string("false"))); 183 // Enabling this is probably a bad idea, but whenever orxonox crashes, the setting stays on 184 // Trouble might be that the Pressed event occurs a bit too often... 185 paramList.insert(std::make_pair("XAutoRepeatOn", "true")); 186 187 if (bExclusiveMouse_ || GraphicsManager::getInstance().isFullScreen()) 188 { 189 if (CommandLine::getValue("keyboard_no_grab").getBool()) 190 paramList.insert(std::make_pair("x11_keyboard_grab", "false")); 191 else 192 paramList.insert(std::make_pair("x11_keyboard_grab", "true")); 193 paramList.insert(std::make_pair("x11_mouse_grab", "true")); 194 paramList.insert(std::make_pair("x11_mouse_hide", "true")); 195 } 188 196 else 189 paramList.insert(std::make_pair(std::string("x11_keyboard_grab"), std::string("true"))); 197 { 198 paramList.insert(std::make_pair("x11_keyboard_grab", "false")); 199 paramList.insert(std::make_pair("x11_mouse_grab", "false")); 200 paramList.insert(std::make_pair("x11_mouse_hide", "false")); 201 } 190 202 #endif 191 203 … … 212 224 } 213 225 214 // TODO: Remove the two parameters215 226 this->loadMouse(); 216 227 this->loadJoySticks(); … … 219 230 this->updateActiveStates(); 220 231 221 CCOUT( 3) << "Input devices loaded." << std::endl;232 CCOUT(4) << "Input devices loaded." << std::endl; 222 233 } 223 234 … … 275 286 InputManager::~InputManager() 276 287 { 277 CCOUT( 4) << "Destroying..." << std::endl;288 CCOUT(3) << "Destroying..." << std::endl; 278 289 279 290 // Destroy calibrator helper handler and state … … 293 304 this->destroyDevices(); 294 305 295 CCOUT( 4) << "Destruction complete." << std::endl;306 CCOUT(3) << "Destruction complete." << std::endl; 296 307 } 297 308 … … 304 315 void InputManager::destroyDevices() 305 316 { 306 CCOUT( 3) << "Destroying devices..." << std::endl;317 CCOUT(4) << "Destroying devices..." << std::endl; 307 318 308 319 BOOST_FOREACH(InputDevice*& device, devices_) … … 336 347 337 348 internalState_ |= Bad; 338 CCOUT( 3) << "Destroyed devices." << std::endl;349 CCOUT(4) << "Destroyed devices." << std::endl; 339 350 } 340 351 … … 365 376 366 377 this->destroyDevices(); 367 this->loadDevices( windowHnd_);378 this->loadDevices(); 368 379 369 380 internalState_ &= ~Bad; 370 381 internalState_ &= ~ReloadRequest; 371 CCOUT( 3) << "Reloading complete." << std::endl;382 CCOUT(4) << "Reloading complete." << std::endl; 372 383 } 373 384 … … 481 492 void InputManager::updateActiveStates() 482 493 { 494 assert((internalState_ & InputManager::Ticking) == 0); 483 495 // temporary resize 484 496 for (unsigned int i = 0; i < devices_.size(); ++i) … … 512 524 for (std::set<InputState*>::const_iterator it = tempSet.begin();it != tempSet.end(); ++it) 513 525 activeStatesTicked_.push_back(*it); 526 527 // Check whether we have to change the mouse mode 528 std::vector<InputState*>& mouseStates = devices_[InputDeviceEnumerator::Mouse]->getStateListRef(); 529 if (mouseStates.empty() && bExclusiveMouse_ || 530 !mouseStates.empty() && mouseStates.front()->getIsExclusiveMouse() != bExclusiveMouse_) 531 { 532 bExclusiveMouse_ = !bExclusiveMouse_; 533 if (!GraphicsManager::getInstance().isFullScreen()) 534 this->reloadInternal(); 535 } 514 536 } 515 537 … … 556 578 } 557 579 558 // ############################################################ 559 // ##### Iput States ##### 580 std::pair<int, int> InputManager::getMousePosition() const 581 { 582 Mouse* mouse = static_cast<Mouse*>(devices_[InputDeviceEnumerator::Mouse]); 583 if (mouse != NULL) 584 { 585 const OIS::MouseState state = mouse->getOISDevice()->getMouseState(); 586 return std::make_pair(state.X.abs, state.Y.abs); 587 } 588 else 589 return std::make_pair(0, 0); 590 } 591 592 // ############################################################ 593 // ##### Input States ##### 560 594 // ########## ########## 561 595 // ############################################################ -
code/trunk/src/core/input/InputManager.h
r3370 r5695 84 84 the constructor fails with an std::exception. 85 85 */ 86 InputManager( size_t windowHnd);86 InputManager(); 87 87 //! Destroys all devices AND all input states! 88 88 ~InputManager(); … … 167 167 { return devices_.size() - InputDeviceEnumerator::FirstJoyStick; } 168 168 //! Returns a pointer to the OIS InputManager. Only you if you know what you're doing! 169 OIS::InputManager* getOISInputManager() 170 { return this->oisInputManager_; }169 OIS::InputManager* getOISInputManager() { return this->oisInputManager_; } 170 std::pair<int, int> getMousePosition() const; 171 171 172 172 private: // functions … … 175 175 176 176 // Intenal methods 177 void loadDevices( size_t windowHnd);177 void loadDevices(); 178 178 void loadMouse(); 179 179 void loadJoySticks(); … … 193 193 OIS::InputManager* oisInputManager_; //!< OIS input manager 194 194 std::vector<InputDevice*> devices_; //!< List of all input devices (keyboard, mouse, joy sticks) 195 // TODO: Get this from the GraphicsManager during reload 196 size_t windowHnd_; //!< Render window handle (used to reload the InputManager) 195 bool bExclusiveMouse_; //!< Currently applied mouse mode 197 196 198 197 // some internally handled states and handlers -
code/trunk/src/core/input/InputState.cc
r3327 r5695 37 37 , bAlwaysGetsInput_(bAlwaysGetsInput) 38 38 , bTransparent_(bTransparent) 39 , bExclusiveMouse_(true) 39 40 , bExpired_(true) 40 41 , handlers_(2) -
code/trunk/src/core/input/InputState.h
r3327 r5695 75 75 not influence ony other InputState at all. 76 76 77 Priorities 78 ********** 77 @par Priorities 79 78 Every InputState has a priority when on the stack, but mostly this 80 79 priority is dynamic (InputStatePriority::Dynamic) which means that a state … … 83 82 a high priority (InputStatePriority::HighPriority). These 'special' ones 84 83 are used for features like the KeyDetector or the console. Use with care! 84 85 @par Exclusive/Non-Exclusive mouse Mode 86 You can select a specific mouse mode that tells whether the application 87 should have exclusive accessto it or not. 88 When in non-exclusive mode, you can move the mouse out of the window 89 like with any other normal window (only for windowed mode!). 90 The setting is dictated by the topmost InputState that gets mouse events. 85 91 */ 86 92 class _CoreExport InputState : public JoyStickQuantityListener … … 114 120 void setHandler (InputHandler* handler); 115 121 122 void setIsExclusiveMouse(bool value) { bExclusiveMouse_ = value; this->bExpired_ = true; } 123 bool getIsExclusiveMouse() const { return bExclusiveMouse_; } 124 116 125 //! Returns the name of the state (which is unique!) 117 126 const std::string& getName() const { return name_; } … … 165 174 const bool bAlwaysGetsInput_; //!< See class declaration for explanation 166 175 const bool bTransparent_; //!< See class declaration for explanation 176 bool bExclusiveMouse_; //!< See class declaration for explanation 167 177 int priority_; //!< Current priority (might change) 168 178 bool bExpired_; //!< See hasExpired() -
code/trunk/src/core/input/KeyBinder.cc
r3327 r5695 55 55 mousePosition_[0] = 0; 56 56 mousePosition_[1] = 0; 57 58 joyStickButtons_.reserve(1000);59 joyStickAxes_.reserve(1000);60 57 61 58 RegisterRootObject(KeyBinder); … … 167 164 { 168 165 for (unsigned int i = 0; i < JoyStickButtonCode::numberOfButtons; ++i) 169 joyStickButtons_[iDev][i].readConfigValue(this->configFile_);166 (*joyStickButtons_[iDev])[i].readConfigValue(this->configFile_); 170 167 for (unsigned int i = 0; i < JoyStickAxisCode::numberOfAxes * 2; ++i) 171 joyStickAxes_[iDev][i].readConfigValue(this->configFile_);168 (*joyStickAxes_[iDev])[i].readConfigValue(this->configFile_); 172 169 } 173 170 } … … 179 176 void KeyBinder::initialiseJoyStickBindings() 180 177 { 178 while (joyStickAxes_.size() < joySticks_.size()) 179 joyStickAxes_.push_back(shared_ptr<JoyStickAxisVector>(new JoyStickAxisVector())); 180 while (joyStickButtons_.size() < joySticks_.size()) 181 joyStickButtons_.push_back(shared_ptr<JoyStickButtonVector>(new JoyStickButtonVector())); 182 // For the case the new size is smaller 181 183 this->joyStickAxes_.resize(joySticks_.size()); 182 184 this->joyStickButtons_.resize(joySticks_.size()); … … 189 191 for (unsigned int i = 0; i < JoyStickButtonCode::numberOfButtons; i++) 190 192 { 191 joyStickButtons_[iDev][i].name_ = JoyStickButtonCode::ByString[i];192 joyStickButtons_[iDev][i].paramCommandBuffer_ = ¶mCommandBuffer_;193 joyStickButtons_[iDev][i].groupName_ = "JoyStickButtons_" + deviceName;193 (*joyStickButtons_[iDev])[i].name_ = JoyStickButtonCode::ByString[i]; 194 (*joyStickButtons_[iDev])[i].paramCommandBuffer_ = ¶mCommandBuffer_; 195 (*joyStickButtons_[iDev])[i].groupName_ = "JoyStickButtons_" + deviceName; 194 196 } 195 197 // joy stick axes 196 198 for (unsigned int i = 0; i < JoyStickAxisCode::numberOfAxes * 2; i++) 197 199 { 198 joyStickAxes_[iDev][i].name_ = JoyStickAxisCode::ByString[i / 2];200 (*joyStickAxes_[iDev])[i].name_ = JoyStickAxisCode::ByString[i / 2]; 199 201 if (i & 1) 200 joyStickAxes_[iDev][i].name_ += "Pos";202 (*joyStickAxes_[iDev])[i].name_ += "Pos"; 201 203 else 202 joyStickAxes_[iDev][i].name_ += "Neg";203 joyStickAxes_[iDev][i].paramCommandBuffer_ = ¶mCommandBuffer_;204 joyStickAxes_[iDev][i].groupName_ = "JoyStickAxes_" + deviceName;204 (*joyStickAxes_[iDev])[i].name_ += "Neg"; 205 (*joyStickAxes_[iDev])[i].paramCommandBuffer_ = ¶mCommandBuffer_; 206 (*joyStickAxes_[iDev])[i].groupName_ = "JoyStickAxes_" + deviceName; 205 207 } 206 208 } … … 226 228 { 227 229 for (unsigned int i = 0; i < JoyStickButtonCode::numberOfButtons; i++) 228 allButtons_[ joyStickButtons_[iDev][i].groupName_ + "." + joyStickButtons_[iDev][i].name_] = &(joyStickButtons_[iDev][i]);230 allButtons_[(*joyStickButtons_[iDev])[i].groupName_ + "." + (*joyStickButtons_[iDev])[i].name_] = &((*joyStickButtons_[iDev])[i]); 229 231 for (unsigned int i = 0; i < JoyStickAxisCode::numberOfAxes * 2; i++) 230 232 { 231 allButtons_[ joyStickAxes_[iDev][i].groupName_ + "." + joyStickAxes_[iDev][i].name_] = &(joyStickAxes_[iDev][i]);232 allHalfAxes_.push_back(&( joyStickAxes_[iDev][i]));233 allButtons_[(*joyStickAxes_[iDev])[i].groupName_ + "." + (*joyStickAxes_[iDev])[i].name_] = &((*joyStickAxes_[iDev])[i]); 234 allHalfAxes_.push_back(&((*joyStickAxes_[iDev])[i])); 233 235 } 234 236 } … … 303 305 for (unsigned int i = 0; i < JoyStickAxisCode::numberOfAxes * 2; i++) 304 306 { 305 joyStickAxes_[iDev][i].absVal_ = 0.0f;306 joyStickAxes_[iDev][i].relVal_ = 0.0f;307 (*joyStickAxes_[iDev])[i].absVal_ = 0.0f; 308 (*joyStickAxes_[iDev])[i].relVal_ = 0.0f; 307 309 } 308 310 } … … 366 368 for (unsigned int i = 0; i < JoyStickAxisCode::numberOfAxes * 2; i++) 367 369 { 368 tickHalfAxis( joyStickAxes_[joyStick][i]);370 tickHalfAxis((*joyStickAxes_[joyStick])[i]); 369 371 } 370 372 } … … 481 483 { 482 484 int i = axisID * 2; 483 JoyStickAxisVector& axis = joyStickAxes_[device];485 JoyStickAxisVector& axis = *joyStickAxes_[device]; 484 486 if (value < 0) 485 487 { -
code/trunk/src/core/input/KeyBinder.h
r3327 r5695 41 41 #include <string> 42 42 #include <vector> 43 #include <boost/shared_ptr.hpp> 43 44 44 45 #include "InputHandler.h" … … 115 116 }; 116 117 //! Actual key bindings for joy stick buttons 117 std::vector< JoyStickButtonVector> joyStickButtons_;118 std::vector<shared_ptr<JoyStickButtonVector> > joyStickButtons_; 118 119 //! Helper class to use something like std:vector<HalfAxis[48]> 119 120 struct JoyStickAxisVector … … 123 124 }; 124 125 //! Actual key bindings for joy stick axes (and sliders) 125 std::vector< JoyStickAxisVector> joyStickAxes_;126 std::vector<shared_ptr<JoyStickAxisVector> > joyStickAxes_; 126 127 127 128 //! Pointer map with all Buttons, including half axes … … 191 192 192 193 inline void KeyBinder::buttonPressed (unsigned int device, JoyStickButtonCode::ByEnum button) 193 { joyStickButtons_[device][button].execute(KeybindMode::OnPress); }194 { (*joyStickButtons_[device])[button].execute(KeybindMode::OnPress); } 194 195 195 196 inline void KeyBinder::buttonReleased(unsigned int device, JoyStickButtonCode::ByEnum button) 196 { joyStickButtons_[device][button].execute(KeybindMode::OnRelease); }197 { (*joyStickButtons_[device])[button].execute(KeybindMode::OnRelease); } 197 198 198 199 inline void KeyBinder::buttonHeld (unsigned int device, JoyStickButtonCode::ByEnum button) 199 { joyStickButtons_[device][button].execute(KeybindMode::OnHold); }200 { (*joyStickButtons_[device])[button].execute(KeybindMode::OnHold); } 200 201 201 202 inline void KeyBinder::allDevicesUpdated(float dt) -
code/trunk/src/core/input/KeyDetector.cc
r3327 r5695 70 70 { 71 71 KeyBinder::JoyStickQuantityChanged(joyStickList); 72 setCallbackCommand(callbackCommand_); 72 if (!callbackCommand_.empty()) 73 setCallbackCommand(callbackCommand_); 73 74 } 74 75 }
Note: See TracChangeset
for help on using the changeset viewer.