CmInputHandlerOIS.cpp 3.7 KB

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