diff --git a/apps/openmw/mwbase/inputmanager.hpp b/apps/openmw/mwbase/inputmanager.hpp index f5adc42340..4358c7a1e0 100644 --- a/apps/openmw/mwbase/inputmanager.hpp +++ b/apps/openmw/mwbase/inputmanager.hpp @@ -79,6 +79,8 @@ namespace MWBase /// @return true if joystick, false otherwise virtual bool joystickLastUsed() = 0; virtual void setJoystickLastUsed(bool enabled) = 0; + virtual std::string getControllerButtonIcon(int button) = 0; + virtual std::string getControllerAxisIcon(int axis) = 0; virtual int countSavedGameRecords() const = 0; virtual void write(ESM::ESMWriter& writer, Loading::Listener& progress) = 0; diff --git a/apps/openmw/mwgui/controllerbuttonsoverlay.cpp b/apps/openmw/mwgui/controllerbuttonsoverlay.cpp index 9466f40105..065fb46d77 100644 --- a/apps/openmw/mwgui/controllerbuttonsoverlay.cpp +++ b/apps/openmw/mwgui/controllerbuttonsoverlay.cpp @@ -1,6 +1,7 @@ #include "controllerbuttonsoverlay.hpp" #include "../mwbase/environment.hpp" +#include "../mwbase/inputmanager.hpp" #include "../mwbase/windowmanager.hpp" namespace MWGui @@ -8,50 +9,67 @@ namespace MWGui ControllerButtonsOverlay::ControllerButtonsOverlay() : WindowBase("openmw_controllerbuttons.layout") { + MWBase::InputManager* inputMgr = MWBase::Environment::get().getInputManager(); + getWidget(mImageA, "BtnAImage"); getWidget(mTextA, "BtnAText"); + setIcon(mImageA, inputMgr->getControllerButtonIcon(SDL_CONTROLLER_BUTTON_A)); getWidget(mImageB, "BtnBImage"); getWidget(mTextB, "BtnBText"); + setIcon(mImageB, inputMgr->getControllerButtonIcon(SDL_CONTROLLER_BUTTON_B)); getWidget(mImageDpad, "BtnDpadImage"); getWidget(mTextDpad, "BtnDpadText"); + setIcon(mImageDpad, inputMgr->getControllerButtonIcon(SDL_CONTROLLER_BUTTON_DPAD_UP)); getWidget(mImageL1, "BtnL1Image"); getWidget(mTextL1, "BtnL1Text"); + setIcon(mImageL1, inputMgr->getControllerButtonIcon(SDL_CONTROLLER_BUTTON_LEFTSHOULDER)); getWidget(mImageL2, "BtnL2Image"); getWidget(mTextL2, "BtnL2Text"); + setIcon(mImageL2, inputMgr->getControllerAxisIcon(SDL_CONTROLLER_AXIS_TRIGGERLEFT)); getWidget(mImageL3, "BtnL3Image"); getWidget(mTextL3, "BtnL3Text"); + setIcon(mImageL3, inputMgr->getControllerButtonIcon(SDL_CONTROLLER_BUTTON_LEFTSTICK)); getWidget(mImageLStick, "BtnLStickImage"); getWidget(mTextLStick, "BtnLStickText"); + setIcon(mImageLStick, inputMgr->getControllerAxisIcon(SDL_CONTROLLER_AXIS_LEFTY)); getWidget(mImageMenu, "BtnMenuImage"); getWidget(mTextMenu, "BtnMenuText"); + setIcon(mImageMenu, inputMgr->getControllerButtonIcon(SDL_CONTROLLER_BUTTON_BACK)); getWidget(mImageR1, "BtnR1Image"); getWidget(mTextR1, "BtnR1Text"); + setIcon(mImageR1, inputMgr->getControllerButtonIcon(SDL_CONTROLLER_BUTTON_RIGHTSHOULDER)); getWidget(mImageR2, "BtnR2Image"); getWidget(mTextR2, "BtnR2Text"); + setIcon(mImageR2, inputMgr->getControllerAxisIcon(SDL_CONTROLLER_AXIS_TRIGGERRIGHT)); getWidget(mImageR3, "BtnR3Image"); getWidget(mTextR3, "BtnR3Text"); + setIcon(mImageR3, inputMgr->getControllerButtonIcon(SDL_CONTROLLER_BUTTON_RIGHTSTICK)); getWidget(mImageRStick, "BtnRStickImage"); getWidget(mTextRStick, "BtnRStickText"); + setIcon(mImageRStick, inputMgr->getControllerAxisIcon(SDL_CONTROLLER_AXIS_RIGHTY)); getWidget(mImageView, "BtnViewImage"); getWidget(mTextView, "BtnViewText"); + setIcon(mImageView, inputMgr->getControllerButtonIcon(SDL_CONTROLLER_BUTTON_START)); getWidget(mImageX, "BtnXImage"); getWidget(mTextX, "BtnXText"); + setIcon(mImageX, inputMgr->getControllerButtonIcon(SDL_CONTROLLER_BUTTON_X)); getWidget(mImageY, "BtnYImage"); getWidget(mTextY, "BtnYText"); + setIcon(mImageY, inputMgr->getControllerButtonIcon(SDL_CONTROLLER_BUTTON_Y)); getWidget(mHBox, "ButtonBox"); } @@ -79,6 +97,12 @@ namespace MWGui setVisible(buttonCount > 0); } + void ControllerButtonsOverlay::setIcon(MyGUI::ImageBox* image, const std::string& imagePath) + { + if (imagePath.length() > 0) + image->setImageTexture(imagePath); + } + int ControllerButtonsOverlay::updateButton( MyGUI::TextBox* text, MyGUI::ImageBox* image, const std::string& buttonStr) { diff --git a/apps/openmw/mwgui/controllerbuttonsoverlay.hpp b/apps/openmw/mwgui/controllerbuttonsoverlay.hpp index 7008384bee..700cf0c147 100644 --- a/apps/openmw/mwgui/controllerbuttonsoverlay.hpp +++ b/apps/openmw/mwgui/controllerbuttonsoverlay.hpp @@ -65,6 +65,7 @@ namespace MWGui Gui::HBox* mHBox; + void setIcon(MyGUI::ImageBox* image, const std::string& imagePath); int updateButton(MyGUI::TextBox* text, MyGUI::ImageBox* image, const std::string& buttonStr); }; } diff --git a/apps/openmw/mwgui/inventorytabsoverlay.cpp b/apps/openmw/mwgui/inventorytabsoverlay.cpp index 35b4d1d87f..062e7dbcb4 100644 --- a/apps/openmw/mwgui/inventorytabsoverlay.cpp +++ b/apps/openmw/mwgui/inventorytabsoverlay.cpp @@ -1,6 +1,9 @@ #include "inventorytabsoverlay.hpp" +#include + #include "../mwbase/environment.hpp" +#include "../mwbase/inputmanager.hpp" #include "../mwbase/windowmanager.hpp" namespace MWGui @@ -25,6 +28,15 @@ namespace MWGui getWidget(tab, "TabStats"); tab->eventMouseButtonClick += MyGUI::newDelegate(this, &InventoryTabsOverlay::onTabClicked); mTabs.push_back(tab); + + MyGUI::ImageBox* image; + getWidget(image, "BtnL2Image"); + image->setImageTexture( + MWBase::Environment::get().getInputManager()->getControllerAxisIcon(SDL_CONTROLLER_AXIS_TRIGGERLEFT)); + + getWidget(image, "BtnR2Image"); + image->setImageTexture( + MWBase::Environment::get().getInputManager()->getControllerAxisIcon(SDL_CONTROLLER_AXIS_TRIGGERRIGHT)); } void InventoryTabsOverlay::onTabClicked(MyGUI::Widget* sender) diff --git a/apps/openmw/mwgui/inventorywindow.cpp b/apps/openmw/mwgui/inventorywindow.cpp index a398139df4..9ffed95aa1 100644 --- a/apps/openmw/mwgui/inventorywindow.cpp +++ b/apps/openmw/mwgui/inventorywindow.cpp @@ -19,6 +19,7 @@ #include #include "../mwbase/environment.hpp" +#include "../mwbase/inputmanager.hpp" #include "../mwbase/luamanager.hpp" #include "../mwbase/mechanicsmanager.hpp" #include "../mwbase/windowmanager.hpp" @@ -133,14 +134,18 @@ namespace MWGui if (Settings::gui().mControllerMenus) { // Show L1 and R1 buttons next to tabs - MyGUI::Widget* image; + MyGUI::ImageBox* image; getWidget(image, "BtnL1Image"); image->setVisible(true); image->setUserString("Hidden", "false"); + image->setImageTexture(MWBase::Environment::get().getInputManager()->getControllerButtonIcon( + SDL_CONTROLLER_BUTTON_LEFTSHOULDER)); getWidget(image, "BtnR1Image"); image->setVisible(true); image->setUserString("Hidden", "false"); + image->setImageTexture(MWBase::Environment::get().getInputManager()->getControllerButtonIcon( + SDL_CONTROLLER_BUTTON_RIGHTSHOULDER)); mControllerButtons.r3 = "#{sInfo}"; } diff --git a/apps/openmw/mwgui/tradewindow.cpp b/apps/openmw/mwgui/tradewindow.cpp index c26a7f030a..3e6e886b9d 100644 --- a/apps/openmw/mwgui/tradewindow.cpp +++ b/apps/openmw/mwgui/tradewindow.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -11,6 +12,7 @@ #include "../mwbase/dialoguemanager.hpp" #include "../mwbase/environment.hpp" +#include "../mwbase/inputmanager.hpp" #include "../mwbase/mechanicsmanager.hpp" #include "../mwbase/windowmanager.hpp" #include "../mwbase/world.hpp" @@ -172,14 +174,18 @@ namespace MWGui if (Settings::gui().mControllerMenus) { // Show L1 and R1 buttons next to tabs - MyGUI::Widget* image; + MyGUI::ImageBox* image; getWidget(image, "BtnL1Image"); image->setVisible(true); image->setUserString("Hidden", "false"); + image->setImageTexture(MWBase::Environment::get().getInputManager()->getControllerButtonIcon( + SDL_CONTROLLER_BUTTON_LEFTSHOULDER)); getWidget(image, "BtnR1Image"); image->setVisible(true); image->setUserString("Hidden", "false"); + image->setImageTexture(MWBase::Environment::get().getInputManager()->getControllerButtonIcon( + SDL_CONTROLLER_BUTTON_RIGHTSHOULDER)); mControllerButtons.a = "#{sBuy}"; mControllerButtons.b = "#{sCancel}"; diff --git a/apps/openmw/mwinput/controllermanager.cpp b/apps/openmw/mwinput/controllermanager.cpp index 9962c639ad..68cd9a7dbd 100644 --- a/apps/openmw/mwinput/controllermanager.cpp +++ b/apps/openmw/mwinput/controllermanager.cpp @@ -465,6 +465,120 @@ namespace MWInput return std::array({ gyro[0], gyro[1], gyro[2] }); } + int ControllerManager::getControllerType() + { + int type = 0; +#if SDL_VERSION_ATLEAST(2, 0, 12) + SDL_GameController* cntrl = mBindingsManager->getControllerOrNull(); + if (cntrl) + type = SDL_GameControllerGetType(cntrl); +#endif + return type; + } + + std::string ControllerManager::getControllerButtonIcon(int button) + { + int controllerType = ControllerManager::getControllerType(); + + bool isXbox = false; + bool isPsx = false; + bool isSwitch = false; + +#if SDL_VERSION_ATLEAST(2, 0, 12) + isXbox = controllerType == SDL_CONTROLLER_TYPE_XBOX360 || controllerType == SDL_CONTROLLER_TYPE_XBOXONE; + isPsx = controllerType == SDL_CONTROLLER_TYPE_PS3 || controllerType == SDL_CONTROLLER_TYPE_PS4 + || controllerType == SDL_CONTROLLER_TYPE_PS5; + isSwitch = controllerType == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO; +#endif + + switch (button) + { + case SDL_CONTROLLER_BUTTON_A: + if (isPsx) + return "textures/omw_psx_button_x.dds"; + return "textures/omw_steam_button_a.dds"; + case SDL_CONTROLLER_BUTTON_B: + if (isPsx) + return "textures/omw_psx_button_circle.dds"; + return "textures/omw_steam_button_b.dds"; + case SDL_CONTROLLER_BUTTON_BACK: + return "textures/omw_steam_button_view.dds"; + case SDL_CONTROLLER_BUTTON_DPAD_DOWN: + case SDL_CONTROLLER_BUTTON_DPAD_LEFT: + case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: + case SDL_CONTROLLER_BUTTON_DPAD_UP: + if (isPsx) + return "textures/omw_psx_button_dpad.dds"; + return "textures/omw_steam_button_dpad.dds"; + case SDL_CONTROLLER_BUTTON_LEFTSHOULDER: + if (isXbox) + return "textures/omw_xbox_button_lb.dds"; + else if (isSwitch) + return "textures/omw_switch_button_l.dds"; + return "textures/omw_steam_button_l1.dds"; + case SDL_CONTROLLER_BUTTON_LEFTSTICK: + return "textures/omw_steam_button_l3.dds"; + case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER: + if (isXbox) + return "textures/omw_xbox_button_rb.dds"; + else if (isSwitch) + return "textures/omw_switch_button_r.dds"; + return "textures/omw_steam_button_r1.dds"; + case SDL_CONTROLLER_BUTTON_RIGHTSTICK: + return "textures/omw_steam_button_r3.dds"; + case SDL_CONTROLLER_BUTTON_START: + return "textures/omw_steam_button_menu.dds"; + case SDL_CONTROLLER_BUTTON_X: + if (isPsx) + return "textures/omw_psx_button_square.dds"; + return "textures/omw_steam_button_x.dds"; + case SDL_CONTROLLER_BUTTON_Y: + if (isPsx) + return "textures/omw_psx_button_triangle.dds"; + return "textures/omw_steam_button_y.dds"; + case SDL_CONTROLLER_BUTTON_GUIDE: + default: + return ""; + } + } + + std::string ControllerManager::getControllerAxisIcon(int axis) + { + int controllerType = ControllerManager::getControllerType(); + + bool isXbox = false; + bool isSwitch = false; + +#if SDL_VERSION_ATLEAST(2, 0, 12) + isXbox = controllerType == SDL_CONTROLLER_TYPE_XBOX360 || controllerType == SDL_CONTROLLER_TYPE_XBOXONE; + isSwitch = controllerType == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO; +#endif + + switch (axis) + { + case SDL_CONTROLLER_AXIS_LEFTX: + case SDL_CONTROLLER_AXIS_LEFTY: + return "textures/omw_steam_button_lstick.dds"; + case SDL_CONTROLLER_AXIS_RIGHTX: + case SDL_CONTROLLER_AXIS_RIGHTY: + return "textures/omw_steam_button_rstick.dds"; + case SDL_CONTROLLER_AXIS_TRIGGERLEFT: + if (isXbox) + return "textures/omw_xbox_button_lt.dds"; + else if (isSwitch) + return "textures/omw_switch_button_zl.dds"; + return "textures/omw_steam_button_l2.dds"; + case SDL_CONTROLLER_AXIS_TRIGGERRIGHT: + if (isXbox) + return "textures/omw_xbox_button_rt.dds"; + else if (isSwitch) + return "textures/omw_switch_button_zr.dds"; + return "textures/omw_steam_button_r2.dds"; + default: + return ""; + } + } + void ControllerManager::touchpadMoved(int deviceId, const SDLUtil::TouchEvent& arg) { MWBase::Environment::get().getLuaManager()->inputEvent({ MWBase::LuaManager::InputEvent::TouchMoved, arg }); diff --git a/apps/openmw/mwinput/controllermanager.hpp b/apps/openmw/mwinput/controllermanager.hpp index 670a3c846f..535ee85fd5 100644 --- a/apps/openmw/mwinput/controllermanager.hpp +++ b/apps/openmw/mwinput/controllermanager.hpp @@ -48,6 +48,9 @@ namespace MWInput bool isGyroAvailable() const; std::array getGyroValues() const; + std::string getControllerButtonIcon(int button); + std::string getControllerAxisIcon(int axis); + private: // Return true if GUI consumes input. bool gamepadToGuiControl(const SDL_ControllerButtonEvent& arg); @@ -55,6 +58,8 @@ namespace MWInput void enableGyroSensor(); + int getControllerType(); + BindingsManager* mBindingsManager; MouseManager* mMouseManager; diff --git a/apps/openmw/mwinput/inputmanagerimp.cpp b/apps/openmw/mwinput/inputmanagerimp.cpp index 12d56a3321..7a82c96d09 100644 --- a/apps/openmw/mwinput/inputmanagerimp.cpp +++ b/apps/openmw/mwinput/inputmanagerimp.cpp @@ -249,6 +249,16 @@ namespace MWInput return mControllerManager->joystickLastUsed(); } + std::string InputManager::getControllerButtonIcon(int button) + { + return mControllerManager->getControllerButtonIcon(button); + } + + std::string InputManager::getControllerAxisIcon(int axis) + { + return mControllerManager->getControllerAxisIcon(axis); + } + void InputManager::executeAction(int action) { mActionManager->executeAction(action); diff --git a/apps/openmw/mwinput/inputmanagerimp.hpp b/apps/openmw/mwinput/inputmanagerimp.hpp index b2899e6831..27a938f1ea 100644 --- a/apps/openmw/mwinput/inputmanagerimp.hpp +++ b/apps/openmw/mwinput/inputmanagerimp.hpp @@ -92,6 +92,8 @@ namespace MWInput void setJoystickLastUsed(bool enabled) override; bool joystickLastUsed() override; + std::string getControllerButtonIcon(int button) override; + std::string getControllerAxisIcon(int axis) override; int countSavedGameRecords() const override; void write(ESM::ESMWriter& writer, Loading::Listener& progress) override; diff --git a/files/data/CMakeLists.txt b/files/data/CMakeLists.txt index b1da9f6756..6038e8cdc8 100644 --- a/files/data/CMakeLists.txt +++ b/files/data/CMakeLists.txt @@ -10,6 +10,11 @@ set(BUILTIN_DATA_FILES textures/omw_menu_scroll_center_h.dds textures/omw_menu_scroll_center_v.dds textures/omw_menu_icon_active.dds + textures/omw_psx_button_circle.dds + textures/omw_psx_button_dpad.dds + textures/omw_psx_button_square.dds + textures/omw_psx_button_triangle.dds + textures/omw_psx_button_x.dds textures/omw_steam_button_a.dds textures/omw_steam_button_b.dds textures/omw_steam_button_dpad.dds @@ -25,6 +30,14 @@ set(BUILTIN_DATA_FILES textures/omw_steam_button_view.dds textures/omw_steam_button_x.dds textures/omw_steam_button_y.dds + textures/omw_switch_button_l.dds + textures/omw_switch_button_r.dds + textures/omw_switch_button_zl.dds + textures/omw_switch_button_zr.dds + textures/omw_xbox_button_lb.dds + textures/omw_xbox_button_lt.dds + textures/omw_xbox_button_rb.dds + textures/omw_xbox_button_rt.dds textures/omw/water_nm.png fonts/DejaVuFontLicense.txt diff --git a/files/data/mygui/openmw_inventory_tabs.layout b/files/data/mygui/openmw_inventory_tabs.layout index 3787452586..d13361d5db 100644 --- a/files/data/mygui/openmw_inventory_tabs.layout +++ b/files/data/mygui/openmw_inventory_tabs.layout @@ -10,7 +10,7 @@ - + @@ -39,7 +39,7 @@ - + diff --git a/files/data/textures/omw_psx_button_circle.dds b/files/data/textures/omw_psx_button_circle.dds new file mode 100644 index 0000000000..53d9856a28 Binary files /dev/null and b/files/data/textures/omw_psx_button_circle.dds differ diff --git a/files/data/textures/omw_psx_button_dpad.dds b/files/data/textures/omw_psx_button_dpad.dds new file mode 100644 index 0000000000..b5f74b5153 Binary files /dev/null and b/files/data/textures/omw_psx_button_dpad.dds differ diff --git a/files/data/textures/omw_psx_button_square.dds b/files/data/textures/omw_psx_button_square.dds new file mode 100644 index 0000000000..df6e49c4e7 Binary files /dev/null and b/files/data/textures/omw_psx_button_square.dds differ diff --git a/files/data/textures/omw_psx_button_triangle.dds b/files/data/textures/omw_psx_button_triangle.dds new file mode 100644 index 0000000000..db2d20efda Binary files /dev/null and b/files/data/textures/omw_psx_button_triangle.dds differ diff --git a/files/data/textures/omw_psx_button_x.dds b/files/data/textures/omw_psx_button_x.dds new file mode 100644 index 0000000000..dc032dfedc Binary files /dev/null and b/files/data/textures/omw_psx_button_x.dds differ diff --git a/files/data/textures/omw_steam_button_l1.dds b/files/data/textures/omw_steam_button_l1.dds index 2b79a67b98..83790af2be 100644 Binary files a/files/data/textures/omw_steam_button_l1.dds and b/files/data/textures/omw_steam_button_l1.dds differ diff --git a/files/data/textures/omw_steam_button_r1.dds b/files/data/textures/omw_steam_button_r1.dds index bdd93de2b2..8474bb9ff8 100644 Binary files a/files/data/textures/omw_steam_button_r1.dds and b/files/data/textures/omw_steam_button_r1.dds differ diff --git a/files/data/textures/omw_switch_button_l.dds b/files/data/textures/omw_switch_button_l.dds new file mode 100644 index 0000000000..ee6ed5cd3f Binary files /dev/null and b/files/data/textures/omw_switch_button_l.dds differ diff --git a/files/data/textures/omw_switch_button_r.dds b/files/data/textures/omw_switch_button_r.dds new file mode 100644 index 0000000000..f2d5060ca1 Binary files /dev/null and b/files/data/textures/omw_switch_button_r.dds differ diff --git a/files/data/textures/omw_switch_button_zl.dds b/files/data/textures/omw_switch_button_zl.dds new file mode 100644 index 0000000000..c23c54afcc Binary files /dev/null and b/files/data/textures/omw_switch_button_zl.dds differ diff --git a/files/data/textures/omw_switch_button_zr.dds b/files/data/textures/omw_switch_button_zr.dds new file mode 100644 index 0000000000..ba61341ca6 Binary files /dev/null and b/files/data/textures/omw_switch_button_zr.dds differ diff --git a/files/data/textures/omw_xbox_button_lb.dds b/files/data/textures/omw_xbox_button_lb.dds new file mode 100644 index 0000000000..ae73e5014a Binary files /dev/null and b/files/data/textures/omw_xbox_button_lb.dds differ diff --git a/files/data/textures/omw_xbox_button_lt.dds b/files/data/textures/omw_xbox_button_lt.dds new file mode 100644 index 0000000000..ddae70b961 Binary files /dev/null and b/files/data/textures/omw_xbox_button_lt.dds differ diff --git a/files/data/textures/omw_xbox_button_rb.dds b/files/data/textures/omw_xbox_button_rb.dds new file mode 100644 index 0000000000..335ece93a6 Binary files /dev/null and b/files/data/textures/omw_xbox_button_rb.dds differ diff --git a/files/data/textures/omw_xbox_button_rt.dds b/files/data/textures/omw_xbox_button_rt.dds new file mode 100644 index 0000000000..fe7987310c Binary files /dev/null and b/files/data/textures/omw_xbox_button_rt.dds differ