mirror of
https://github.com/quelsolaar/MergeSource
synced 2025-02-01 09:58:42 -05:00
182 lines
7.1 KiB
C
182 lines
7.1 KiB
C
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <math.h>
|
|
#include "betray_plugin_api.h"
|
|
|
|
|
|
#define XINPUT_GAMEPAD_DPAD_UP 0x0001
|
|
#define XINPUT_GAMEPAD_DPAD_DOWN 0x0002
|
|
#define XINPUT_GAMEPAD_DPAD_LEFT 0x0004
|
|
#define XINPUT_GAMEPAD_DPAD_RIGHT 0x0008
|
|
#define XINPUT_GAMEPAD_START 0x0010
|
|
#define XINPUT_GAMEPAD_BACK 0x0020
|
|
#define XINPUT_GAMEPAD_LEFT_THUMB 0x0040
|
|
#define XINPUT_GAMEPAD_RIGHT_THUMB 0x0080
|
|
#define XINPUT_GAMEPAD_LEFT_SHOULDER 0x0100
|
|
#define XINPUT_GAMEPAD_RIGHT_SHOULDER 0x0200
|
|
#define XINPUT_GAMEPAD_A 0x1000
|
|
#define XINPUT_GAMEPAD_B 0x2000
|
|
#define XINPUT_GAMEPAD_X 0x4000
|
|
#define XINPUT_GAMEPAD_Y 0x8000
|
|
|
|
typedef struct{
|
|
WORD wButtons;
|
|
BYTE bLeftTrigger;
|
|
BYTE bRightTrigger;
|
|
SHORT sThumbLX;
|
|
SHORT sThumbLY;
|
|
SHORT xThumbRX;
|
|
SHORT xThumbRY;
|
|
}XINPUT_GAMEPAD;
|
|
|
|
typedef struct{
|
|
DWORD dwPacketNumber;
|
|
XINPUT_GAMEPAD Gamepad;
|
|
}XINPUT_STATE;
|
|
|
|
DWORD (__stdcall *XInputGetState)(DWORD dwUserIndex, XINPUT_STATE *pState) = NULL;
|
|
|
|
uint controller_code_id[4][20];
|
|
uint controller_setting_id;
|
|
uint controller_user_ids[4];
|
|
uint controller_device_ids[4];
|
|
boolean controller_state[4][20];
|
|
|
|
void controller_plugin_callback_main(BInputState *input)
|
|
{
|
|
char *players[4] = {"Player One", "Player Two", "Player Three", "Player Four"};
|
|
boolean last_state[20];
|
|
XINPUT_STATE pState;
|
|
float deadspace, vec[4];
|
|
uint i, j;
|
|
deadspace = betray_settings_slider_get(controller_setting_id);
|
|
deadspace *= deadspace;
|
|
for(j = 0; j < 4; j++)
|
|
{
|
|
if(ERROR_SUCCESS == XInputGetState(j, &pState))
|
|
{
|
|
if(controller_device_ids[j] == -1)
|
|
controller_device_ids[j] = betray_plugin_input_device_allocate(controller_user_ids[j], players[j]);
|
|
if(controller_code_id[j][0] == -1)
|
|
{
|
|
controller_code_id[j][0] = betray_plugin_axis_allocate(controller_user_ids[j], controller_device_ids[j], "Left Stick", B_AXIS_STICK, 2);
|
|
controller_code_id[j][1] = betray_plugin_axis_allocate(controller_user_ids[j], controller_device_ids[j], "Right Stick", B_AXIS_STICK, 2);
|
|
controller_code_id[j][2] = betray_plugin_axis_allocate(controller_user_ids[j], controller_device_ids[j], "Left Bumper", B_AXIS_BUMPER_LEFT, 1);
|
|
controller_code_id[j][3] = betray_plugin_axis_allocate(controller_user_ids[j], controller_device_ids[j], "Right Bunper", B_AXIS_BUMPER_RIGHT, 1);
|
|
|
|
controller_code_id[j][4] = betray_plugin_button_allocate(BETRAY_BUTTON_PLAY_PAUSE, "");
|
|
controller_code_id[j][5] = betray_plugin_button_allocate(BETRAY_BUTTON_SHOLDER_LEFT_A, "");
|
|
controller_code_id[j][6] = betray_plugin_button_allocate(BETRAY_BUTTON_SHOLDER_LEFT_B, "");
|
|
controller_code_id[j][7] = betray_plugin_button_allocate(BETRAY_BUTTON_SHOLDER_RIGHT_A, "");
|
|
controller_code_id[j][8] = betray_plugin_button_allocate(BETRAY_BUTTON_SHOLDER_RIGHT_B, "");
|
|
|
|
controller_code_id[j][9] = betray_plugin_button_allocate(BETRAY_BUTTON_FACE_A, "");
|
|
controller_code_id[j][10] = betray_plugin_button_allocate(BETRAY_BUTTON_FACE_B, "");
|
|
controller_code_id[j][11] = betray_plugin_button_allocate(BETRAY_BUTTON_FACE_X, "");
|
|
controller_code_id[j][12] = betray_plugin_button_allocate(BETRAY_BUTTON_FACE_Y, "");
|
|
|
|
controller_code_id[j][13] = betray_plugin_button_allocate(BETRAY_BUTTON_LEFT, "");
|
|
controller_code_id[j][14] = betray_plugin_button_allocate(BETRAY_BUTTON_UP, "");
|
|
controller_code_id[j][15] = betray_plugin_button_allocate(BETRAY_BUTTON_RIGHT, "");
|
|
controller_code_id[j][16] = betray_plugin_button_allocate(BETRAY_BUTTON_DOWN, "");
|
|
|
|
controller_code_id[j][17] = betray_plugin_button_allocate(BETRAY_ENUM_BUTTON_BACK, "");
|
|
controller_code_id[j][18] = betray_plugin_button_allocate(-1, "Left Stick Click");
|
|
controller_code_id[j][19] = betray_plugin_button_allocate(-1, "Right Stick Click");
|
|
}
|
|
|
|
vec[0] = (float)pState.Gamepad.sThumbLX / 32768.0;
|
|
vec[1] = (float)pState.Gamepad.sThumbLY / 32768.0;
|
|
vec[2] = (float)pState.Gamepad.xThumbRX / 32768.0;
|
|
vec[3] = (float)pState.Gamepad.xThumbRY / 32768.0;
|
|
for(i = 0; i < 4; i++)
|
|
{
|
|
if(vec[i] > 0.0)
|
|
{
|
|
vec[i] = vec[i] - deadspace;
|
|
if(vec[i] < 0.0)
|
|
vec[i] = 0.0;
|
|
}else
|
|
{
|
|
vec[i] = vec[i] + deadspace;
|
|
if(vec[i] > 0.0)
|
|
vec[i] = 0.0;
|
|
}
|
|
vec[i] /= (1.0 - deadspace);
|
|
}
|
|
betray_plugin_axis_set(controller_code_id[j][0], vec[0], vec[1], 0);
|
|
betray_plugin_axis_set(controller_code_id[j][1], vec[2], vec[3], 0);
|
|
betray_plugin_axis_set(controller_code_id[j][2], (float)((uint)pState.Gamepad.bLeftTrigger) / 255.0, 0, 0);
|
|
betray_plugin_axis_set(controller_code_id[j][3], (float)((uint)pState.Gamepad.bRightTrigger) / 255.0, 0, 0);
|
|
|
|
for(i = 0; i < 20; i++)
|
|
last_state[i] = controller_state[j][i];
|
|
|
|
controller_state[j][4] = (pState.Gamepad.wButtons & XINPUT_GAMEPAD_START) != 0;
|
|
controller_state[j][5] = (pState.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER) != 0;
|
|
controller_state[j][6] = (uint)pState.Gamepad.bLeftTrigger > 5;
|
|
controller_state[j][7] = (pState.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER) != 0;
|
|
controller_state[j][8] = (uint)pState.Gamepad.bRightTrigger > 5;
|
|
controller_state[j][9] = (pState.Gamepad.wButtons & XINPUT_GAMEPAD_A) != 0;
|
|
controller_state[j][10] = (pState.Gamepad.wButtons & XINPUT_GAMEPAD_B) != 0;
|
|
controller_state[j][11] = (pState.Gamepad.wButtons & XINPUT_GAMEPAD_X) != 0;
|
|
controller_state[j][12] = (pState.Gamepad.wButtons & XINPUT_GAMEPAD_Y) != 0;
|
|
controller_state[j][13] = (pState.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT) != 0;
|
|
controller_state[j][14] = (pState.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP) != 0;
|
|
controller_state[j][15] = (pState.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT) != 0;
|
|
controller_state[j][16] = (pState.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN) != 0;
|
|
controller_state[j][17] = (pState.Gamepad.wButtons & XINPUT_GAMEPAD_BACK) != 0;
|
|
controller_state[j][18] = (pState.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) != 0;
|
|
controller_state[j][19] = (pState.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) != 0;
|
|
|
|
for(i = 4; i < 20; i++)
|
|
{
|
|
if(controller_state[j][i] != last_state[i])
|
|
{
|
|
betray_plugin_button_set(controller_user_ids[j], controller_code_id[j][i], controller_state[j][i], -1);
|
|
}
|
|
}
|
|
}else if(controller_device_ids[j] != -1)
|
|
{
|
|
betray_plugin_input_device_free(controller_device_ids[j]);
|
|
controller_device_ids[j] = -1;
|
|
}
|
|
}
|
|
}
|
|
|
|
void betray_plugin_init(void)
|
|
{
|
|
void *xinput_dll = NULL;
|
|
uint i, j, *a = NULL;
|
|
#ifdef UNICODE
|
|
short u_text[32];
|
|
char *text = "XInput9_1_0.dll";
|
|
for (i = 0; i < 32 && text[i] != 0; i++)
|
|
u_text[i] = (char)text[i];
|
|
u_text[i] = 0;
|
|
|
|
xinput_dll = LoadLibrary(u_text);
|
|
#else
|
|
xinput_dll = LoadLibrary("XInput9_1_0.dll");
|
|
#endif
|
|
if(xinput_dll == NULL)
|
|
return;
|
|
XInputGetState = (DWORD (__stdcall *)(DWORD , XINPUT_STATE *))GetProcAddress(xinput_dll, "XInputGetState");
|
|
if(XInputGetState == NULL)
|
|
return;
|
|
betray_plugin_callback_set_main(controller_plugin_callback_main);
|
|
|
|
for(i = 0; i < 4; i++)
|
|
{
|
|
controller_code_id[i][0] = -1;
|
|
controller_user_ids[i] = betray_plugin_user_allocate();
|
|
controller_device_ids[i] = -1;
|
|
for(j = 0; j < 20; j++)
|
|
controller_state[i][j] = FALSE;
|
|
}
|
|
|
|
controller_setting_id = betray_settings_create(BETRAY_ST_SLIDER, "Controller deadspace", 0, NULL);
|
|
betray_settings_slider_set(controller_setting_id, 0.4);
|
|
|
|
} |