// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include "common/types.h" #include "input/controller.h" #include "input_mouse.h" #include "SDL3/SDL.h" namespace Input { int mouse_joystick_binding = 0; float mouse_deadzone_offset = 0.5, mouse_speed = 1, mouse_speed_offset = 0.1250; Uint32 mouse_polling_id = 0; bool mouse_enabled = false; // We had to go through 3 files of indirection just to update a flag void ToggleMouseEnabled() { mouse_enabled = !mouse_enabled; } void SetMouseToJoystick(int joystick) { mouse_joystick_binding = joystick; } void SetMouseParams(float mdo, float ms, float mso) { mouse_deadzone_offset = mdo; mouse_speed = ms; mouse_speed_offset = mso; } Uint32 MousePolling(void* param, Uint32 id, Uint32 interval) { auto* controller = (GameController*)param; if (!mouse_enabled) return interval; Axis axis_x, axis_y; switch (mouse_joystick_binding) { case 1: axis_x = Axis::LeftX; axis_y = Axis::LeftY; break; case 2: axis_x = Axis::RightX; axis_y = Axis::RightY; break; default: return interval; // no update needed } float d_x = 0, d_y = 0; SDL_GetRelativeMouseState(&d_x, &d_y); float output_speed = SDL_clamp((sqrt(d_x * d_x + d_y * d_y) + mouse_speed_offset * 128) * mouse_speed, mouse_deadzone_offset * 128, 128.0); float angle = atan2(d_y, d_x); float a_x = cos(angle) * output_speed, a_y = sin(angle) * output_speed; if (d_x != 0 && d_y != 0) { controller->Axis(0, axis_x, GetAxis(-0x80, 0x7f, a_x)); controller->Axis(0, axis_y, GetAxis(-0x80, 0x7f, a_y)); } else { controller->Axis(0, axis_x, GetAxis(-0x80, 0x7f, 0)); controller->Axis(0, axis_y, GetAxis(-0x80, 0x7f, 0)); } return interval; } } // namespace Input