CmOSInputHandler.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. #include "CmOSInputHandler.h"
  2. #include "CmPlatform.h"
  3. #include "CmInput.h"
  4. #include "CmMath.h"
  5. namespace CamelotFramework
  6. {
  7. OSInputHandler::OSInputHandler()
  8. :mMouseScroll(0.0f)
  9. {
  10. mCharInputConn = Platform::onCharInput.connect(boost::bind(&OSInputHandler::charInput, this, _1));
  11. mCursorMovedConn = Platform::onCursorMoved.connect(boost::bind(&OSInputHandler::cursorMoved, this, _1, _2));
  12. mCursorPressedConn = Platform::onCursorButtonPressed.connect(boost::bind(&OSInputHandler::cursorPressed, this, _1, _2, _3));
  13. mCursorReleasedConn = Platform::onCursorButtonReleased.connect(boost::bind(&OSInputHandler::cursorReleased, this, _1, _2, _3));
  14. mInputCommandConn = Platform::onInputCommand.connect(boost::bind(&OSInputHandler::inputCommandEntered, this, _1));
  15. mMouseWheelScrolledConn = Platform::onMouseWheelScrolled.connect(boost::bind(&OSInputHandler::mouseWheelScrolled, this, _1));
  16. }
  17. OSInputHandler::~OSInputHandler()
  18. {
  19. mCharInputConn.disconnect();
  20. mCursorMovedConn.disconnect();
  21. mCursorPressedConn.disconnect();
  22. mCursorReleasedConn.disconnect();
  23. mInputCommandConn.disconnect();
  24. mMouseWheelScrolledConn.disconnect();
  25. }
  26. void OSInputHandler::update()
  27. {
  28. WString inputString;
  29. Int2 mousePosition;
  30. float mouseScroll;
  31. OSPositionalInputButtonStates mouseMoveBtnState;
  32. Queue<ButtonStateChange>::type buttonStates;
  33. Queue<InputCommandType>::type inputCommands;
  34. {
  35. CM_LOCK_MUTEX(mOSInputMutex);
  36. inputString = mInputString;
  37. mInputString.clear();
  38. mousePosition = mCursorPosition;
  39. mouseScroll = mMouseScroll;
  40. mMouseScroll = 0.0f;
  41. mouseMoveBtnState = mMouseMoveBtnState;
  42. buttonStates = mButtonStates;
  43. mButtonStates = Queue<ButtonStateChange>::type();
  44. inputCommands = mInputCommands;
  45. mInputCommands = Queue<InputCommandType>::type();
  46. }
  47. if(mousePosition != mLastCursorPos || (Math::Abs(mouseScroll) > 0.00001f))
  48. {
  49. if(!onCursorMoved.empty())
  50. {
  51. PositionalInputEvent event;
  52. event.alt = false;
  53. event.shift = mouseMoveBtnState.shift;
  54. event.control = mouseMoveBtnState.ctrl;
  55. event.buttonStates[0] = mouseMoveBtnState.mouseButtons[0];
  56. event.buttonStates[1] = mouseMoveBtnState.mouseButtons[1];
  57. event.buttonStates[2] = mouseMoveBtnState.mouseButtons[2];
  58. event.mouseWheelScrollAmount = mouseScroll;
  59. event.type = PositionalInputEventType::CursorMoved;
  60. event.screenPos = mousePosition;
  61. onCursorMoved(event);
  62. }
  63. mLastCursorPos = mousePosition;
  64. }
  65. while(!buttonStates.empty())
  66. {
  67. ButtonStateChange& btnState = buttonStates.front();
  68. PositionalInputEvent event;
  69. event.alt = false;
  70. event.shift = btnState.btnStates.shift;
  71. event.control = btnState.btnStates.ctrl;
  72. event.buttonStates[0] = btnState.btnStates.mouseButtons[0];
  73. event.buttonStates[1] = btnState.btnStates.mouseButtons[1];
  74. event.buttonStates[2] = btnState.btnStates.mouseButtons[2];
  75. switch(btnState.button)
  76. {
  77. case OSMouseButton::Left:
  78. event.button = PositionalInputEventButton::Left;
  79. break;
  80. case OSMouseButton::Middle:
  81. event.button = PositionalInputEventButton::Middle;
  82. break;
  83. case OSMouseButton::Right:
  84. event.button = PositionalInputEventButton::Right;
  85. break;
  86. }
  87. event.screenPos = btnState.cursorPos;
  88. if(btnState.pressed)
  89. {
  90. event.type = PositionalInputEventType::ButtonPressed;
  91. if(!onCursorPressed.empty())
  92. onCursorPressed(event);
  93. }
  94. else
  95. {
  96. event.type = PositionalInputEventType::ButtonReleased;
  97. if(!onCursorReleased.empty())
  98. onCursorReleased(event);
  99. }
  100. buttonStates.pop();
  101. }
  102. while(!inputCommands.empty())
  103. {
  104. if(!onInputCommand.empty())
  105. onInputCommand(inputCommands.front());
  106. inputCommands.pop();
  107. }
  108. if(!onCharInput.empty())
  109. {
  110. for(auto& curChar : inputString)
  111. {
  112. onCharInput((UINT32)curChar);
  113. }
  114. }
  115. }
  116. void OSInputHandler::charInput(UINT32 character)
  117. {
  118. CM_LOCK_MUTEX(mOSInputMutex);
  119. mInputString += character;
  120. }
  121. void OSInputHandler::cursorMoved(const Int2& cursorPos, OSPositionalInputButtonStates& btnStates)
  122. {
  123. CM_LOCK_MUTEX(mOSInputMutex);
  124. mCursorPosition = cursorPos;
  125. mMouseMoveBtnState = btnStates;
  126. }
  127. void OSInputHandler::cursorPressed(const Int2& cursorPos,
  128. OSMouseButton button, OSPositionalInputButtonStates& btnStates)
  129. {
  130. CM_LOCK_MUTEX(mOSInputMutex);
  131. mButtonStates.push(ButtonStateChange());
  132. ButtonStateChange& btnState = mButtonStates.back();
  133. btnState.cursorPos = cursorPos;
  134. btnState.button = button;
  135. btnState.pressed = true;
  136. btnState.btnStates = btnStates;
  137. }
  138. void OSInputHandler::cursorReleased(const Int2& cursorPos,
  139. OSMouseButton button, OSPositionalInputButtonStates& btnStates)
  140. {
  141. CM_LOCK_MUTEX(mOSInputMutex);
  142. mButtonStates.push(ButtonStateChange());
  143. ButtonStateChange& btnState = mButtonStates.back();
  144. btnState.cursorPos = cursorPos;
  145. btnState.button = button;
  146. btnState.pressed = false;
  147. btnState.btnStates = btnStates;
  148. }
  149. void OSInputHandler::inputCommandEntered(InputCommandType commandType)
  150. {
  151. CM_LOCK_MUTEX(mOSInputMutex);
  152. mInputCommands.push(commandType);
  153. }
  154. void OSInputHandler::mouseWheelScrolled(float scrollPos)
  155. {
  156. CM_LOCK_MUTEX(mOSInputMutex);
  157. mMouseScroll = scrollPos;
  158. }
  159. }