BsInputConfiguration.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #include "BsInputConfiguration.h"
  2. namespace BansheeEngine
  3. {
  4. Map<String, UINT32> VirtualButton::UniqueButtonIds;
  5. UINT32 VirtualButton::NextButtonId = 0;
  6. Map<String, UINT32> VirtualAxis::UniqueAxisIds;
  7. UINT32 VirtualAxis::NextAxisId = 0;
  8. VIRTUAL_BUTTON_DESC::VIRTUAL_BUTTON_DESC()
  9. :buttonCode(BC_0), modifiers(ButtonModifier::None), repeatable(false)
  10. { }
  11. VIRTUAL_BUTTON_DESC::VIRTUAL_BUTTON_DESC(ButtonCode buttonCode, ButtonModifier modifiers, bool repeatable)
  12. :buttonCode(buttonCode), modifiers(modifiers), repeatable(repeatable)
  13. { }
  14. VIRTUAL_AXIS_DESC::VIRTUAL_AXIS_DESC()
  15. : type((UINT32)InputAxis::MouseX), deadZone(0.0001f), sensitivity(1.0f), invert(false)
  16. { }
  17. VIRTUAL_AXIS_DESC::VIRTUAL_AXIS_DESC(UINT32 type, float deadZone, float sensitivity, bool invert)
  18. :type(type), deadZone(deadZone), sensitivity(sensitivity), invert(invert)
  19. { }
  20. VirtualButton::VirtualButton()
  21. :buttonIdentifier(0)
  22. { }
  23. VirtualButton::VirtualButton(const String& name)
  24. {
  25. auto findIter = UniqueButtonIds.find(name);
  26. if(findIter != UniqueButtonIds.end())
  27. buttonIdentifier = findIter->second;
  28. else
  29. {
  30. buttonIdentifier = NextButtonId;
  31. UniqueButtonIds[name] = NextButtonId++;
  32. }
  33. }
  34. VirtualAxis::VirtualAxis()
  35. :axisIdentifier(0)
  36. { }
  37. VirtualAxis::VirtualAxis(const String& name)
  38. {
  39. auto findIter = UniqueAxisIds.find(name);
  40. if (findIter != UniqueAxisIds.end())
  41. axisIdentifier = findIter->second;
  42. else
  43. {
  44. axisIdentifier = NextAxisId;
  45. UniqueAxisIds[name] = NextAxisId++;
  46. }
  47. }
  48. InputConfiguration::InputConfiguration()
  49. :mRepeatInterval(300)
  50. { }
  51. void InputConfiguration::registerButton(const String& name, ButtonCode buttonCode, ButtonModifier modifiers, bool repeatable)
  52. {
  53. Vector<VirtualButtonData>& btnData = mButtons[buttonCode & 0x0000FFFF];
  54. INT32 idx = -1;
  55. for(UINT32 i = 0; i < (UINT32)btnData.size(); i++)
  56. {
  57. if(btnData[i].desc.modifiers == modifiers)
  58. {
  59. idx = (INT32)i;
  60. break;
  61. }
  62. }
  63. if(idx == -1)
  64. {
  65. idx = (INT32)btnData.size();
  66. btnData.push_back(VirtualButtonData());
  67. }
  68. VirtualButtonData& btn = btnData[idx];
  69. btn.name = name;
  70. btn.desc = VIRTUAL_BUTTON_DESC(buttonCode, modifiers, repeatable);
  71. btn.button = VirtualButton(name);
  72. }
  73. void InputConfiguration::unregisterButton(const String& name)
  74. {
  75. Vector<UINT32> toRemove;
  76. for(UINT32 i = 0; i < BC_Count; i++)
  77. {
  78. for(UINT32 j = 0; j < (UINT32)mButtons[i].size(); j++)
  79. {
  80. if(mButtons[i][j].name == name)
  81. toRemove.push_back(j);
  82. }
  83. UINT32 numRemoved = 0;
  84. for(auto& toRemoveIdx : toRemove)
  85. {
  86. mButtons[i].erase(mButtons[i].begin() + toRemoveIdx - numRemoved);
  87. numRemoved++;
  88. }
  89. toRemove.clear();
  90. }
  91. }
  92. void InputConfiguration::registerAxis(const String& name, const VIRTUAL_AXIS_DESC& desc)
  93. {
  94. VirtualAxis axis(name);
  95. if (axis.axisIdentifier >= (UINT32)mAxes.size())
  96. mAxes.resize(axis.axisIdentifier + 1);
  97. mAxes[axis.axisIdentifier].name = name;
  98. mAxes[axis.axisIdentifier].desc = desc;
  99. mAxes[axis.axisIdentifier].axis = axis;
  100. }
  101. void InputConfiguration::unregisterAxis(const String& name)
  102. {
  103. for (UINT32 i = 0; i < (UINT32)mAxes.size(); i++)
  104. {
  105. if (mAxes[i].name == name)
  106. {
  107. mAxes.erase(mAxes.begin() + i);
  108. i--;
  109. }
  110. }
  111. }
  112. bool InputConfiguration::_getButton(ButtonCode code, UINT32 modifiers, VirtualButton& btn, VIRTUAL_BUTTON_DESC& btnDesc) const
  113. {
  114. const Vector<VirtualButtonData>& btnData = mButtons[code & 0x0000FFFF];
  115. for(UINT32 i = 0; i < (UINT32)btnData.size(); i++)
  116. {
  117. if((((UINT32)btnData[i].desc.modifiers) & modifiers) == ((UINT32)btnData[i].desc.modifiers))
  118. {
  119. btn = btnData[i].button;
  120. btnDesc = btnData[i].desc;
  121. return true;
  122. }
  123. }
  124. return false;
  125. }
  126. bool InputConfiguration::_getAxis(const VirtualAxis& axis, VIRTUAL_AXIS_DESC& axisDesc) const
  127. {
  128. if (axis.axisIdentifier >= (UINT32)mAxes.size())
  129. return false;
  130. axisDesc = mAxes[axis.axisIdentifier].desc;
  131. return true;
  132. }
  133. }