Changeset 2908 for code/branches/questsystem5/src/core/input
- Timestamp:
- Apr 8, 2009, 12:58:47 AM (16 years ago)
- Location:
- code/branches/questsystem5
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/questsystem5
- Property svn:mergeinfo changed
-
code/branches/questsystem5/src/core/input/CalibratorCallback.h
r2907 r2908 52 52 void keyHeld (const KeyEvent& evt) { } 53 53 54 void updateInput(float dt) { }54 void tickInput(float dt) { } 55 55 }; 56 56 } -
code/branches/questsystem5/src/core/input/ExtendedInputState.cc
r2907 r2908 402 402 } 403 403 404 void ExtendedInputState:: updateInput(float dt)404 void ExtendedInputState::tickInput(float dt) 405 405 { 406 406 for (unsigned int i = 0; i < allHandlers_.size(); ++i) 407 407 { 408 allHandlers_[i]-> updateInput(dt);409 } 410 } 411 412 void ExtendedInputState:: updateInput(float dt, unsigned int device)408 allHandlers_[i]->tickInput(dt); 409 } 410 } 411 412 void ExtendedInputState::tickInput(float dt, unsigned int device) 413 413 { 414 414 switch (device) … … 416 416 case Keyboard: 417 417 for (unsigned int i = 0; i < keyHandlers_.size(); ++i) 418 keyHandlers_[i]-> updateKey(dt);418 keyHandlers_[i]->tickKey(dt); 419 419 break; 420 420 421 421 case Mouse: 422 422 for (unsigned int i = 0; i < mouseHandlers_.size(); ++i) 423 mouseHandlers_[i]-> updateMouse(dt);423 mouseHandlers_[i]->tickMouse(dt); 424 424 break; 425 425 426 426 default: // joy sticks 427 427 for (unsigned int i = 0; i < joyStickHandlers_[device - 2].size(); ++i) 428 joyStickHandlers_[device - 2][i]-> updateJoyStick(dt, device - 2);428 joyStickHandlers_[device - 2][i]->tickJoyStick(dt, device - 2); 429 429 break; 430 430 } -
code/branches/questsystem5/src/core/input/ExtendedInputState.h
r2907 r2908 68 68 ~ExtendedInputState() { } 69 69 70 void updateInput(float dt);71 void updateInput(float dt, unsigned int device);70 void tickInput(float dt); 71 void tickInput(float dt, unsigned int device); 72 72 73 73 void keyPressed (const KeyEvent& evt); -
code/branches/questsystem5/src/core/input/InputBuffer.cc
r2907 r2908 224 224 225 225 /** 226 @brief This update() function is called by the InputManager if the InputBuffer is active.226 @brief This tick() function is called by the InputManager if the InputBuffer is active. 227 227 @param dt Delta time 228 228 */ 229 void InputBuffer:: updateInput(float dt)229 void InputBuffer::tickInput(float dt) 230 230 { 231 231 timeSinceKeyPressed_ += dt; -
code/branches/questsystem5/src/core/input/InputBuffer.h
r2907 r2908 127 127 for (std::list<BaseInputBufferListenerTuple*>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); ) 128 128 { 129 InputBufferListenerTuple<T>* refListener = static_cast<InputBufferListenerTuple<T>*>(*it);129 InputBufferListenerTuple<T>* refListener = dynamic_cast<InputBufferListenerTuple<T>*>(*it); 130 130 if (refListener && refListener->listener_ == listener) 131 131 this->listeners_.erase(it++); … … 171 171 void processKey (const KeyEvent &e); 172 172 173 void updateInput(float dt);174 void updateKey(float dt) { }173 void tickInput(float dt); 174 void tickKey(float dt) { } 175 175 176 176 std::string buffer_; -
code/branches/questsystem5/src/core/input/InputInterfaces.h
r2907 r2908 474 474 public: 475 475 virtual ~InputHandler() { } 476 virtual void updateInput(float dt) = 0;476 virtual void tickInput(float dt) = 0; 477 477 }; 478 478 … … 488 488 virtual void keyReleased(const KeyEvent& evt) = 0; 489 489 virtual void keyHeld (const KeyEvent& evt) = 0; 490 virtual void updateKey (float dt) = 0;490 virtual void tickKey (float dt) = 0; 491 491 }; 492 492 … … 504 504 virtual void mouseMoved (IntVector2 abs, IntVector2 rel, IntVector2 clippingSize) = 0; 505 505 virtual void mouseScrolled (int abs, int rel) = 0; 506 virtual void updateMouse (float dt) = 0;506 virtual void tickMouse (float dt) = 0; 507 507 }; 508 508 … … 520 520 virtual void joyStickButtonHeld (unsigned int joyStickID, JoyStickButtonCode::ByEnum id) = 0; 521 521 virtual void joyStickAxisMoved (unsigned int joyStickID, unsigned int axis, float value) = 0; 522 virtual void updateJoyStick (float dt, unsigned int joyStick) = 0;522 virtual void tickJoyStick (float dt, unsigned int joyStick) = 0; 523 523 }; 524 524 … … 531 531 virtual ~EmptyHandler() { } 532 532 533 void updateInput(float dt) { }534 void updateJoyStick(float dt, unsigned int joyStick) { }535 void updateMouse(float dt) { }536 void updateKey(float dt) { }533 void tickInput(float dt) { } 534 void tickJoyStick(float dt, unsigned int joyStick) { } 535 void tickMouse(float dt) { } 536 void tickKey(float dt) { } 537 537 538 538 void keyPressed (const KeyEvent& evt) { } -
code/branches/questsystem5/src/core/input/InputManager.cc
r2907 r2908 43 43 44 44 #include "util/Exception.h" 45 #include "core/Clock.h"46 45 #include "core/CoreIncludes.h" 47 46 #include "core/ConfigValueIncludes.h" … … 109 108 , internalState_(Uninitialised) 110 109 , stateEmpty_(0) 110 , stateMaster_(0) 111 111 , keyDetector_(0) 112 112 , calibratorCallbackBuffer_(0) … … 173 173 //paramList.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE"))); 174 174 //paramList.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND"))); 175 #if defined O RXONOX_PLATFORM_LINUX175 #if defined OIS_LINUX_PLATFORM 176 176 paramList.insert(std::make_pair(std::string("XAutoRepeatOn"), std::string("true"))); 177 177 paramList.insert(std::make_pair(std::string("x11_mouse_grab"), "true")); … … 218 218 219 219 // Lowest priority empty InputState 220 stateEmpty_ = createInputState<SimpleInputState>("empty", false, false, InputStatePriority::Empty);220 stateEmpty_ = createInputState<SimpleInputState>("empty", -1); 221 221 stateEmpty_->setHandler(&EMPTY_HANDLER); 222 222 activeStates_[stateEmpty_->getPriority()] = stateEmpty_; 223 223 224 // Always active master InputState 225 stateMaster_ = new ExtendedInputState(); 226 stateMaster_->setName("master"); 227 stateMaster_->setNumOfJoySticks(joySticksSize_); 228 224 229 // KeyDetector to evaluate a pressed key's name 225 SimpleInputState* detector = createInputState<SimpleInputState>("detector", false, false, InputStatePriority::Detector);230 SimpleInputState* detector = createInputState<SimpleInputState>("detector", 101); 226 231 keyDetector_ = new KeyDetector(); 227 232 detector->setHandler(keyDetector_); 228 233 229 234 // Joy stick calibration helper callback 230 SimpleInputState* calibrator = createInputState<SimpleInputState>("calibrator", false, false, InputStatePriority::Calibrator);235 SimpleInputState* calibrator = createInputState<SimpleInputState>("calibrator", 100); 231 236 calibrator->setHandler(&EMPTY_HANDLER); 232 237 calibratorCallbackBuffer_ = new InputBuffer(); … … 419 424 420 425 // state management 421 activeStatesT riggered_.resize(devicesNum_);426 activeStatesTop_.resize(devicesNum_); 422 427 423 428 // inform all states 424 for (std::map< std::string, InputState*>::const_iterator it = inputStatesByName_.begin();425 it != inputStatesBy Name_.end(); ++it)429 for (std::map<int, InputState*>::const_iterator it = inputStatesByPriority_.begin(); 430 it != inputStatesByPriority_.end(); ++it) 426 431 { 427 432 it->second->setNumOfJoySticks(joySticksSize_); 428 433 } 434 // inform master state 435 if (stateMaster_) 436 this->stateMaster_->setNumOfJoySticks(joySticksSize_); 429 437 430 438 // inform all JoyStick Device Number Listeners … … 446 454 } 447 455 } 448 456 449 457 void InputManager::_startCalibration() 450 458 { … … 541 549 // destroy the empty InputState 542 550 _destroyState(this->stateEmpty_); 551 // destroy the master input state. This might trigger a memory leak 552 // because the user has forgotten to destroy the KeyBinder or any Handler! 553 delete stateMaster_; 543 554 544 555 // destroy all user InputStates 545 while (inputStatesBy Name_.size() > 0)546 _destroyState((*inputStatesBy Name_.rbegin()).second);556 while (inputStatesByPriority_.size() > 0) 557 _destroyState((*inputStatesByPriority_.rbegin()).second); 547 558 548 559 // destroy the devices … … 628 639 _updateActiveStates(); 629 640 } 641 inputStatesByPriority_.erase(state->getPriority()); 630 642 inputStatesByName_.erase(state->getName()); 631 643 delete state; … … 658 670 @brief 659 671 Public interface. Only reloads immediately if the call stack doesn't 660 include the update() method.672 include the tick() method. 661 673 @param joyStickSupport 662 674 Whether or not to initialise joy sticks as well. … … 730 742 @brief 731 743 Updates the states and the InputState situation. 732 @param time733 Clock holding the current time.734 */ 735 void InputManager:: update(const Clock& time)744 @param dt 745 Delta time 746 */ 747 void InputManager::tick(float dt) 736 748 { 737 749 if (internalState_ == Uninitialised) … … 747 759 if (!stateLeaveRequests_.empty()) 748 760 { 749 for (std::set<InputState*>:: iterator it = stateLeaveRequests_.begin();750 it != stateLeaveRequests_.end(); ++it)751 { 752 (* it)->onLeave();761 for (std::set<InputState*>::reverse_iterator rit = stateLeaveRequests_.rbegin(); 762 rit != stateLeaveRequests_.rend(); ++rit) 763 { 764 (*rit)->onLeave(); 753 765 // just to be sure that the state actually is registered 754 assert(inputStatesByName_.find((*it)->getName()) != inputStatesByName_.end()); 755 756 activeStates_.erase((*it)->getPriority()); 757 if ((*it)->getPriority() < InputStatePriority::HighPriority) 758 (*it)->setPriority(0); 766 assert(inputStatesByName_.find((*rit)->getName()) != inputStatesByName_.end()); 767 768 activeStates_.erase((*rit)->getPriority()); 759 769 _updateActiveStates(); 760 770 } … … 765 775 if (!stateEnterRequests_.empty()) 766 776 { 767 for (std::set<InputState*>:: const_iterator it = stateEnterRequests_.begin();768 it != stateEnterRequests_.end(); ++it)777 for (std::set<InputState*>::reverse_iterator rit = stateEnterRequests_.rbegin(); 778 rit != stateEnterRequests_.rend(); ++rit) 769 779 { 770 780 // just to be sure that the state actually is registered 771 assert(inputStatesByName_.find((*it)->getName()) != inputStatesByName_.end()); 772 773 if ((*it)->getPriority() == 0) 774 { 775 // Get smallest possible priority between 1 and maxStateStackSize_s 776 #if defined( __MINGW32__ ) // Avoid the strange mingw-stl bug with const_reverse_iterator 777 for(std::map<int, InputState*>::reverse_iterator rit = activeStates_.rbegin(); 778 rit != activeStates_.rend(); ++rit) 779 #else 780 for(std::map<int, InputState*>::const_reverse_iterator rit = activeStates_.rbegin(); 781 rit != activeStates_.rend(); ++rit) 782 #endif 783 { 784 if (rit->first < InputStatePriority::HighPriority) 785 { 786 (*it)->setPriority(rit->first + 1); 787 break; 788 } 789 } 790 // In case no normal handler was on the stack 791 if ((*it)->getPriority() == 0) 792 (*it)->setPriority(1); 793 } 794 activeStates_[(*it)->getPriority()] = (*it); 781 assert(inputStatesByName_.find((*rit)->getName()) != inputStatesByName_.end()); 782 783 activeStates_[(*rit)->getPriority()] = (*rit); 795 784 _updateActiveStates(); 796 (* it)->onEnter();785 (*rit)->onEnter(); 797 786 } 798 787 stateEnterRequests_.clear(); … … 802 791 if (!stateDestroyRequests_.empty()) 803 792 { 804 for (std::set<InputState*>:: iterator it = stateDestroyRequests_.begin();805 it != stateDestroyRequests_.end(); ++it)806 { 807 _destroyState((* it));793 for (std::set<InputState*>::reverse_iterator rit = stateDestroyRequests_.rbegin(); 794 rit != stateDestroyRequests_.rend(); ++rit) 795 { 796 _destroyState((*rit)); 808 797 } 809 798 stateDestroyRequests_.clear(); … … 823 812 _updateActiveStates(); 824 813 825 // mark that we now start capturing and distributinginput814 // mark that we capture and distribute input 826 815 internalState_ |= Ticking; 827 816 … … 840 829 { 841 830 KeyEvent kEvt(keysDown_[iKey], keyboardModifiers_); 842 843 for (unsigned int iState = 0; iState < activeStatesTriggered_[Keyboard].size(); ++iState) 844 activeStatesTriggered_[Keyboard][iState]->keyHeld(kEvt); 831 activeStatesTop_[Keyboard]->keyHeld(kEvt); 832 stateMaster_->keyHeld(kEvt); 845 833 } 846 834 … … 848 836 for (unsigned int iButton = 0; iButton < mouseButtonsDown_.size(); iButton++) 849 837 { 850 for (unsigned int iState = 0; iState < activeStatesTriggered_[Mouse].size(); ++iState)851 activeStatesTriggered_[Mouse][iState]->mouseButtonHeld(mouseButtonsDown_[iButton]);838 activeStatesTop_[Mouse]->mouseButtonHeld(mouseButtonsDown_[iButton]); 839 stateMaster_->mouseButtonHeld(mouseButtonsDown_[iButton]); 852 840 } 853 841 … … 856 844 for (unsigned int iButton = 0; iButton < joyStickButtonsDown_[iJoyStick].size(); iButton++) 857 845 { 858 for (unsigned int iState = 0; iState < activeStatesTriggered_[JoyStick0 + iJoyStick].size(); ++iState) 859 activeStatesTriggered_[JoyStick0 + iJoyStick][iState]->joyStickButtonHeld(iJoyStick, joyStickButtonsDown_[iJoyStick][iButton]); 846 activeStatesTop_[JoyStick0 + iJoyStick] 847 ->joyStickButtonHeld(iJoyStick, joyStickButtonsDown_[iJoyStick][iButton]); 848 stateMaster_->joyStickButtonHeld(iJoyStick, joyStickButtonsDown_[iJoyStick][iButton]); 860 849 } 861 850 862 // updatethe handlers for each active handler851 // tick the handlers for each active handler 863 852 for (unsigned int i = 0; i < devicesNum_; ++i) 864 853 { 865 for (unsigned int iState = 0; iState < activeStatesTriggered_[i].size(); ++iState) 866 activeStatesTriggered_[i][iState]->updateInput(time.getDeltaTime(), i); 867 } 868 869 // update the handler with a general tick afterwards 854 activeStatesTop_[i]->tickInput(dt, i); 855 if (stateMaster_->isInputDeviceEnabled(i)) 856 stateMaster_->tickInput(dt, i); 857 } 858 859 // tick the handler with a general tick afterwards 870 860 for (unsigned int i = 0; i < activeStatesTicked_.size(); ++i) 871 activeStatesTicked_[i]->updateInput(time.getDeltaTime()); 861 activeStatesTicked_[i]->tickInput(dt); 862 stateMaster_->tickInput(dt); 872 863 } 873 864 … … 878 869 @brief 879 870 Updates the currently active states (according to activeStates_) for each device. 880 Also, a list of all active states (no duplicates!) is compiled for the general update().871 Also, a list of all active states (no duplicates!) is compiled for the general tick. 881 872 */ 882 873 void InputManager::_updateActiveStates() 883 874 { 884 for (unsigned int i = 0; i < devicesNum_; ++i) 885 { 886 bool occupied = false; 887 activeStatesTriggered_[i].clear(); 888 #if defined( __MINGW32__ ) // Avoid the strange mingw-stl bug with const_reverse_iterator 889 for (std::map<int, InputState*>::reverse_iterator rit = activeStates_.rbegin(); rit != activeStates_.rend(); ++rit) 890 { 891 #else 892 for (std::map<int, InputState*>::const_reverse_iterator rit = activeStates_.rbegin(); rit != activeStates_.rend(); ++rit) 893 { 894 #endif 895 if (rit->second->isInputDeviceEnabled(i) && (!occupied || rit->second->bAlwaysGetsInput_)) 896 { 897 activeStatesTriggered_[i].push_back(rit->second); 898 if (!rit->second->bTransparent_) 899 occupied = true; 900 } 901 } 902 } 875 for (std::map<int, InputState*>::const_iterator it = activeStates_.begin(); it != activeStates_.end(); ++it) 876 for (unsigned int i = 0; i < devicesNum_; ++i) 877 if (it->second->isInputDeviceEnabled(i)) 878 activeStatesTop_[i] = it->second; 903 879 904 880 // update tickables (every state will only appear once) … … 906 882 std::set<InputState*> tempSet; 907 883 for (unsigned int i = 0; i < devicesNum_; ++i) 908 for (unsigned int iState = 0; iState < activeStatesTriggered_[i].size(); ++iState) 909 tempSet.insert(activeStatesTriggered_[i][iState]); 910 911 // copy the content of the std::set back to the actual vector 884 tempSet.insert(activeStatesTop_[i]); 885 886 // copy the content of the set back to the actual vector 912 887 activeStatesTicked_.clear(); 913 888 for (std::set<InputState*>::const_iterator it = tempSet.begin();it != tempSet.end(); ++it) … … 967 942 968 943 KeyEvent kEvt(e, keyboardModifiers_); 969 for (unsigned int iState = 0; iState < activeStatesTriggered_[Keyboard].size(); ++iState)970 activeStatesTriggered_[Keyboard][iState]->keyPressed(kEvt);944 activeStatesTop_[Keyboard]->keyPressed(kEvt); 945 stateMaster_->keyPressed(kEvt); 971 946 972 947 return true; … … 1000 975 1001 976 KeyEvent kEvt(e, keyboardModifiers_); 1002 for (unsigned int iState = 0; iState < activeStatesTriggered_[Keyboard].size(); ++iState)1003 activeStatesTriggered_[Keyboard][iState]->keyReleased(kEvt);977 activeStatesTop_[Keyboard]->keyReleased(kEvt); 978 stateMaster_->keyReleased(kEvt); 1004 979 1005 980 return true; … … 1023 998 IntVector2 rel(e.state.X.rel, e.state.Y.rel); 1024 999 IntVector2 clippingSize(e.state.width, e.state.height); 1025 for (unsigned int iState = 0; iState < activeStatesTriggered_[Mouse].size(); ++iState)1026 activeStatesTriggered_[Mouse][iState]->mouseMoved(abs, rel, clippingSize);1000 activeStatesTop_[Mouse]->mouseMoved(abs, rel, clippingSize); 1001 stateMaster_->mouseMoved(abs, rel, clippingSize); 1027 1002 } 1028 1003 … … 1030 1005 if (e.state.Z.rel != 0) 1031 1006 { 1032 for (unsigned int iState = 0; iState < activeStatesTriggered_[Mouse].size(); ++iState)1033 activeStatesTriggered_[Mouse][iState]->mouseScrolled(e.state.Z.abs, e.state.Z.rel);1007 activeStatesTop_[Mouse]->mouseScrolled(e.state.Z.abs, e.state.Z.rel); 1008 stateMaster_->mouseScrolled(e.state.Z.abs, e.state.Z.rel); 1034 1009 } 1035 1010 … … 1054 1029 mouseButtonsDown_.push_back((MouseButtonCode::ByEnum)id); 1055 1030 1056 for (unsigned int iState = 0; iState < activeStatesTriggered_[Mouse].size(); ++iState)1057 activeStatesTriggered_[Mouse][iState]->mouseButtonPressed((MouseButtonCode::ByEnum)id);1031 activeStatesTop_[Mouse]->mouseButtonPressed((MouseButtonCode::ByEnum)id); 1032 stateMaster_->mouseButtonPressed((MouseButtonCode::ByEnum)id); 1058 1033 1059 1034 return true; … … 1080 1055 } 1081 1056 1082 for (unsigned int iState = 0; iState < activeStatesTriggered_[Mouse].size(); ++iState)1083 activeStatesTriggered_[Mouse][iState]->mouseButtonReleased((MouseButtonCode::ByEnum)id);1057 activeStatesTop_[Mouse]->mouseButtonReleased((MouseButtonCode::ByEnum)id); 1058 stateMaster_->mouseButtonReleased((MouseButtonCode::ByEnum)id); 1084 1059 1085 1060 return true; … … 1117 1092 buttonsDown.push_back((JoyStickButtonCode::ByEnum)button); 1118 1093 1119 for (unsigned int iState = 0; iState < activeStatesTriggered_[2 + iJoyStick].size(); ++iState)1120 activeStatesTriggered_[2 + iJoyStick][iState]->joyStickButtonPressed(iJoyStick, (JoyStickButtonCode::ByEnum)button);1094 activeStatesTop_[2 + iJoyStick]->joyStickButtonPressed(iJoyStick, (JoyStickButtonCode::ByEnum)button); 1095 stateMaster_->joyStickButtonPressed(iJoyStick, (JoyStickButtonCode::ByEnum)button); 1121 1096 1122 1097 return true; … … 1138 1113 } 1139 1114 1140 for (unsigned int iState = 0; iState < activeStatesTriggered_[2 + iJoyStick].size(); ++iState)1141 activeStatesTriggered_[2 + iJoyStick][iState]->joyStickButtonReleased(iJoyStick, (JoyStickButtonCode::ByEnum)button);1115 activeStatesTop_[2 + iJoyStick]->joyStickButtonReleased(iJoyStick, (JoyStickButtonCode::ByEnum)button); 1116 stateMaster_->joyStickButtonReleased(iJoyStick, (JoyStickButtonCode::ByEnum)button); 1142 1117 1143 1118 return true; … … 1166 1141 fValue *= joyStickCalibrations_[iJoyStick].negativeCoeff[axis]; 1167 1142 1168 for (unsigned int iState = 0; iState < activeStatesTriggered_[2 + iJoyStick].size(); ++iState)1169 activeStatesTriggered_[2 + iJoyStick][iState]->joyStickAxisMoved(iJoyStick, axis, fValue);1143 activeStatesTop_[2 + iJoyStick]->joyStickAxisMoved(iJoyStick, axis, fValue); 1144 stateMaster_->joyStickAxisMoved(iJoyStick, axis, fValue); 1170 1145 } 1171 1146 } … … 1270 1245 Unique name of the handler. 1271 1246 @param priority 1272 Determines which InputState gets the input. Higher is better. 1273 Use 0 to handle it implicitely by the order of activation. 1274 Otherwise numbers larger than maxStateStackSize_s have to be used! 1247 Unique integer number. Higher means more prioritised. 1275 1248 @return 1276 1249 True if added, false if name or priority already existed. 1277 1250 */ 1278 bool InputManager::_configureInputState(InputState* state, const std::string& name, bool bAlwaysGetsInput, bool bTransparent,int priority)1251 bool InputManager::_configureInputState(InputState* state, const std::string& name, int priority) 1279 1252 { 1280 1253 if (name == "") … … 1284 1257 if (inputStatesByName_.find(name) == inputStatesByName_.end()) 1285 1258 { 1286 if (priority >= InputStatePriority::HighPriority || priority == InputStatePriority::Empty) 1287 { 1288 // Make sure we don't add two high priority states with the same priority 1289 for (std::map<std::string, InputState*>::const_iterator it = this->inputStatesByName_.begin(); 1290 it != this->inputStatesByName_.end(); ++it) 1291 { 1292 if (it->second->getPriority() == priority) 1293 { 1294 COUT(2) << "Warning: Could not add an InputState with the same priority '" 1295 << priority << "' != 0." << std::endl; 1296 return false; 1297 } 1298 } 1299 } 1300 inputStatesByName_[name] = state; 1301 state->setNumOfJoySticks(numberOfJoySticks()); 1302 state->setName(name); 1303 state->bAlwaysGetsInput_ = bAlwaysGetsInput; 1304 state->bTransparent_ = bTransparent; 1305 if (priority >= InputStatePriority::HighPriority || priority == InputStatePriority::Empty) 1259 if (inputStatesByPriority_.find(priority) 1260 == inputStatesByPriority_.end()) 1261 { 1262 inputStatesByName_[name] = state; 1263 inputStatesByPriority_[priority] = state; 1264 state->setNumOfJoySticks(numberOfJoySticks()); 1265 state->setName(name); 1306 1266 state->setPriority(priority); 1307 return true; 1267 return true; 1268 } 1269 else 1270 { 1271 COUT(2) << "Warning: Could not add an InputState with the same priority '" 1272 << priority << "'." << std::endl; 1273 return false; 1274 } 1308 1275 } 1309 1276 else … … 1323 1290 @remarks 1324 1291 You can't remove the internal states "empty", "calibrator" and "detector". 1325 The removal process is being postponed if InputManager:: update() is currently running.1292 The removal process is being postponed if InputManager::tick() is currently running. 1326 1293 */ 1327 1294 bool InputManager::requestDestroyState(const std::string& name) … … 1404 1371 { 1405 1372 // not scheduled for destruction 1406 // prevents a state being added multiple times1373 // set prevents a state being added multiple times 1407 1374 stateEnterRequests_.insert(it->second); 1408 1375 return true; … … 1423 1390 bool InputManager::requestLeaveState(const std::string& name) 1424 1391 { 1425 if (name == "empty")1426 {1427 COUT(2) << "InputManager: Leaving the empty state is not allowed!" << std::endl;1428 return false;1429 }1430 1392 // get pointer from the map with all stored handlers 1431 1393 std::map<std::string, InputState*>::const_iterator it = inputStatesByName_.find(name); -
code/branches/questsystem5/src/core/input/InputManager.h
r2907 r2908 43 43 #include <stack> 44 44 #include "util/Math.h" 45 #include "util/OrxEnum.h"46 45 #include "core/OrxonoxClass.h" 47 46 #include "InputInterfaces.h" … … 75 74 float positiveCoeff[24]; 76 75 float negativeCoeff[24]; 77 };78 79 struct InputStatePriority : OrxEnum<InputStatePriority>80 {81 OrxEnumConstructors(InputStatePriority);82 83 static const int Empty = -1;84 static const int Dynamic = 0;85 86 static const int HighPriority = 1000;87 static const int Console = HighPriority + 0;88 static const int Calibrator = HighPriority + 1;89 static const int Detector = HighPriority + 2;90 76 }; 91 77 … … 130 116 131 117 template <class T> 132 T* createInputState(const std::string& name, bool bAlwaysGetsInput = false, bool bTransparent = false, InputStatePriority priority = InputStatePriority::Dynamic);118 T* createInputState(const std::string& name, int priority); 133 119 134 120 InputState* getState (const std::string& name); 135 121 InputState* getCurrentState(); 122 ExtendedInputState* getMasterInputState() { return this->stateMaster_; } 136 123 bool requestDestroyState (const std::string& name); 137 124 bool requestEnterState (const std::string& name); 138 125 bool requestLeaveState (const std::string& name); 139 126 140 void update(const Clock& time);127 void tick(float dt); 141 128 142 129 static InputManager& getInstance() { assert(singletonRef_s); return *singletonRef_s; } … … 178 165 179 166 void _updateActiveStates(); 180 bool _configureInputState(InputState* state, const std::string& name, bool bAlwaysGetsInput, bool bTransparent,int priority);167 bool _configureInputState(InputState* state, const std::string& name, int priority); 181 168 182 169 // input events … … 210 197 // some internally handled states and handlers 211 198 SimpleInputState* stateEmpty_; 199 ExtendedInputState* stateMaster_; //!< Always active master input state 212 200 KeyDetector* keyDetector_; //!< KeyDetector instance 213 201 InputBuffer* calibratorCallbackBuffer_; 214 202 215 203 std::map<std::string, InputState*> inputStatesByName_; 204 std::map<int, InputState*> inputStatesByPriority_; 216 205 217 206 std::set<InputState*> stateEnterRequests_; //!< Request to enter a new state … … 220 209 221 210 std::map<int, InputState*> activeStates_; 222 std::vector< std::vector<InputState*> > activeStatesTriggered_;223 std::vector<InputState*> activeStatesTicked_; 211 std::vector<InputState*> activeStatesTop_; //!< Current input states for joy stick events. 212 std::vector<InputState*> activeStatesTicked_; //!< Current input states for joy stick events. 224 213 225 214 // joystick calibration … … 260 249 */ 261 250 template <class T> 262 T* InputManager::createInputState(const std::string& name, bool bAlwaysGetsInput, bool bTransparent, InputStatePrioritypriority)251 T* InputManager::createInputState(const std::string& name, int priority) 263 252 { 264 253 T* state = new T; 265 if (_configureInputState(state, name, bAlwaysGetsInput, bTransparent,priority))254 if (_configureInputState(state, name, priority)) 266 255 return state; 267 256 else -
code/branches/questsystem5/src/core/input/InputState.h
r2907 r2908 71 71 virtual void unRegisterOnLeave() { executorOnLeave_ = 0; } 72 72 73 virtual void updateInput(float dt, unsigned int device) = 0;74 virtual void updateInput(float dt) = 0;73 virtual void tickInput(float dt, unsigned int device) = 0; 74 virtual void tickInput(float dt) = 0; 75 75 76 76 virtual void keyPressed (const KeyEvent& evt) = 0; … … 90 90 91 91 protected: 92 InputState() 93 : bHandlersChanged_(false) 94 , priority_(0) 95 , bAlwaysGetsInput_(false) 96 , bTransparent_(false) 97 , executorOnEnter_(0) 98 , executorOnLeave_(0) 99 { } 92 InputState() : bHandlersChanged_(false), priority_(0), executorOnEnter_(0), executorOnLeave_(0) { } 100 93 virtual ~InputState() { } 101 94 … … 121 114 int priority_; 122 115 std::vector<bool> bInputDeviceEnabled_; 123 bool bAlwaysGetsInput_;124 bool bTransparent_;125 116 126 117 Executor* executorOnEnter_; -
code/branches/questsystem5/src/core/input/KeyBinder.cc
r2907 r2908 42 42 #include "core/CoreIncludes.h" 43 43 #include "core/ConfigFileManager.h" 44 #include "core/Core.h" 44 45 #include "InputCommands.h" 45 46 #include "InputManager.h" … … 308 309 } 309 310 310 void KeyBinder:: updateMouse(float dt)311 void KeyBinder::tickMouse(float dt) 311 312 { 312 313 if (bDeriveMouseInput_) … … 348 349 // Why dividing relative value by dt? The reason lies in the simple fact, that when you 349 350 // press a button that has relative movement, that value has to be multiplied by dt to be 350 // frame rate independent. This can easily (and only) be done in updateInput(float).351 // frame rate independent. This can easily (and only) be done in tickInput(float). 351 352 // Hence we need to divide by dt here for the mouse to compensate, because the relative 352 353 // move movements have nothing to do with dt. … … 361 362 } 362 363 363 void KeyBinder:: updateJoyStick(float dt, unsigned int joyStick)364 void KeyBinder::tickJoyStick(float dt, unsigned int joyStick) 364 365 { 365 366 for (unsigned int i = 0; i < JoyStickAxisCode::numberOfAxes * 2; i++) -
code/branches/questsystem5/src/core/input/KeyBinder.h
r2907 r2908 68 68 69 69 protected: // functions 70 void updateInput(float dt);71 void updateKey(float dt) { }72 void updateMouse(float dt);73 void updateJoyStick(float dt, unsigned int joyStick);70 void tickInput(float dt); 71 void tickKey(float dt) { } 72 void tickMouse(float dt); 73 void tickJoyStick(float dt, unsigned int joyStick); 74 74 // internal 75 75 void tickHalfAxis(HalfAxis& halfAxis); … … 134 134 @brief 135 135 Commands that have additional parameters (axes) are executed at the end of 136 update() so that all values can be buffered for single execution.136 the tick() so that all values can be buffered for single execution. 137 137 */ 138 138 std::vector<BufferedParamCommand*> paramCommandBuffer_; … … 200 200 { joyStickButtons_[joyStickID][id].execute(KeybindMode::OnHold); } 201 201 202 inline void KeyBinder:: updateInput(float dt)202 inline void KeyBinder::tickInput(float dt) 203 203 { 204 204 // execute all buffered bindings (additional parameter) -
code/branches/questsystem5/src/core/input/SimpleInputState.h
r2907 r2908 59 59 ~SimpleInputState() { } 60 60 61 void updateInput(float dt);62 void updateInput(float dt, unsigned int device);61 void tickInput(float dt); 62 void tickInput(float dt, unsigned int device); 63 63 64 64 void keyPressed (const KeyEvent& evt); … … 87 87 }; 88 88 89 inline void SimpleInputState:: updateInput(float dt)89 inline void SimpleInputState::tickInput(float dt) 90 90 { 91 91 for (unsigned int i = 0; i < allHandlers_.size(); ++i) 92 92 { 93 allHandlers_[i]-> updateInput(dt);93 allHandlers_[i]->tickInput(dt); 94 94 } 95 95 } 96 96 97 inline void SimpleInputState:: updateInput(float dt, unsigned int device)97 inline void SimpleInputState::tickInput(float dt, unsigned int device) 98 98 { 99 99 switch (device) … … 101 101 case InputDevice::Keyboard: 102 102 if (keyHandler_) 103 keyHandler_-> updateKey(dt);103 keyHandler_->tickKey(dt); 104 104 break; 105 105 106 106 case InputDevice::Mouse: 107 107 if (mouseHandler_) 108 mouseHandler_-> updateMouse(dt);108 mouseHandler_->tickMouse(dt); 109 109 break; 110 110 111 111 default: // joy sticks 112 112 if (joyStickHandler_[device - 2]) 113 joyStickHandler_[device - 2]-> updateJoyStick(dt, device - 2);113 joyStickHandler_[device - 2]->tickJoyStick(dt, device - 2); 114 114 break; 115 115 }
Note: See TracChangeset
for help on using the changeset viewer.