Allow all touch inputs at the same time and remove config options that are not longer necesary

This commit is contained in:
german 2021-01-01 10:40:02 -06:00
parent d583e01f54
commit 390ee10eef
8 changed files with 36 additions and 99 deletions

View file

@ -40,11 +40,12 @@ void Controller_Touchscreen::OnUpdate(const Core::Timing::CoreTiming& core_timin
cur_entry.sampling_number = last_entry.sampling_number + 1;
cur_entry.sampling_number2 = cur_entry.sampling_number;
updateTouchInputEvent(touch_device->GetStatus(), mouse_finger_id);
updateTouchInputEvent(touch_btn_device->GetStatus(), keyboar_finger_id);
updateTouchInputEvent(touch_mouse_device->GetStatus(), mouse_finger_id);
updateTouchInputEvent(touch_btn_device->GetStatus(), keyboard_finger_id);
updateTouchInputEvent(touch_udp_device->GetStatus(), udp_finger_id);
std::array<Finger, 16> sorted_fingers;
s32_le active_fingers = 0;
size_t active_fingers = 0;
for (Finger finger : fingers) {
if (finger.pressed) {
sorted_fingers[active_fingers++] = finger;
@ -52,7 +53,7 @@ void Controller_Touchscreen::OnUpdate(const Core::Timing::CoreTiming& core_timin
}
const u64 tick = core_timing.GetCPUTicks();
cur_entry.entry_count = active_fingers;
cur_entry.entry_count = static_cast<s32_le>(active_fingers);
for (size_t id = 0; id < MAX_FINGERS; id++) {
auto& touch_entry = cur_entry.states[id];
if (id < active_fingers) {
@ -81,7 +82,8 @@ void Controller_Touchscreen::OnUpdate(const Core::Timing::CoreTiming& core_timin
}
void Controller_Touchscreen::OnLoadInputDevices() {
touch_device = Input::CreateDevice<Input::TouchDevice>(Settings::values.touchscreen.device);
touch_mouse_device = Input::CreateDevice<Input::TouchDevice>("engine:emu_window");
touch_udp_device = Input::CreateDevice<Input::TouchDevice>("engine:cemuhookudp");
if (Settings::values.use_touch_from_button) {
touch_btn_device = Input::CreateDevice<Input::TouchDevice>("engine:touch_from_button");
} else {
@ -90,7 +92,7 @@ void Controller_Touchscreen::OnLoadInputDevices() {
}
void Controller_Touchscreen::updateTouchInputEvent(
const std::tuple<float, float, bool>& touch_input, int& finger_id) {
const std::tuple<float, float, bool>& touch_input, size_t& finger_id) {
bool pressed = false;
float x, y;
std::tie(x, y, pressed) = touch_input;
@ -110,7 +112,7 @@ void Controller_Touchscreen::updateTouchInputEvent(
fingers[finger_id].x = x;
fingers[finger_id].y = y;
fingers[finger_id].pressed = true;
fingers[finger_id].id = finger_id;
fingers[finger_id].id = static_cast<u32_le>(finger_id);
fingers[finger_id].attribute.start_touch.Assign(1);
}
} else {

View file

@ -30,7 +30,12 @@ public:
void OnLoadInputDevices() override;
private:
void updateTouchInputEvent(const std::tuple<float, float, bool>& touch_input, int& finger_id);
// If the touch is new it tries to assing a new finger id, if there is no fingers avaliable no
// changes will be made. Updates the coordinates if the finger id it's already set. If the touch
// ends delays the output by one frame to set the end_touch flag before finally freeing the
// finger id
void updateTouchInputEvent(const std::tuple<float, float, bool>& touch_input,
size_t& finger_id);
static const size_t MAX_FINGERS = 16;
struct Attributes {
@ -80,10 +85,12 @@ private:
};
TouchScreenSharedMemory shared_memory{};
std::unique_ptr<Input::TouchDevice> touch_device;
std::unique_ptr<Input::TouchDevice> touch_mouse_device;
std::unique_ptr<Input::TouchDevice> touch_udp_device;
std::unique_ptr<Input::TouchDevice> touch_btn_device;
int mouse_finger_id{-1};
int keyboar_finger_id{-1};
size_t mouse_finger_id{-1};
size_t keyboard_finger_id{-1};
size_t udp_finger_id{-1};
std::array<Finger, MAX_FINGERS> fingers;
};
} // namespace Service::HID