CmInputHandlerOIS.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include "CmInputHandlerOIS.h"
  2. #include "CmVector2I.h"
  3. #include "OIS/OISException.h"
  4. #include "CmRenderWindow.h"
  5. #include "CmTime.h"
  6. namespace CamelotFramework
  7. {
  8. InputHandlerOIS::InputHandlerOIS(unsigned int hWnd)
  9. :mInputManager(nullptr), mKeyboard(nullptr), mMouse(nullptr), mTimestampClockOffset(0)
  10. {
  11. OIS::ParamList pl;
  12. std::ostringstream windowHndStr;
  13. windowHndStr << hWnd;
  14. pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
  15. #if defined CM_PLATFORM == CM_PLATFORM_WIN32
  16. pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND" )));
  17. pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE")));
  18. pl.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_FOREGROUND")));
  19. pl.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_NONEXCLUSIVE")));
  20. #elif defined CM_PLATFORM == CM_PLATFORM_LINUX || CM_PLATFORM == CM_PLATFORM_APPLE
  21. pl.insert(std::make_pair(std::string("x11_mouse_grab"), std::string("false")));
  22. pl.insert(std::make_pair(std::string("x11_mouse_hide"), std::string("false")));
  23. pl.insert(std::make_pair(std::string("x11_keyboard_grab"), std::string("false")));
  24. pl.insert(std::make_pair(std::string("XAutoRepeatOn"), std::string("true")));
  25. #endif
  26. try
  27. {
  28. mInputManager = OIS::InputManager::createInputSystem(pl);
  29. }
  30. catch(OIS::Exception &e)
  31. {
  32. std::cout << e.eText << std::endl;
  33. }
  34. mKeyboard = static_cast<OIS::Keyboard*>(mInputManager->createInputObject(OIS::OISKeyboard, true));
  35. mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject(OIS::OISMouse, true));
  36. // OIS reports times since system start but we use time since program start
  37. mTimestampClockOffset = gTime().getStartTimeMs();
  38. mMouse->setEventCallback(this);
  39. mKeyboard->setEventCallback(this);
  40. }
  41. InputHandlerOIS::~InputHandlerOIS()
  42. {
  43. if(mInputManager)
  44. {
  45. if(mMouse)
  46. mInputManager->destroyInputObject(mMouse);
  47. if(mKeyboard)
  48. mInputManager->destroyInputObject(mKeyboard);
  49. OIS::InputManager::destroyInputSystem(mInputManager);
  50. mInputManager = nullptr;
  51. }
  52. }
  53. void InputHandlerOIS::update()
  54. {
  55. mMouse->capture();
  56. mKeyboard->capture();
  57. }
  58. void InputHandlerOIS::inputWindowChanged(const RenderWindow& win)
  59. {
  60. unsigned long long hWnd;
  61. win.getCustomAttribute("WINDOW", &hWnd);
  62. std::string normalString = toString((UINT64)hWnd).c_str();
  63. mKeyboard->setCaptureContext(normalString);
  64. mMouse->setCaptureContext(normalString);
  65. }
  66. bool InputHandlerOIS::keyPressed(const OIS::KeyEvent &arg)
  67. {
  68. onButtonDown(keyCodeToButtonCode(arg.key), arg.timestamp - mTimestampClockOffset);
  69. return true;
  70. }
  71. bool InputHandlerOIS::keyReleased(const OIS::KeyEvent& arg)
  72. {
  73. onButtonUp(keyCodeToButtonCode(arg.key), arg.timestamp - mTimestampClockOffset);
  74. return true;
  75. }
  76. bool InputHandlerOIS::mouseMoved(const OIS::MouseEvent& arg)
  77. {
  78. RawAxisState xyState;
  79. xyState.abs = Vector2I(arg.state.X.abs, arg.state.Y.abs);
  80. xyState.rel = Vector2I(arg.state.X.rel, arg.state.Y.rel);
  81. onAxisMoved(xyState, RawInputAxis::Mouse_XY);
  82. RawAxisState zState;
  83. zState.abs = Vector2I(arg.state.Z.abs, 0);
  84. zState.rel = Vector2I(arg.state.Z.rel, 0);
  85. onAxisMoved(zState, RawInputAxis::Mouse_Z);
  86. return true;
  87. }
  88. bool InputHandlerOIS::mousePressed(const OIS::MouseEvent& arg, OIS::MouseButtonID id)
  89. {
  90. onButtonDown(mouseButtonToButtonCode(id), arg.timestamp - mTimestampClockOffset);
  91. return true;
  92. }
  93. bool InputHandlerOIS::mouseReleased(const OIS::MouseEvent& arg, OIS::MouseButtonID id)
  94. {
  95. onButtonUp(mouseButtonToButtonCode(id), arg.timestamp - mTimestampClockOffset);
  96. return true;
  97. }
  98. ButtonCode InputHandlerOIS::keyCodeToButtonCode(OIS::KeyCode keyCode) const
  99. {
  100. return (ButtonCode)keyCode;
  101. }
  102. ButtonCode InputHandlerOIS::mouseButtonToButtonCode(OIS::MouseButtonID mouseBtn) const
  103. {
  104. return (ButtonCode)(((int)mouseBtn + BC_NumKeys) | 0x80000000);
  105. }
  106. }