diff --git a/src/modules/joystick/Joystick.cpp b/src/modules/joystick/Joystick.cpp index 7ee43ec0c..a67a16c3c 100644 --- a/src/modules/joystick/Joystick.cpp +++ b/src/modules/joystick/Joystick.cpp @@ -42,102 +42,71 @@ float Joystick::clampval(float x) return x; } -bool Joystick::getConstant(const char *in, Joystick::Hat &out) +STRINGMAP_CLASS_BEGIN(Joystick, Joystick::Hat, Joystick::HAT_MAX_ENUM, hat) { - return hats.find(in, out); + { "c", Joystick::HAT_CENTERED }, + { "u", Joystick::HAT_UP }, + { "r", Joystick::HAT_RIGHT }, + { "d", Joystick::HAT_DOWN }, + { "l", Joystick::HAT_LEFT }, + { "ru", Joystick::HAT_RIGHTUP }, + { "rd", Joystick::HAT_RIGHTDOWN }, + { "lu", Joystick::HAT_LEFTUP }, + { "ld", Joystick::HAT_LEFTDOWN }, } +STRINGMAP_CLASS_END(Joystick, Joystick::Hat, Joystick::HAT_MAX_ENUM, hat) -bool Joystick::getConstant(Joystick::Hat in, const char *&out) +STRINGMAP_CLASS_BEGIN(Joystick, Joystick::GamepadType, Joystick::GAMEPAD_TYPE_MAX_ENUM, gamepadType) { - return hats.find(in, out); + { "unknown", Joystick::GAMEPAD_TYPE_UNKNOWN }, + { "xbox360", Joystick::GAMEPAD_TYPE_XBOX360 }, + { "xboxone", Joystick::GAMEPAD_TYPE_XBOXONE }, + { "ps3", Joystick::GAMEPAD_TYPE_PS3 }, + { "ps4", Joystick::GAMEPAD_TYPE_PS4 }, + { "ps5", Joystick::GAMEPAD_TYPE_PS5 }, + { "switchpro", Joystick::GAMEPAD_TYPE_NINTENDO_SWITCH_PRO }, + { "virtual", Joystick::GAMEPAD_TYPE_VIRTUAL }, } +STRINGMAP_CLASS_END(Joystick, Joystick::GamepadType, Joystick::GAMEPAD_TYPE_MAX_ENUM, gamepadType) -bool Joystick::getConstant(const char *in, Joystick::GamepadAxis &out) +STRINGMAP_CLASS_BEGIN(Joystick, Joystick::GamepadAxis, Joystick::GAMEPAD_AXIS_MAX_ENUM, gpAxis) { - return gpAxes.find(in, out); + { "leftx", Joystick::GAMEPAD_AXIS_LEFTX }, + { "lefty", Joystick::GAMEPAD_AXIS_LEFTY }, + { "rightx", Joystick::GAMEPAD_AXIS_RIGHTX }, + { "righty", Joystick::GAMEPAD_AXIS_RIGHTY }, + { "triggerleft", Joystick::GAMEPAD_AXIS_TRIGGERLEFT }, + { "triggerright", Joystick::GAMEPAD_AXIS_TRIGGERRIGHT }, } +STRINGMAP_CLASS_END(Joystick, Joystick::GamepadAxis, Joystick::GAMEPAD_AXIS_MAX_ENUM, gpAxis) -bool Joystick::getConstant(Joystick::GamepadAxis in, const char *&out) +STRINGMAP_CLASS_BEGIN(Joystick, Joystick::GamepadButton, Joystick::GAMEPAD_BUTTON_MAX_ENUM, gpButton) { - return gpAxes.find(in, out); + { "a", Joystick::GAMEPAD_BUTTON_A }, + { "b", Joystick::GAMEPAD_BUTTON_B }, + { "x", Joystick::GAMEPAD_BUTTON_X }, + { "y", Joystick::GAMEPAD_BUTTON_Y }, + { "back", Joystick::GAMEPAD_BUTTON_BACK }, + { "guide", Joystick::GAMEPAD_BUTTON_GUIDE }, + { "start", Joystick::GAMEPAD_BUTTON_START }, + { "leftstick", Joystick::GAMEPAD_BUTTON_LEFTSTICK }, + { "rightstick", Joystick::GAMEPAD_BUTTON_RIGHTSTICK }, + { "leftshoulder", Joystick::GAMEPAD_BUTTON_LEFTSHOULDER }, + { "rightshoulder", Joystick::GAMEPAD_BUTTON_RIGHTSHOULDER }, + { "dpup", Joystick::GAMEPAD_BUTTON_DPAD_UP }, + { "dpdown", Joystick::GAMEPAD_BUTTON_DPAD_DOWN }, + { "dpleft", Joystick::GAMEPAD_BUTTON_DPAD_LEFT }, + { "dpright", Joystick::GAMEPAD_BUTTON_DPAD_RIGHT }, } +STRINGMAP_CLASS_END(Joystick, Joystick::GamepadButton, Joystick::GAMEPAD_BUTTON_MAX_ENUM, gpButton) -bool Joystick::getConstant(const char *in, Joystick::GamepadButton &out) +STRINGMAP_CLASS_BEGIN(Joystick, Joystick::InputType, Joystick::INPUT_TYPE_MAX_ENUM, inputType) { - return gpButtons.find(in, out); + { "axis", Joystick::INPUT_TYPE_AXIS }, + { "button", Joystick::INPUT_TYPE_BUTTON }, + { "hat", Joystick::INPUT_TYPE_HAT }, } - -bool Joystick::getConstant(Joystick::GamepadButton in, const char *&out) -{ - return gpButtons.find(in, out); -} - -bool Joystick::getConstant(const char *in, Joystick::InputType &out) -{ - return inputTypes.find(in, out); -} - -bool Joystick::getConstant(Joystick::InputType in, const char *&out) -{ - return inputTypes.find(in, out); -} - -StringMap::Entry Joystick::hatEntries[] = -{ - {"c", Joystick::HAT_CENTERED}, - {"u", Joystick::HAT_UP}, - {"r", Joystick::HAT_RIGHT}, - {"d", Joystick::HAT_DOWN}, - {"l", Joystick::HAT_LEFT}, - {"ru", Joystick::HAT_RIGHTUP}, - {"rd", Joystick::HAT_RIGHTDOWN}, - {"lu", Joystick::HAT_LEFTUP}, - {"ld", Joystick::HAT_LEFTDOWN}, -}; - -StringMap Joystick::hats(Joystick::hatEntries, sizeof(Joystick::hatEntries)); - -StringMap::Entry Joystick::gpAxisEntries[] = -{ - {"leftx", GAMEPAD_AXIS_LEFTX}, - {"lefty", GAMEPAD_AXIS_LEFTY}, - {"rightx", GAMEPAD_AXIS_RIGHTX}, - {"righty", GAMEPAD_AXIS_RIGHTY}, - {"triggerleft", GAMEPAD_AXIS_TRIGGERLEFT}, - {"triggerright", GAMEPAD_AXIS_TRIGGERRIGHT}, -}; - -StringMap Joystick::gpAxes(Joystick::gpAxisEntries, sizeof(Joystick::gpAxisEntries)); - -StringMap::Entry Joystick::gpButtonEntries[] = -{ - {"a", GAMEPAD_BUTTON_A}, - {"b", GAMEPAD_BUTTON_B}, - {"x", GAMEPAD_BUTTON_X}, - {"y", GAMEPAD_BUTTON_Y}, - {"back", GAMEPAD_BUTTON_BACK}, - {"guide", GAMEPAD_BUTTON_GUIDE}, - {"start", GAMEPAD_BUTTON_START}, - {"leftstick", GAMEPAD_BUTTON_LEFTSTICK}, - {"rightstick", GAMEPAD_BUTTON_RIGHTSTICK}, - {"leftshoulder", GAMEPAD_BUTTON_LEFTSHOULDER}, - {"rightshoulder", GAMEPAD_BUTTON_RIGHTSHOULDER}, - {"dpup", GAMEPAD_BUTTON_DPAD_UP}, - {"dpdown", GAMEPAD_BUTTON_DPAD_DOWN}, - {"dpleft", GAMEPAD_BUTTON_DPAD_LEFT}, - {"dpright", GAMEPAD_BUTTON_DPAD_RIGHT}, -}; - -StringMap Joystick::gpButtons(Joystick::gpButtonEntries, sizeof(Joystick::gpButtonEntries)); - -StringMap::Entry Joystick::inputTypeEntries[] = -{ - {"axis", Joystick::INPUT_TYPE_AXIS}, - {"button", Joystick::INPUT_TYPE_BUTTON}, - {"hat", Joystick::INPUT_TYPE_HAT}, -}; - -StringMap Joystick::inputTypes(Joystick::inputTypeEntries, sizeof(Joystick::inputTypeEntries)); +STRINGMAP_CLASS_END(Joystick, Joystick::InputType, Joystick::INPUT_TYPE_MAX_ENUM, inputType) } // joystick } // love diff --git a/src/modules/joystick/Joystick.h b/src/modules/joystick/Joystick.h index c16109246..456445bf5 100644 --- a/src/modules/joystick/Joystick.h +++ b/src/modules/joystick/Joystick.h @@ -56,6 +56,19 @@ public: HAT_MAX_ENUM = 16 }; + enum GamepadType + { + GAMEPAD_TYPE_UNKNOWN, + GAMEPAD_TYPE_XBOX360, + GAMEPAD_TYPE_XBOXONE, + GAMEPAD_TYPE_PS3, + GAMEPAD_TYPE_PS4, + GAMEPAD_TYPE_PS5, + GAMEPAD_TYPE_NINTENDO_SWITCH_PRO, + GAMEPAD_TYPE_VIRTUAL, + GAMEPAD_TYPE_MAX_ENUM + }; + // Valid Gamepad axes. enum GamepadAxis { @@ -149,6 +162,8 @@ public: virtual bool openGamepad(int deviceindex) = 0; virtual bool isGamepad() const = 0; + virtual GamepadType getGamepadType() const = 0; + virtual float getGamepadAxis(GamepadAxis axis) const = 0; virtual bool isGamepadDown(const std::vector &blist) const = 0; @@ -168,34 +183,14 @@ public: virtual bool setVibration() = 0; virtual void getVibration(float &left, float &right) = 0; - static bool getConstant(const char *in, Hat &out); - static bool getConstant(Hat in, const char *&out); - - static bool getConstant(const char *in, GamepadAxis &out); - static bool getConstant(GamepadAxis in, const char *&out); - - static bool getConstant(const char *in, GamepadButton &out); - static bool getConstant(GamepadButton in, const char *&out); - - static bool getConstant(const char *in, InputType &out); - static bool getConstant(InputType in, const char *&out); + STRINGMAP_CLASS_DECLARE(Hat); + STRINGMAP_CLASS_DECLARE(GamepadType); + STRINGMAP_CLASS_DECLARE(GamepadAxis); + STRINGMAP_CLASS_DECLARE(GamepadButton); + STRINGMAP_CLASS_DECLARE(InputType); static float clampval(float x); -private: - - static StringMap::Entry hatEntries[]; - static StringMap hats; - - static StringMap::Entry gpAxisEntries[]; - static StringMap gpAxes; - - static StringMap::Entry gpButtonEntries[]; - static StringMap gpButtons; - - static StringMap::Entry inputTypeEntries[]; - static StringMap inputTypes; - }; // Joystick } // joystick diff --git a/src/modules/joystick/sdl/Joystick.cpp b/src/modules/joystick/sdl/Joystick.cpp index 612cce5cf..d4476cd9b 100644 --- a/src/modules/joystick/sdl/Joystick.cpp +++ b/src/modules/joystick/sdl/Joystick.cpp @@ -215,6 +215,30 @@ bool Joystick::isGamepad() const return controller != nullptr; } +Joystick::GamepadType Joystick::getGamepadType() const +{ + if (controller == nullptr) + return GAMEPAD_TYPE_UNKNOWN; + +#if SDL_VERSION_ATLEAST(2, 0, 12) + switch (SDL_GameControllerGetType(controller)) + { + case SDL_CONTROLLER_TYPE_UNKNOWN: return GAMEPAD_TYPE_UNKNOWN; + case SDL_CONTROLLER_TYPE_XBOX360: return GAMEPAD_TYPE_XBOX360; + case SDL_CONTROLLER_TYPE_XBOXONE: return GAMEPAD_TYPE_XBOXONE; + case SDL_CONTROLLER_TYPE_PS3: return GAMEPAD_TYPE_PS3; + case SDL_CONTROLLER_TYPE_PS4: return GAMEPAD_TYPE_PS4; + case SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO: return GAMEPAD_TYPE_NINTENDO_SWITCH_PRO; +#if SDL_VERSION_ATLEAST(2, 0, 14) + case SDL_CONTROLLER_TYPE_VIRTUAL: return GAMEPAD_TYPE_VIRTUAL; + case SDL_CONTROLLER_TYPE_PS5: return GAMEPAD_TYPE_PS5; +#endif + } +#endif + + return GAMEPAD_TYPE_UNKNOWN; +} + float Joystick::getGamepadAxis(love::joystick::Joystick::GamepadAxis axis) const { if (!isConnected() || !isGamepad()) diff --git a/src/modules/joystick/sdl/Joystick.h b/src/modules/joystick/sdl/Joystick.h index 8b9fedca7..c559ea228 100644 --- a/src/modules/joystick/sdl/Joystick.h +++ b/src/modules/joystick/sdl/Joystick.h @@ -64,6 +64,8 @@ public: bool openGamepad(int deviceindex) override; bool isGamepad() const override; + GamepadType getGamepadType() const override; + float getGamepadAxis(GamepadAxis axis) const override; bool isGamepadDown(const std::vector &blist) const override; diff --git a/src/modules/joystick/wrap_Joystick.cpp b/src/modules/joystick/wrap_Joystick.cpp index 9608aee37..76b9f6db9 100644 --- a/src/modules/joystick/wrap_Joystick.cpp +++ b/src/modules/joystick/wrap_Joystick.cpp @@ -178,6 +178,15 @@ int w_Joystick_isGamepad(lua_State *L) return 1; } +int w_Joystick_getGamepadType(lua_State *L) +{ + Joystick *j = luax_checkjoystick(L, 1); + const char *str = "unknown"; + Joystick::getConstant(j->getGamepadType(), str); + lua_pushstring(L, str); + return 1; +} + int w_Joystick_getGamepadAxis(lua_State *L) { Joystick *j = luax_checkjoystick(L, 1); @@ -359,6 +368,7 @@ static const luaL_Reg w_Joystick_functions[] = { "isDown", w_Joystick_isDown }, { "isGamepad", w_Joystick_isGamepad }, + { "getGamepadType", w_Joystick_getGamepadType }, { "getGamepadAxis", w_Joystick_getGamepadAxis }, { "isGamepadDown", w_Joystick_isGamepadDown }, { "getGamepadMapping", w_Joystick_getGamepadMapping },