mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-06-06 06:34:35 +00:00
Add dual touchpad support to testcontroller (#15540)
This commit is contained in:
parent
0defb4ddfc
commit
006959ca87
7 changed files with 244 additions and 108 deletions
|
|
@ -33,7 +33,7 @@
|
|||
#define PANEL_SPACING 25.0f
|
||||
#define PANEL_WIDTH 250.0f
|
||||
#define GAMEPAD_WIDTH 512.0f
|
||||
#define GAMEPAD_HEIGHT 560.0f
|
||||
#define GAMEPAD_HEIGHT 596.0f
|
||||
#define BUTTON_MARGIN 16.0f
|
||||
#define SCREEN_WIDTH (PANEL_WIDTH + PANEL_SPACING + GAMEPAD_WIDTH + PANEL_SPACING + PANEL_WIDTH)
|
||||
#define SCREEN_HEIGHT (TITLE_HEIGHT + GAMEPAD_HEIGHT)
|
||||
|
|
@ -378,9 +378,16 @@ static SDL_GamepadAxis virtual_axis_active = SDL_GAMEPAD_AXIS_INVALID;
|
|||
static float virtual_axis_start_x;
|
||||
static float virtual_axis_start_y;
|
||||
static SDL_GamepadButton virtual_button_active = SDL_GAMEPAD_BUTTON_INVALID;
|
||||
static bool virtual_touchpad_active = false;
|
||||
static float virtual_touchpad_x;
|
||||
static float virtual_touchpad_y;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
bool active;
|
||||
float x;
|
||||
float y;
|
||||
} VirtualTouchpad;
|
||||
|
||||
#define MAX_VIRTUAL_TOUCHPADS 2
|
||||
static VirtualTouchpad virtual_touchpad[MAX_VIRTUAL_TOUCHPADS];
|
||||
|
||||
static int s_arrBindingOrder[] = {
|
||||
/* Standard sequence */
|
||||
|
|
@ -1585,7 +1592,10 @@ static bool SDLCALL VirtualGamepadSetLED(void *userdata, Uint8 red, Uint8 green,
|
|||
|
||||
static void OpenVirtualGamepad(void)
|
||||
{
|
||||
SDL_VirtualJoystickTouchpadDesc virtual_touchpad = { 1, { 0, 0, 0 } };
|
||||
SDL_VirtualJoystickTouchpadDesc virtual_touchpad_desc[MAX_VIRTUAL_TOUCHPADS] = {
|
||||
{ 1, { 0, 0, 0 } },
|
||||
{ 1, { 0, 0, 0 } }
|
||||
};
|
||||
SDL_VirtualJoystickSensorDesc virtual_sensors[] = {
|
||||
{ SDL_SENSOR_ACCEL, 0.0f },
|
||||
{ SDL_SENSOR_GYRO, 0.0f }
|
||||
|
|
@ -1601,8 +1611,8 @@ static void OpenVirtualGamepad(void)
|
|||
desc.type = SDL_JOYSTICK_TYPE_GAMEPAD;
|
||||
desc.naxes = SDL_GAMEPAD_AXIS_COUNT;
|
||||
desc.nbuttons = SDL_GAMEPAD_BUTTON_COUNT;
|
||||
desc.ntouchpads = 1;
|
||||
desc.touchpads = &virtual_touchpad;
|
||||
desc.ntouchpads = MAX_VIRTUAL_TOUCHPADS;
|
||||
desc.touchpads = virtual_touchpad_desc;
|
||||
desc.nsensors = SDL_arraysize(virtual_sensors);
|
||||
desc.sensors = virtual_sensors;
|
||||
desc.SetPlayerIndex = VirtualGamepadSetPlayerIndex;
|
||||
|
|
@ -1681,12 +1691,14 @@ static void VirtualGamepadMouseMotion(float x, float y)
|
|||
}
|
||||
}
|
||||
|
||||
if (virtual_touchpad_active) {
|
||||
SDL_FRect touchpad;
|
||||
GetGamepadTouchpadArea(image, &touchpad);
|
||||
virtual_touchpad_x = (x - touchpad.x) / touchpad.w;
|
||||
virtual_touchpad_y = (y - touchpad.y) / touchpad.h;
|
||||
SDL_SetJoystickVirtualTouchpad(virtual_joystick, 0, 0, true, virtual_touchpad_x, virtual_touchpad_y, 1.0f);
|
||||
for (int i = 0; i < MAX_VIRTUAL_TOUCHPADS; ++i) {
|
||||
if (virtual_touchpad[i].active) {
|
||||
SDL_FRect touchpad;
|
||||
GetGamepadTouchpadArea(image, &touchpad, i);
|
||||
virtual_touchpad[i].x = (x - touchpad.x) / touchpad.w;
|
||||
virtual_touchpad[i].y = (y - touchpad.y) / touchpad.h;
|
||||
SDL_SetJoystickVirtualTouchpad(virtual_joystick, i, 0, true, virtual_touchpad[i].x, virtual_touchpad[i].y, 1.0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1695,16 +1707,18 @@ static void VirtualGamepadMouseDown(float x, float y)
|
|||
int element = GetGamepadImageElementAt(image, x, y);
|
||||
|
||||
if (element == SDL_GAMEPAD_ELEMENT_INVALID) {
|
||||
SDL_FPoint point;
|
||||
point.x = x;
|
||||
point.y = y;
|
||||
SDL_FRect touchpad;
|
||||
GetGamepadTouchpadArea(image, &touchpad);
|
||||
if (SDL_PointInRectFloat(&point, &touchpad)) {
|
||||
virtual_touchpad_active = true;
|
||||
virtual_touchpad_x = (x - touchpad.x) / touchpad.w;
|
||||
virtual_touchpad_y = (y - touchpad.y) / touchpad.h;
|
||||
SDL_SetJoystickVirtualTouchpad(virtual_joystick, 0, 0, true, virtual_touchpad_x, virtual_touchpad_y, 1.0f);
|
||||
for (int i = 0; i < MAX_VIRTUAL_TOUCHPADS; ++i) {
|
||||
SDL_FPoint point;
|
||||
point.x = x;
|
||||
point.y = y;
|
||||
SDL_FRect touchpad;
|
||||
GetGamepadTouchpadArea(image, &touchpad, i);
|
||||
if (SDL_PointInRectFloat(&point, &touchpad)) {
|
||||
virtual_touchpad[i].active = true;
|
||||
virtual_touchpad[i].x = (x - touchpad.x) / touchpad.w;
|
||||
virtual_touchpad[i].y = (y - touchpad.y) / touchpad.h;
|
||||
SDL_SetJoystickVirtualTouchpad(virtual_joystick, i, 0, true, virtual_touchpad[i].x, virtual_touchpad[i].y, 1.0f);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
@ -1756,9 +1770,11 @@ static void VirtualGamepadMouseUp(float x, float y)
|
|||
virtual_axis_active = SDL_GAMEPAD_AXIS_INVALID;
|
||||
}
|
||||
|
||||
if (virtual_touchpad_active) {
|
||||
SDL_SetJoystickVirtualTouchpad(virtual_joystick, 0, 0, false, virtual_touchpad_x, virtual_touchpad_y, 0.0f);
|
||||
virtual_touchpad_active = false;
|
||||
for (int i = 0; i < MAX_VIRTUAL_TOUCHPADS; ++i) {
|
||||
if (virtual_touchpad[i].active) {
|
||||
SDL_SetJoystickVirtualTouchpad(virtual_joystick, i, 0, false, virtual_touchpad[i].x, virtual_touchpad[i].y, 0.0f);
|
||||
virtual_touchpad[i].active = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue