From c1e6b055556be829e82f7e6647b769465afc2f13 Mon Sep 17 00:00:00 2001 From: Mads Buvik Sandvei Date: Tue, 27 Oct 2020 20:45:41 +0100 Subject: [PATCH] Wrote a meta menu for accessibility on VR controllers with few keys. --- apps/openmw/CMakeLists.txt | 2 +- apps/openmw/mwgui/mode.hpp | 3 +- apps/openmw/mwgui/windowmanagerimp.cpp | 7 ++ apps/openmw/mwgui/windowmanagerimp.hpp | 6 + apps/openmw/mwvr/openxractionset.cpp | 9 +- apps/openmw/mwvr/vrinput.hpp | 1 + apps/openmw/mwvr/vrinputmanager.cpp | 152 ++++++++++++------------- apps/openmw/mwvr/vrmetamenu.cpp | 151 ++++++++++++++++++++++++ apps/openmw/mwvr/vrmetamenu.hpp | 60 ++++++++++ files/mygui/CMakeLists.txt | 1 + files/mygui/openmw_vr_metamenu.layout | 41 +++++++ 11 files changed, 350 insertions(+), 83 deletions(-) create mode 100644 apps/openmw/mwvr/vrmetamenu.cpp create mode 100644 apps/openmw/mwvr/vrmetamenu.hpp create mode 100644 files/mygui/openmw_vr_metamenu.layout diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index efceb940a..8fb2adf30 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -249,7 +249,7 @@ if(BUILD_OPENMW_VR) add_openmw_dir (mwvr openxraction openxractionset openxrdebug openxrinput openxrmanager openxrmanagerimpl openxrswapchain openxrswapchainimpl realisticcombat - vranimation vrcamera vrenvironment vrgui vrinputmanager vrinput vrsession vrframebuffer vrshadow vrtypes vrview vrviewer + vranimation vrcamera vrenvironment vrframebuffer vrgui vrinputmanager vrinput vrmetamenu vrsession vrshadow vrtypes vrview vrviewer ) openmw_add_executable(openmw_vr diff --git a/apps/openmw/mwgui/mode.hpp b/apps/openmw/mwgui/mode.hpp index 62d739657..53a71eaaf 100644 --- a/apps/openmw/mwgui/mode.hpp +++ b/apps/openmw/mwgui/mode.hpp @@ -46,7 +46,8 @@ namespace MWGui GM_LoadingWallpaper, GM_Jail, - GM_QuickKeysMenu + GM_QuickKeysMenu, + GM_VrMetaMenu }; // Windows shown in inventory mode diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index fbcfdd9f7..c794abb62 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -120,6 +120,7 @@ #include "resourceskin.hpp" #ifdef USE_OPENXR +#include "../mwvr/vrmetamenu.hpp" #include "../mwvr/vrenvironment.hpp" #include "../mwvr/vrgui.hpp" #endif @@ -447,6 +448,12 @@ namespace MWGui mWindows.push_back(mJailScreen); mGuiModeStates[GM_Jail] = GuiModeState(mJailScreen); +#ifdef USE_OPENXR + mVrMetaMenu = new MWVR::VrMetaMenu(w, h); + mWindows.push_back(mVrMetaMenu); + mGuiModeStates[GM_VrMetaMenu] = GuiModeState(mVrMetaMenu); +#endif + std::string werewolfFaderTex = "textures\\werewolfoverlay.dds"; if (mResourceSystem->getVFS()->exists(werewolfFaderTex)) { diff --git a/apps/openmw/mwgui/windowmanagerimp.hpp b/apps/openmw/mwgui/windowmanagerimp.hpp index 270956b3c..201b64d79 100644 --- a/apps/openmw/mwgui/windowmanagerimp.hpp +++ b/apps/openmw/mwgui/windowmanagerimp.hpp @@ -88,6 +88,11 @@ namespace MWRender class LocalMap; } +namespace MWVR +{ + class VrMetaMenu; +} + namespace MWGui { class WindowBase; @@ -440,6 +445,7 @@ namespace MWGui ScreenFader* mScreenFader; DebugWindow* mDebugWindow; JailScreen* mJailScreen; + MWVR::VrMetaMenu* mVrMetaMenu; std::vector mWindows; diff --git a/apps/openmw/mwvr/openxractionset.cpp b/apps/openmw/mwvr/openxractionset.cpp index cf936348f..a02be8a4c 100644 --- a/apps/openmw/mwvr/openxractionset.cpp +++ b/apps/openmw/mwvr/openxractionset.cpp @@ -55,6 +55,7 @@ namespace MWVR // while staying true to openxr's binding system, so if the system i wrote for the oculus touch isn't a good fit for // the vive/index, we might want to rewrite this to handle bindings ourselves. createMWAction(MWInput::A_GameMenu, "game_menu", "Game Menu"); + createMWAction(A_VrMetaMenu, "meta_menu", "Meta Menu"); createMWAction(A_Recenter, "reposition_menu", "Reposition Menu"); createMWAction(MWInput::A_Inventory, "inventory", "Inventory"); createMWAction(MWInput::A_Activate, "activate", "Activate"); @@ -71,14 +72,14 @@ namespace MWVR createMWAction(MWInput::A_LookLeftRight, "look_left_right", "Look Left Right"); createMWAction(MWInput::A_MoveForwardBackward, "move_forward_backward", "Move Forward Backward"); createMWAction(MWInput::A_MoveLeftRight, "move_left_right", "Move Left Right"); - createMWAction(MWInput::A_Journal, "journal_book", "Journal Book"); - createMWAction(MWInput::A_QuickSave, "quick_save", "Quick Save"); + createMWAction(MWInput::A_Journal, "journal_book", "Journal Book"); + createMWAction(MWInput::A_QuickSave, "quick_save", "Quick Save"); createMWAction(MWInput::A_Rest, "rest", "Rest"); createMWAction(A_ActivateTouch, "activate_touched", "Activate Touch"); createMWAction(MWInput::A_AlwaysRun, "always_run", "Always Run"); createMWAction(MWInput::A_AutoMove, "auto_move", "Auto Move"); - createMWAction(MWInput::A_ToggleHUD, "toggle_hud", "Toggle HUD"); - createMWAction(MWInput::A_ToggleDebug, "toggle_debug", "Toggle DEBUG"); + createMWAction(MWInput::A_ToggleHUD, "toggle_hud", "Toggle HUD"); + createMWAction(MWInput::A_ToggleDebug, "toggle_debug", "Toggle the debug hud"); createMWAction(A_MenuUpDown, "menu_up_down", "Menu Up Down"); createMWAction(A_MenuLeftRight, "menu_left_right", "Menu Left Right"); createMWAction(A_MenuSelect, "menu_select", "Menu Select"); diff --git a/apps/openmw/mwvr/vrinput.hpp b/apps/openmw/mwvr/vrinput.hpp index 44bc87c84..7f534b9d3 100644 --- a/apps/openmw/mwvr/vrinput.hpp +++ b/apps/openmw/mwvr/vrinput.hpp @@ -12,6 +12,7 @@ namespace MWVR enum VrActions { A_VrFirst = MWInput::A_Last + 1, + A_VrMetaMenu, A_ActivateTouch, A_HapticsLeft, A_HapticsRight, diff --git a/apps/openmw/mwvr/vrinputmanager.cpp b/apps/openmw/mwvr/vrinputmanager.cpp index db11abcb3..a358c9c57 100644 --- a/apps/openmw/mwvr/vrinputmanager.cpp +++ b/apps/openmw/mwvr/vrinputmanager.cpp @@ -182,10 +182,10 @@ namespace MWVR // In-game character controls SuggestedBindings simpleGameplayBindings{ {MWInput::A_Use, "/user/hand/left/input/select/click"}, // Touch: X - {MWInput::A_GameMenu, "/user/hand/left/input/menu/click"}, // Touch: Y + {A_VrMetaMenu, "/user/hand/left/input/menu/click"}, // Touch: Y {A_Recenter, "/user/hand/left/input/menu/click"}, // Touch: Y {A_ActivateTouch, "/user/hand/right/input/select/click"}, // Touch: A - {MWInput::A_Inventory, "/user/hand/right/input/menu/click"}, // Touch: B + {MWInput::A_AutoMove, "/user/hand/right/input/menu/click"}, // Touch: B }; // GUI controls @@ -206,25 +206,25 @@ namespace MWVR // In-game character controls SuggestedBindings gameplayBindings{ - {A_ActivateTouch, "/user/hand/right/input/squeeze/value"}, {A_Recenter, "/user/hand/left/input/menu/click"}, - {MWInput::A_Activate, "/user/hand/right/input/squeeze/value"}, - {MWInput::A_AlwaysRun, "/user/hand/left/input/thumbstick/click"}, - {MWInput::A_AutoMove, "/user/hand/right/input/thumbstick/click"}, - {MWInput::A_GameMenu, "/user/hand/left/input/menu/click"}, - {MWInput::A_Inventory, "/user/hand/right/input/b/click"}, - {MWInput::A_Journal, "/user/hand/right/input/b/click"}, - {MWInput::A_Jump, "/user/hand/left/input/trigger/value"}, - {MWInput::A_LookLeftRight, "/user/hand/right/input/thumbstick/x"}, - {MWInput::A_MoveForwardBackward,"/user/hand/left/input/thumbstick/y"}, - {MWInput::A_MoveLeftRight, "/user/hand/left/input/thumbstick/x"}, - {MWInput::A_QuickSave, "/user/hand/left/input/y/click"}, - {MWInput::A_Rest, "/user/hand/left/input/y/click"}, + {A_VrMetaMenu, "/user/hand/left/input/menu/click"}, {MWInput::A_Sneak, "/user/hand/left/input/squeeze/value"}, - {MWInput::A_ToggleDebug, "/user/hand/right/input/thumbstick/click"}, - {MWInput::A_ToggleHUD, "/user/hand/left/input/thumbstick/click"}, + {MWInput::A_MoveLeftRight, "/user/hand/left/input/thumbstick/x"}, + {MWInput::A_MoveForwardBackward,"/user/hand/left/input/thumbstick/y"}, + {MWInput::A_AlwaysRun, "/user/hand/left/input/thumbstick/click"}, + //{MWInput::A_ToggleHUD, "/user/hand/left/input/thumbstick/click"}, + {MWInput::A_Jump, "/user/hand/left/input/trigger/value"}, {MWInput::A_ToggleSpell, "/user/hand/left/input/x/click"}, + //{MWInput::A_QuickSave, "/user/hand/left/input/y/click"}, + {MWInput::A_Rest, "/user/hand/left/input/y/click"}, {MWInput::A_ToggleWeapon, "/user/hand/right/input/a/click"}, + {MWInput::A_Inventory, "/user/hand/right/input/b/click"}, + //{MWInput::A_Journal, "/user/hand/right/input/b/click"}, + {A_ActivateTouch, "/user/hand/right/input/squeeze/value"}, + {MWInput::A_Activate, "/user/hand/right/input/squeeze/value"}, + {MWInput::A_LookLeftRight, "/user/hand/right/input/thumbstick/x"}, + {MWInput::A_AutoMove, "/user/hand/right/input/thumbstick/click"}, + //{MWInput::A_ToggleDebug, "/user/hand/right/input/thumbstick/click"}, {MWInput::A_Use, "/user/hand/right/input/trigger/value"}, }; @@ -234,8 +234,8 @@ namespace MWVR {A_MenuLeftRight, "/user/hand/right/input/thumbstick/x"}, {A_MenuSelect, "/user/hand/right/input/a/click"}, {A_MenuBack, "/user/hand/right/input/b/click"}, - {MWInput::A_GameMenu, "/user/hand/left/input/menu/click"}, {MWInput::A_Use, "/user/hand/right/input/trigger/value"}, + {MWInput::A_GameMenu, "/user/hand/left/input/menu/click"}, {A_Recenter, "/user/hand/left/input/menu/click"}, }; @@ -249,37 +249,37 @@ namespace MWVR // In-game character controls SuggestedBindings gameplayBindings{ - {A_ActivateTouch, "/user/hand/right/input/squeeze/value"}, {A_Recenter, "/user/hand/left/input/menu/click"}, - {MWInput::A_Activate, "/user/hand/right/input/squeeze/value"}, - {MWInput::A_AlwaysRun, "/user/hand/left/input/thumbstick/click"}, - {MWInput::A_AutoMove, "/user/hand/right/input/thumbstick/click"}, - {MWInput::A_GameMenu, "/user/hand/left/input/menu/click"}, - {MWInput::A_Inventory, "/user/hand/right/input/b/click"}, - {MWInput::A_Journal, "/user/hand/right/input/b/click"}, - {MWInput::A_Jump, "/user/hand/left/input/trigger/value"}, - {MWInput::A_LookLeftRight, "/user/hand/right/input/thumbstick/x"}, + {A_VrMetaMenu, "/user/hand/left/input/menu/click"}, + {MWInput::A_Sneak, "/user/hand/left/input/squeeze/value"}, {MWInput::A_MoveForwardBackward,"/user/hand/left/input/thumbstick/y"}, {MWInput::A_MoveLeftRight, "/user/hand/left/input/thumbstick/x"}, - {MWInput::A_QuickSave, "/user/hand/left/input/y/click"}, - {MWInput::A_Rest, "/user/hand/left/input/y/click"}, - {MWInput::A_Sneak, "/user/hand/left/input/squeeze/value"}, - {MWInput::A_ToggleDebug, "/user/hand/right/input/thumbstick/click"}, - {MWInput::A_ToggleHUD, "/user/hand/left/input/thumbstick/click"}, + {MWInput::A_AlwaysRun, "/user/hand/left/input/thumbstick/click"}, + //{MWInput::A_ToggleHUD, "/user/hand/left/input/thumbstick/click"}, + {MWInput::A_Jump, "/user/hand/left/input/trigger/value"}, {MWInput::A_ToggleSpell, "/user/hand/left/input/x/click"}, + //{MWInput::A_QuickSave, "/user/hand/left/input/y/click"}, + {MWInput::A_Rest, "/user/hand/left/input/y/click"}, {MWInput::A_ToggleWeapon, "/user/hand/right/input/a/click"}, + {MWInput::A_Inventory, "/user/hand/right/input/b/click"}, + //{MWInput::A_Journal, "/user/hand/right/input/b/click"}, + {MWInput::A_LookLeftRight, "/user/hand/right/input/thumbstick/x"}, + {MWInput::A_AutoMove, "/user/hand/right/input/thumbstick/click"}, + //{MWInput::A_ToggleDebug, "/user/hand/right/input/thumbstick/click"}, {MWInput::A_Use, "/user/hand/right/input/trigger/value"}, + {A_ActivateTouch, "/user/hand/right/input/squeeze/value"}, + {MWInput::A_Activate, "/user/hand/right/input/squeeze/value"}, }; // GUI controls SuggestedBindings GUIBindings{ + {A_Recenter, "/user/hand/left/input/menu/click"}, + {MWInput::A_GameMenu, "/user/hand/left/input/menu/click"}, {A_MenuUpDown, "/user/hand/right/input/thumbstick/y"}, {A_MenuLeftRight, "/user/hand/right/input/thumbstick/x"}, {A_MenuSelect, "/user/hand/right/input/a/click"}, {A_MenuBack, "/user/hand/right/input/b/click"}, - {MWInput::A_GameMenu, "/user/hand/left/input/menu/click"}, {MWInput::A_Use, "/user/hand/right/input/trigger/value"}, - {A_Recenter, "/user/hand/left/input/menu/click"}, }; mXRInput->suggestBindings(ActionSet::Gameplay, controllerProfilePath, gameplayBindings); @@ -298,33 +298,33 @@ namespace MWVR //{MWInput::A_AutoMove, "/user/hand/right/input/thumbstick/click"}, //{MWInput::A_ToggleDebug, "/user/hand/right/input/thumbstick/click"}, //{MWInput::A_ToggleHUD, "/user/hand/left/input/thumbstick/click"}, - {A_ActivateTouch, "/user/hand/right/input/squeeze/click"}, {A_Recenter, "/user/hand/left/input/menu/click"}, - {MWInput::A_Activate, "/user/hand/right/input/squeeze/click"}, - {MWInput::A_GameMenu, "/user/hand/left/input/menu/click"}, - {MWInput::A_Inventory, "/user/hand/right/input/thumbstick/click"}, - {MWInput::A_Journal, "/user/hand/right/input/thumbstick/click"}, + {A_VrMetaMenu, "/user/hand/left/input/menu/click"}, {MWInput::A_Jump, "/user/hand/left/input/trigger/value"}, - {MWInput::A_LookLeftRight, "/user/hand/right/input/thumbstick/x"}, {MWInput::A_MoveForwardBackward,"/user/hand/left/input/thumbstick/y"}, {MWInput::A_MoveLeftRight, "/user/hand/left/input/thumbstick/x"}, - {MWInput::A_QuickSave, "/user/hand/left/input/thumbstick/click"}, + //{MWInput::A_QuickSave, "/user/hand/left/input/thumbstick/click"}, {MWInput::A_Rest, "/user/hand/left/input/thumbstick/click"}, - {MWInput::A_Sneak, "/user/hand/left/input/squeeze/click"}, {MWInput::A_ToggleSpell, "/user/hand/left/input/trackpad/click"}, + {MWInput::A_Sneak, "/user/hand/left/input/squeeze/click"}, + {MWInput::A_Inventory, "/user/hand/right/input/thumbstick/click"}, + //{MWInput::A_Journal, "/user/hand/right/input/thumbstick/click"}, + {MWInput::A_LookLeftRight, "/user/hand/right/input/thumbstick/x"}, {MWInput::A_ToggleWeapon, "/user/hand/right/input/trackpad/click"}, {MWInput::A_Use, "/user/hand/right/input/trigger/value"}, + {A_ActivateTouch, "/user/hand/right/input/squeeze/click"}, + {MWInput::A_Activate, "/user/hand/right/input/squeeze/click"}, }; // GUI controls SuggestedBindings GUIBindings{ + {A_MenuBack, "/user/hand/left/input/trackpad/click"}, + {MWInput::A_GameMenu, "/user/hand/left/input/menu/click"}, + {A_Recenter, "/user/hand/left/input/menu/click"}, {A_MenuUpDown, "/user/hand/right/input/thumbstick/y"}, {A_MenuLeftRight, "/user/hand/right/input/thumbstick/x"}, {A_MenuSelect, "/user/hand/right/input/trackpad/click"}, - {A_MenuBack, "/user/hand/left/input/trackpad/click"}, - {MWInput::A_GameMenu, "/user/hand/left/input/menu/click"}, {MWInput::A_Use, "/user/hand/right/input/trigger/value"}, - {A_Recenter, "/user/hand/left/input/menu/click"}, }; mXRInput->suggestBindings(ActionSet::Gameplay, controllerProfilePath, gameplayBindings); @@ -336,37 +336,37 @@ namespace MWVR std::string controllerProfilePath = "/interaction_profiles/valve/index_controller"; // In-game character controls SuggestedBindings gameplayBindings{ - {A_ActivateTouch, "/user/hand/right/input/squeeze/force"}, - {A_Recenter, "/user/hand/left/input/thumbstick/click"}, - {MWInput::A_Activate, "/user/hand/right/input/squeeze/force"}, //{MWInput::A_AlwaysRun, "/user/hand/left/input/thumbstick/click"}, - //{MWInput::A_AutoMove, "/user/hand/right/input/thumbstick/click"}, - {MWInput::A_GameMenu, "/user/hand/left/input/trackpad/force"}, - {MWInput::A_Inventory, "/user/hand/right/input/b/click"}, - {MWInput::A_Journal, "/user/hand/right/input/b/click"}, - {MWInput::A_Jump, "/user/hand/left/input/trigger/value"}, - {MWInput::A_LookLeftRight, "/user/hand/right/input/thumbstick/x"}, + {MWInput::A_ToggleSpell, "/user/hand/left/input/a/click"}, + {MWInput::A_Rest, "/user/hand/left/input/b/click"}, + //{MWInput::A_QuickSave, "/user/hand/left/input/b/click"}, {MWInput::A_MoveForwardBackward,"/user/hand/left/input/thumbstick/y"}, {MWInput::A_MoveLeftRight, "/user/hand/left/input/thumbstick/x"}, - {MWInput::A_QuickSave, "/user/hand/left/input/b/click"}, - {MWInput::A_Rest, "/user/hand/left/input/b/click"}, - {MWInput::A_Sneak, "/user/hand/left/input/squeeze/force"}, - //{MWInput::A_ToggleDebug, "/user/hand/right/input/thumbstick/click"}, //{MWInput::A_ToggleHUD, "/user/hand/left/input/thumbstick/click"}, - {MWInput::A_ToggleSpell, "/user/hand/left/input/a/click"}, + {A_Recenter, "/user/hand/left/input/trackpad/force"}, + {A_VrMetaMenu, "/user/hand/left/input/trackpad/force"}, + {MWInput::A_Jump, "/user/hand/left/input/trigger/value"}, + {MWInput::A_Sneak, "/user/hand/left/input/squeeze/force"}, {MWInput::A_ToggleWeapon, "/user/hand/right/input/a/click"}, + {MWInput::A_Inventory, "/user/hand/right/input/b/click"}, + //{MWInput::A_Journal, "/user/hand/right/input/b/click"}, + //{MWInput::A_AutoMove, "/user/hand/right/input/thumbstick/click"}, + {MWInput::A_LookLeftRight, "/user/hand/right/input/thumbstick/x"}, + //{MWInput::A_ToggleDebug, "/user/hand/right/input/thumbstick/click"}, {MWInput::A_Use, "/user/hand/right/input/trigger/value"}, + {A_ActivateTouch, "/user/hand/right/input/squeeze/force"}, + {MWInput::A_Activate, "/user/hand/right/input/squeeze/force"}, }; // GUI controls SuggestedBindings GUIBindings{ - {A_MenuUpDown, "/user/hand/right/input/thumbstick/y"}, - {A_MenuLeftRight, "/user/hand/right/input/thumbstick/x"}, - {A_MenuSelect, "/user/hand/right/input/a/click"}, - {A_MenuBack, "/user/hand/right/input/b/click"}, - {MWInput::A_GameMenu, "/user/hand/left/input/trackpad/force"}, - {MWInput::A_Use, "/user/hand/right/input/trigger/value"}, - {A_Recenter, "/user/hand/left/input/thumbstick/click"}, + {A_Recenter, "/user/hand/left/input/thumbstick/click"}, + {MWInput::A_GameMenu, "/user/hand/left/input/trackpad/force"}, + {A_MenuSelect, "/user/hand/right/input/a/click"}, + {A_MenuBack, "/user/hand/right/input/b/click"}, + {MWInput::A_Use, "/user/hand/right/input/trigger/value"}, + {A_MenuUpDown, "/user/hand/right/input/thumbstick/y"}, + {A_MenuLeftRight, "/user/hand/right/input/thumbstick/x"}, }; mXRInput->suggestBindings(ActionSet::Gameplay, controllerProfilePath, gameplayBindings); @@ -389,18 +389,18 @@ namespace MWVR //{MWInput::A_Rest, "/user/hand/left/input/b/click"}, //{MWInput::A_ToggleDebug, "/user/hand/right/input/thumbstick/click"}, //{MWInput::A_ToggleHUD, "/user/hand/left/input/thumbstick/click"}, - {A_ActivateTouch, "/user/hand/right/input/squeeze/click"}, {A_Recenter, "/user/hand/left/input/menu/click"}, - {MWInput::A_Activate, "/user/hand/right/input/squeeze/click"}, - {MWInput::A_GameMenu, "/user/hand/left/input/menu/click"}, - {MWInput::A_Jump, "/user/hand/left/input/trigger/value"}, - {MWInput::A_LookLeftRight, "/user/hand/right/input/trackpad/x"}, + {A_VrMetaMenu, "/user/hand/left/input/menu/click"}, {MWInput::A_MoveForwardBackward,"/user/hand/left/input/trackpad/y"}, {MWInput::A_MoveLeftRight, "/user/hand/left/input/trackpad/x"}, - {MWInput::A_Sneak, "/user/hand/left/input/squeeze/click"}, {MWInput::A_ToggleSpell, "/user/hand/left/input/trackpad/click"}, + {MWInput::A_Jump, "/user/hand/left/input/trigger/value"}, + {MWInput::A_Sneak, "/user/hand/left/input/squeeze/click"}, + {MWInput::A_LookLeftRight, "/user/hand/right/input/trackpad/x"}, {MWInput::A_ToggleWeapon, "/user/hand/right/input/trackpad/click"}, {MWInput::A_Use, "/user/hand/right/input/trigger/value"}, + {A_ActivateTouch, "/user/hand/right/input/squeeze/click"}, + {MWInput::A_Activate, "/user/hand/right/input/squeeze/click"}, }; // GUI controls @@ -703,13 +703,14 @@ namespace MWVR case MWInput::A_GameMenu: mActionManager->toggleMainMenu(); break; + case A_VrMetaMenu: + MWBase::Environment::get().getWindowManager()->pushGuiMode(MWGui::GM_VrMetaMenu); + break; case MWInput::A_Screenshot: mActionManager->screenshot(); break; case MWInput::A_Inventory: mActionManager->toggleInventory(); - //injectMousePress(SDL_BUTTON_RIGHT, true); - //mBindingsManager->ics().getChannel(MWInput::A_Inventory)->setValue(0.f); break; case MWInput::A_Console: mActionManager->toggleConsole(); @@ -825,9 +826,6 @@ namespace MWVR if (isToggleSneak) mActionManager->toggleSneaking(); break; - case MWInput::A_Inventory: - //injectMousePress(SDL_BUTTON_RIGHT, false); - //mBindingsManager->ics().getChannel(MWInput::A_Inventory)->setValue(0.f); default: break; } diff --git a/apps/openmw/mwvr/vrmetamenu.cpp b/apps/openmw/mwvr/vrmetamenu.cpp new file mode 100644 index 000000000..def6fe1c6 --- /dev/null +++ b/apps/openmw/mwvr/vrmetamenu.cpp @@ -0,0 +1,151 @@ +#include "vrmetamenu.hpp" + +#include + +#include "../mwbase/environment.hpp" +#include "../mwbase/windowmanager.hpp" +#include "../mwbase/world.hpp" +#include "../mwbase/statemanager.hpp" +#include "vrmetamenu.hpp" + +namespace MWVR +{ + + VrMetaMenu::VrMetaMenu(int w, int h) + : WindowBase("openmw_vr_metamenu.layout") + , mWidth (w) + , mHeight (h) + , mButtonBox(0) + { + + getWidget(mButtonBox, "ButtonBox"); + + updateMenu(); + } + + VrMetaMenu::~VrMetaMenu() + { + + } + + void VrMetaMenu::onResChange(int w, int h) + { + mWidth = w; + mHeight = h; + + updateMenu(); + } + + void VrMetaMenu::setVisible (bool visible) + { + if (visible) + updateMenu(); + + MWBase::Environment::get().getWindowManager()->setKeyFocusWidget(mButtons["return"]); + + Layout::setVisible (visible); + } + + void VrMetaMenu::onFrame(float dt) + { + } + + void VrMetaMenu::onConsole() + { + if (MyGUI::InputManager::getInstance().isModalAny()) + return; + + MWBase::Environment::get().getWindowManager()->toggleConsole(); + } + + void VrMetaMenu::onGameMenu() + { + MWBase::Environment::get().getWindowManager()->pushGuiMode(MWGui::GM_MainMenu); + } + + void VrMetaMenu::onJournal() + { + MWBase::Environment::get().getWindowManager()->pushGuiMode(MWGui::GM_Journal); + } + + void VrMetaMenu::onInventory() + { + MWBase::Environment::get().getWindowManager()->pushGuiMode(MWGui::GM_Inventory); + } + + void VrMetaMenu::onRest() + { + if (!MWBase::Environment::get().getWindowManager()->getRestEnabled() || MWBase::Environment::get().getWindowManager()->isGuiMode()) + return; + + MWBase::Environment::get().getWindowManager()->pushGuiMode(MWGui::GM_Rest); //Open rest GUI + } + + void VrMetaMenu::onQuickLoad() + { + if (!MyGUI::InputManager::getInstance().isModalAny()) + MWBase::Environment::get().getStateManager()->quickLoad(); + } + + void VrMetaMenu::onQuickSave() + { + if (!MyGUI::InputManager::getInstance().isModalAny()) + MWBase::Environment::get().getStateManager()->quickSave(); + } + + void VrMetaMenu::close() + { + MWBase::Environment::get().getWindowManager()->removeGuiMode(MWGui::GM_VrMetaMenu); + } + + void VrMetaMenu::onButtonClicked(MyGUI::Widget *sender) + { + std::string name = *sender->getUserData(); + close(); + if (name == "console") + onConsole(); + else if (name == "gamemenu") + onGameMenu(); + else if (name == "journal") + onJournal(); + else if (name == "inventory") + onInventory(); + else if (name == "rest") + onRest(); + else if (name == "quickload") + onQuickLoad(); + else if (name == "quicksave") + onQuickSave(); + } + + bool VrMetaMenu::exit() + { + return MWBase::Environment::get().getStateManager()->getState() == MWBase::StateManager::State_Running; + } + + void VrMetaMenu::updateMenu() + { + setCoord(0,0, mWidth, mHeight); + + static std::vector buttons{ "return", "quicksave", "quickload", "console", "inventory", "journal", "rest", "gamemenu" }; + + if(mButtons.empty()) + for (std::string& buttonId : buttons) + { + MyGUI::Button* button = nullptr; + getWidget(button, buttonId); + if (!button) + throw std::logic_error( std::string() + "Unable to find button \"" + buttonId + "\""); + button->eventMouseButtonClick += MyGUI::newDelegate(this, &VrMetaMenu::onButtonClicked); + button->setUserData(std::string(buttonId)); + button->setVisible(true); + mButtons[buttonId] = button; + } + + int width = mButtonBox->getWidth(); + int height = mButtonBox->getHeight(); + + mButtonBox->setCoord (mWidth/2 - width/2, mHeight/2 - height/2, width, height); + mButtonBox->setVisible(true); + } +} diff --git a/apps/openmw/mwvr/vrmetamenu.hpp b/apps/openmw/mwvr/vrmetamenu.hpp new file mode 100644 index 000000000..23b4d0fd9 --- /dev/null +++ b/apps/openmw/mwvr/vrmetamenu.hpp @@ -0,0 +1,60 @@ +#ifndef OPENMW_GAME_MWVR_VRMETAMENU_H +#define OPENMW_GAME_MWVR_VRMETAMENU_H + +#include "../mwgui/windowbase.hpp" + +#include +#include "components/widgets/box.hpp" + +namespace Gui +{ + class ImageButton; +} + +namespace VFS +{ + class Manager; +} + +namespace MWVR +{ + class VrMetaMenu : public MWGui::WindowBase + { + int mWidth; + int mHeight; + + bool mHasAnimatedMenu; + + public: + + VrMetaMenu(int w, int h); + ~VrMetaMenu(); + + void onResChange(int w, int h) override; + + void setVisible (bool visible) override; + + void onFrame(float dt) override; + + bool exit() override; + + private: + MyGUI::Widget* mButtonBox{ nullptr }; + std::map mButtons{}; + + void onButtonClicked (MyGUI::Widget* sender); + void onConsole(); + void onJournal(); + void onGameMenu(); + void onInventory(); + void onRest(); + void onQuickLoad(); + void onQuickSave(); + void close(); + + void updateMenu(); + }; + +} + +#endif diff --git a/files/mygui/CMakeLists.txt b/files/mygui/CMakeLists.txt index 24b8cc86c..e6ffb4306 100644 --- a/files/mygui/CMakeLists.txt +++ b/files/mygui/CMakeLists.txt @@ -61,6 +61,7 @@ set(MYGUI_FILES openmw_list.skin.xml openmw_loading_screen.layout openmw_magicselection_dialog.layout + openmw_vr_metamenu.layout openmw_mainmenu.layout openmw_mainmenu.skin.xml openmw_map_window.layout diff --git a/files/mygui/openmw_vr_metamenu.layout b/files/mygui/openmw_vr_metamenu.layout new file mode 100644 index 000000000..08550db6e --- /dev/null +++ b/files/mygui/openmw_vr_metamenu.layout @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +