input_common: touch: Rewrite touch driver to support multiple touch points
This commit is contained in:
		| @@ -27,12 +27,19 @@ void EmulatedConsole::SetTouchParams() { | ||||
|         // We can't use mouse as touch if native mouse is enabled | ||||
|         touch_params[index++] = Common::ParamPackage{"engine:mouse,axis_x:10,axis_y:11,button:0"}; | ||||
|     } | ||||
|     touch_params[index++] = Common::ParamPackage{"engine:touch,axis_x:0,axis_y:1,button:0"}; | ||||
|     touch_params[index++] = Common::ParamPackage{"engine:touch,axis_x:2,axis_y:3,button:1"}; | ||||
|  | ||||
|     touch_params[index++] = | ||||
|         Common::ParamPackage{"engine:cemuhookudp,axis_x:17,axis_y:18,button:65536"}; | ||||
|         Common::ParamPackage{"engine:touch,axis_x:0,axis_y:1,button:0,touch_id:0"}; | ||||
|     touch_params[index++] = | ||||
|         Common::ParamPackage{"engine:cemuhookudp,axis_x:19,axis_y:20,button:131072"}; | ||||
|         Common::ParamPackage{"engine:touch,axis_x:2,axis_y:3,button:1,touch_id:1"}; | ||||
|     touch_params[index++] = | ||||
|         Common::ParamPackage{"engine:touch,axis_x:4,axis_y:5,button:2,touch_id:2"}; | ||||
|     touch_params[index++] = | ||||
|         Common::ParamPackage{"engine:touch,axis_x:6,axis_y:7,button:3,touch_id:3"}; | ||||
|     touch_params[index++] = | ||||
|         Common::ParamPackage{"engine:cemuhookudp,axis_x:17,axis_y:18,button:65536,touch_id:0"}; | ||||
|     touch_params[index++] = | ||||
|         Common::ParamPackage{"engine:cemuhookudp,axis_x:19,axis_y:20,button:131072,touch_id:1"}; | ||||
|  | ||||
|     const auto button_index = | ||||
|         static_cast<u64>(Settings::values.touch_from_button_map_index.GetValue()); | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-2.0-or-later | ||||
|  | ||||
| #include <algorithm> | ||||
| #include <random> | ||||
|  | ||||
| #include "common/input.h" | ||||
| @@ -196,6 +197,9 @@ Common::Input::TouchStatus TransformToTouch(const Common::Input::CallbackStatus& | ||||
|     x = std::clamp(x, 0.0f, 1.0f); | ||||
|     y = std::clamp(y, 0.0f, 1.0f); | ||||
|  | ||||
|     // Limit id to maximum number of fingers | ||||
|     status.id = std::clamp(status.id, 0, 16); | ||||
|  | ||||
|     if (status.pressed.inverted) { | ||||
|         status.pressed.value = !status.pressed.value; | ||||
|     } | ||||
|   | ||||
| @@ -44,7 +44,6 @@ void Controller_Touchscreen::OnUpdate(const Core::Timing::CoreTiming& core_timin | ||||
|     for (std::size_t id = 0; id < MAX_FINGERS; id++) { | ||||
|         const auto& current_touch = touch_status[id]; | ||||
|         auto& finger = fingers[id]; | ||||
|         finger.position = current_touch.position; | ||||
|         finger.id = current_touch.id; | ||||
|  | ||||
|         if (finger.attribute.start_touch) { | ||||
| @@ -61,13 +60,18 @@ void Controller_Touchscreen::OnUpdate(const Core::Timing::CoreTiming& core_timin | ||||
|         if (!finger.pressed && current_touch.pressed) { | ||||
|             finger.attribute.start_touch.Assign(1); | ||||
|             finger.pressed = true; | ||||
|             finger.position = current_touch.position; | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         if (finger.pressed && !current_touch.pressed) { | ||||
|             finger.attribute.raw = 0; | ||||
|             finger.attribute.end_touch.Assign(1); | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         // Only update position if touch is not on a special frame | ||||
|         finger.position = current_touch.position; | ||||
|     } | ||||
|  | ||||
|     std::array<Core::HID::TouchFinger, MAX_FINGERS> active_fingers; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user