mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-13 13:15:59 +00:00
74 lines
1.9 KiB
C++
74 lines
1.9 KiB
C++
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#include <cmath>
|
|
|
|
#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
|