CmInputHandlerOIS.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include "CmInputHandlerOIS.h"
  2. #include "CmInt2.h"
  3. #include "OIS/OISException.h"
  4. namespace CamelotFramework
  5. {
  6. InputHandlerOIS::InputHandlerOIS(unsigned int hWnd)
  7. :mInputManager(nullptr), mKeyboard(nullptr), mMouse(nullptr)
  8. {
  9. OIS::ParamList pl;
  10. std::ostringstream windowHndStr;
  11. windowHndStr << hWnd;
  12. pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
  13. #if defined CM_PLATFORM == CM_PLATFORM_WIN32
  14. pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_BACKGROUND" )));
  15. pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE")));
  16. pl.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_BACKGROUND")));
  17. pl.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_NONEXCLUSIVE")));
  18. #elif defined CM_PLATFORM == CM_PLATFORM_LINUX || CM_PLATFORM == CM_PLATFORM_APPLE
  19. pl.insert(std::make_pair(std::string("x11_mouse_grab"), std::string("false")));
  20. pl.insert(std::make_pair(std::string("x11_mouse_hide"), std::string("false")));
  21. pl.insert(std::make_pair(std::string("x11_keyboard_grab"), std::string("false")));
  22. pl.insert(std::make_pair(std::string("XAutoRepeatOn"), std::string("true")));
  23. #endif
  24. try
  25. {
  26. mInputManager = OIS::InputManager::createInputSystem(pl);
  27. }
  28. catch(OIS::Exception &e)
  29. {
  30. std::cout << e.eText << std::endl;
  31. }
  32. mKeyboard = static_cast<OIS::Keyboard*>(mInputManager->createInputObject(OIS::OISKeyboard, true));
  33. mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject(OIS::OISMouse, true));
  34. mMouse->setEventCallback(this);
  35. mKeyboard->setEventCallback(this);
  36. }
  37. InputHandlerOIS::~InputHandlerOIS()
  38. {
  39. if(mInputManager)
  40. {
  41. if(mMouse)
  42. mInputManager->destroyInputObject(mMouse);
  43. if(mKeyboard)
  44. mInputManager->destroyInputObject(mKeyboard);
  45. OIS::InputManager::destroyInputSystem(mInputManager);
  46. mInputManager = nullptr;
  47. }
  48. }
  49. void InputHandlerOIS::update()
  50. {
  51. mMouse->capture();
  52. mKeyboard->capture();
  53. }
  54. bool InputHandlerOIS::keyPressed(const OIS::KeyEvent &arg)
  55. {
  56. KeyEvent event;
  57. event.keyCode = (KeyCode)(int)arg.key;
  58. event.textChar = arg.text;
  59. onKeyDown(event);
  60. return true;
  61. }
  62. bool InputHandlerOIS::keyReleased(const OIS::KeyEvent& arg)
  63. {
  64. KeyEvent event;
  65. event.keyCode = (KeyCode)(int)arg.key;
  66. event.textChar = arg.text;
  67. onKeyUp(event);
  68. return true;
  69. }
  70. bool InputHandlerOIS::mouseMoved(const OIS::MouseEvent& arg)
  71. {
  72. MouseEvent event;
  73. event.coords = Int2(arg.state.X.abs, arg.state.Y.abs);
  74. event.relCoords = Int2(arg.state.X.rel, arg.state.Y.rel);
  75. event.z = arg.state.Z.abs;
  76. event.relZ = arg.state.Z.rel;
  77. onMouseMoved(event);
  78. return true;
  79. }
  80. bool InputHandlerOIS::mousePressed(const OIS::MouseEvent& arg, OIS::MouseButtonID id)
  81. {
  82. MouseEvent event;
  83. event.coords = Int2(arg.state.X.abs, arg.state.Y.abs);
  84. event.relCoords = Int2(arg.state.X.rel, arg.state.Y.rel);
  85. event.z = arg.state.Z.abs;
  86. event.relZ = arg.state.Z.rel;
  87. onMouseDown(event, (MouseButton)(int)id);
  88. return true;
  89. }
  90. bool InputHandlerOIS::mouseReleased(const OIS::MouseEvent& arg, OIS::MouseButtonID id)
  91. {
  92. MouseEvent event;
  93. event.coords = Int2(arg.state.X.abs, arg.state.Y.abs);
  94. event.relCoords = Int2(0, 0);
  95. event.z = arg.state.Z.abs;
  96. onMouseUp(event, (MouseButton)(int)id);
  97. return true;
  98. }
  99. }