diff --git a/CMakeLists.txt b/CMakeLists.txt index 5776571b..ad2900d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -163,8 +163,10 @@ add_executable(CSE2 WIN32 "src/ValueView.cpp" "src/ValueView.h" "src/WindowsWrapper.h" + "src/Backends/Controller/SDL2.cpp" "src/Backends/Platform/SDL2.cpp" "src/Backends/Audio.h" + "src/Backends/Controller.h" "src/Backends/Platform.h" "src/Backends/Rendering.h" ) diff --git a/src/Backends/Controller.h b/src/Backends/Controller.h new file mode 100644 index 00000000..1e9f60e2 --- /dev/null +++ b/src/Backends/Controller.h @@ -0,0 +1,10 @@ +#pragma once + +#include "../WindowsWrapper.h" + +#include "../Input.h" + +void ControllerBackend_Deinit(void); +BOOL ControllerBackend_Init(void); +BOOL ControllerBackend_GetJoystickStatus(JOYSTICK_STATUS *status); +BOOL ControllerBackend_ResetJoystickStatus(void); diff --git a/src/Backends/Controller/SDL2.cpp b/src/Backends/Controller/SDL2.cpp new file mode 100644 index 00000000..05b30c2d --- /dev/null +++ b/src/Backends/Controller/SDL2.cpp @@ -0,0 +1,116 @@ +#include "../Controller.h" + +#include +#include +#include + +#include "SDL.h" + +#include "../../WindowsWrapper.h" + +// The original names for these variables are unknown +static SDL_Joystick *joystick = NULL; +static int joystick_neutral_x = 0; +static int joystick_neutral_y = 0; + +void ControllerBackend_Deinit(void) +{ + // Close opened joystick (if exists) + if (joystick != NULL) + { + SDL_JoystickClose(joystick); + joystick = NULL; + } + + SDL_QuitSubSystem(SDL_INIT_JOYSTICK); +} + +// It looks like Pixel declared his functions early, so he could forward-reference +BOOL FindAndOpenDirectInputDevice(void); + +BOOL ControllerBackend_Init(void) +{ + SDL_InitSubSystem(SDL_INIT_JOYSTICK); + + if (!FindAndOpenDirectInputDevice()) + return FALSE; + + return TRUE; +} + +// The original name for this function and its variables are unknown. +// This function finds and hooks the first available DirectInput device (or SDL Joystick, in this case). +BOOL FindAndOpenDirectInputDevice(void) +{ + int i; + + for (i = 0; i < SDL_NumJoysticks(); ++i) + printf("Joystick #%d name: %s\n", i, SDL_JoystickNameForIndex(i)); + + // Open first available joystick + for (i = 0; i < SDL_NumJoysticks(); ++i) + { + joystick = SDL_JoystickOpen(i); + + // Break as soon as a joystick is properly opened + if (joystick != NULL) + return TRUE; + } + + return FALSE; +} + +BOOL ControllerBackend_GetJoystickStatus(JOYSTICK_STATUS *status) +{ + if (joystick == NULL) + return FALSE; + + // The original Input.cpp assumed there were 32 buttons (because of DirectInput's 'DIJOYSTATE' struct) + int numButtons = SDL_JoystickNumButtons(joystick); + if (numButtons > 32) + numButtons = 32; + + // Read whatever buttons actually exist + int i = 0; + for (; i < numButtons; ++i) + { + if (SDL_JoystickGetButton(joystick, i) != 0) + status->bButton[i] = TRUE; + else + status->bButton[i] = FALSE; + } + + // Blank the buttons that do not + for (; i < 32; ++i) + status->bButton[i] = FALSE; + + status->bDown = FALSE; + status->bRight = FALSE; + status->bUp = FALSE; + status->bLeft = FALSE; + + const Sint16 joystick_x = SDL_JoystickGetAxis(joystick, 0); + if (joystick_x < joystick_neutral_x - 10000) + status->bLeft = TRUE; + else if (joystick_x > joystick_neutral_x + 10000) + status->bRight = TRUE; + + const Sint16 joystick_y = SDL_JoystickGetAxis(joystick, 1); + if (joystick_y < joystick_neutral_y - 10000) + status->bUp = TRUE; + else if (joystick_y > joystick_neutral_y + 10000) + status->bDown = TRUE; + + return TRUE; +} + +BOOL ControllerBackend_ResetJoystickStatus(void) +{ + if (joystick == NULL) + return FALSE; + + joystick_neutral_x = SDL_JoystickGetAxis(joystick, 0); + joystick_neutral_y = SDL_JoystickGetAxis(joystick, 1); + + return TRUE; +} diff --git a/src/Input.cpp b/src/Input.cpp index 22a6bcc8..e6135bcd 100644 --- a/src/Input.cpp +++ b/src/Input.cpp @@ -1,116 +1,25 @@ #include "Input.h" -#include -#include -#include - -#include "SDL.h" +#include "Backends/Controller.h" #include "WindowsWrapper.h" -// The original names for these variables are unknown -static SDL_Joystick *joystick = NULL; -static int joystick_neutral_x = 0; -static int joystick_neutral_y = 0; - void ReleaseDirectInput(void) { - // Close opened joystick (if exists) - if (joystick != NULL) - { - SDL_JoystickClose(joystick); - joystick = NULL; - } - - SDL_QuitSubSystem(SDL_INIT_JOYSTICK); + ControllerBackend_Deinit(); } -// It looks like Pixel declared his functions early, so he could forward-reference -BOOL FindAndOpenDirectInputDevice(void); - BOOL InitDirectInput(void) { - SDL_InitSubSystem(SDL_INIT_JOYSTICK); - - if (!FindAndOpenDirectInputDevice()) - return FALSE; - - return TRUE; -} - -// The original name for this function and its variables are unknown. -// This function finds and hooks the first available DirectInput device (or SDL Joystick, in this case). -BOOL FindAndOpenDirectInputDevice(void) -{ - int i; - - for (i = 0; i < SDL_NumJoysticks(); ++i) - printf("Joystick #%d name: %s\n", i, SDL_JoystickNameForIndex(i)); - - // Open first available joystick - for (i = 0; i < SDL_NumJoysticks(); ++i) - { - joystick = SDL_JoystickOpen(i); - - // Break as soon as a joystick is properly opened - if (joystick != NULL) - return TRUE; - } - - return FALSE; + return ControllerBackend_Init(); } BOOL GetJoystickStatus(JOYSTICK_STATUS *status) { - if (joystick == NULL) - return FALSE; - - // The original Input.cpp assumed there were 32 buttons (because of DirectInput's 'DIJOYSTATE' struct) - int numButtons = SDL_JoystickNumButtons(joystick); - if (numButtons > 32) - numButtons = 32; - - // Read whatever buttons actually exist - int i = 0; - for (; i < numButtons; ++i) - { - if (SDL_JoystickGetButton(joystick, i) != 0) - status->bButton[i] = TRUE; - else - status->bButton[i] = FALSE; - } - - // Blank the buttons that do not - for (; i < 32; ++i) - status->bButton[i] = FALSE; - - status->bDown = FALSE; - status->bRight = FALSE; - status->bUp = FALSE; - status->bLeft = FALSE; - - const Sint16 joystick_x = SDL_JoystickGetAxis(joystick, 0); - if (joystick_x < joystick_neutral_x - 10000) - status->bLeft = TRUE; - else if (joystick_x > joystick_neutral_x + 10000) - status->bRight = TRUE; - - const Sint16 joystick_y = SDL_JoystickGetAxis(joystick, 1); - if (joystick_y < joystick_neutral_y - 10000) - status->bUp = TRUE; - else if (joystick_y > joystick_neutral_y + 10000) - status->bDown = TRUE; - - return TRUE; + return ControllerBackend_GetJoystickStatus(status); } BOOL ResetJoystickStatus(void) { - if (joystick == NULL) - return FALSE; - - joystick_neutral_x = SDL_JoystickGetAxis(joystick, 0); - joystick_neutral_y = SDL_JoystickGetAxis(joystick, 1); - - return TRUE; + return ControllerBackend_ResetJoystickStatus(); }