|
|
@@ -14,38 +14,93 @@ constexpr PadIdentifier identifier = {
|
|
|
|
|
|
TouchScreen::TouchScreen(std::string input_engine_) : InputEngine(std::move(input_engine_)) {
|
|
|
PreSetController(identifier);
|
|
|
+ ReleaseAllTouch();
|
|
|
}
|
|
|
|
|
|
-void TouchScreen::TouchMoved(float x, float y, std::size_t finger) {
|
|
|
- if (finger >= 16) {
|
|
|
+void TouchScreen::TouchMoved(float x, float y, std::size_t finger_id) {
|
|
|
+ const auto index = GetIndexFromFingerId(finger_id);
|
|
|
+ if (!index) {
|
|
|
+ // Touch doesn't exist handle it as a new one
|
|
|
+ TouchPressed(x, y, finger_id);
|
|
|
return;
|
|
|
}
|
|
|
- TouchPressed(x, y, finger);
|
|
|
+ const auto i = index.value();
|
|
|
+ fingers[i].is_active = true;
|
|
|
+ SetButton(identifier, static_cast<int>(i), true);
|
|
|
+ SetAxis(identifier, static_cast<int>(i * 2), x);
|
|
|
+ SetAxis(identifier, static_cast<int>(i * 2 + 1), y);
|
|
|
}
|
|
|
|
|
|
-void TouchScreen::TouchPressed(float x, float y, std::size_t finger) {
|
|
|
- if (finger >= 16) {
|
|
|
+void TouchScreen::TouchPressed(float x, float y, std::size_t finger_id) {
|
|
|
+ if (GetIndexFromFingerId(finger_id)) {
|
|
|
+ // Touch already exist. Just update the data
|
|
|
+ TouchMoved(x, y, finger_id);
|
|
|
return;
|
|
|
}
|
|
|
- SetButton(identifier, static_cast<int>(finger), true);
|
|
|
- SetAxis(identifier, static_cast<int>(finger * 2), x);
|
|
|
- SetAxis(identifier, static_cast<int>(finger * 2 + 1), y);
|
|
|
+ const auto index = GetNextFreeIndex();
|
|
|
+ if (!index) {
|
|
|
+ // No free entries. Ignore input
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const auto i = index.value();
|
|
|
+ fingers[i].is_enabled = true;
|
|
|
+ fingers[i].finger_id = finger_id;
|
|
|
+ TouchMoved(x, y, finger_id);
|
|
|
}
|
|
|
|
|
|
-void TouchScreen::TouchReleased(std::size_t finger) {
|
|
|
- if (finger >= 16) {
|
|
|
+void TouchScreen::TouchReleased(std::size_t finger_id) {
|
|
|
+ const auto index = GetIndexFromFingerId(finger_id);
|
|
|
+ if (!index) {
|
|
|
return;
|
|
|
}
|
|
|
- SetButton(identifier, static_cast<int>(finger), false);
|
|
|
- SetAxis(identifier, static_cast<int>(finger * 2), 0.0f);
|
|
|
- SetAxis(identifier, static_cast<int>(finger * 2 + 1), 0.0f);
|
|
|
+ const auto i = index.value();
|
|
|
+ fingers[i].is_enabled = false;
|
|
|
+ SetButton(identifier, static_cast<int>(i), false);
|
|
|
+ SetAxis(identifier, static_cast<int>(i * 2), 0.0f);
|
|
|
+ SetAxis(identifier, static_cast<int>(i * 2 + 1), 0.0f);
|
|
|
+}
|
|
|
+
|
|
|
+std::optional<std::size_t> TouchScreen::GetIndexFromFingerId(std::size_t finger_id) const {
|
|
|
+ for (std::size_t index = 0; index < MAX_FINGER_COUNT; ++index) {
|
|
|
+ const auto& finger = fingers[index];
|
|
|
+ if (!finger.is_enabled) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (finger.finger_id == finger_id) {
|
|
|
+ return index;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return std::nullopt;
|
|
|
+}
|
|
|
+
|
|
|
+std::optional<std::size_t> TouchScreen::GetNextFreeIndex() const {
|
|
|
+ for (std::size_t index = 0; index < MAX_FINGER_COUNT; ++index) {
|
|
|
+ if (!fingers[index].is_enabled) {
|
|
|
+ return index;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return std::nullopt;
|
|
|
+}
|
|
|
+
|
|
|
+void TouchScreen::ClearActiveFlag() {
|
|
|
+ for (auto& finger : fingers) {
|
|
|
+ finger.is_active = false;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void TouchScreen::ReleaseInactiveTouch() {
|
|
|
+ for (const auto& finger : fingers) {
|
|
|
+ if (!finger.is_active) {
|
|
|
+ TouchReleased(finger.finger_id);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void TouchScreen::ReleaseAllTouch() {
|
|
|
- for (int index = 0; index < 16; ++index) {
|
|
|
- SetButton(identifier, index, false);
|
|
|
- SetAxis(identifier, index * 2, 0.0f);
|
|
|
- SetAxis(identifier, index * 2 + 1, 0.0f);
|
|
|
+ for (const auto& finger : fingers) {
|
|
|
+ if (finger.is_enabled) {
|
|
|
+ TouchReleased(finger.finger_id);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|