diff --git a/Source/Core/Core/HotkeyManager.cpp b/Source/Core/Core/HotkeyManager.cpp index 485c953e41..2b17c6fb37 100644 --- a/Source/Core/Core/HotkeyManager.cpp +++ b/Source/Core/Core/HotkeyManager.cpp @@ -116,6 +116,12 @@ const std::string hotkey_labels[] = _trans("Undo Save State"), _trans("Save State"), _trans("Load State"), + + _trans("Toggle 3D Preset"), + _trans("Use 3D Preset 1"), + _trans("Use 3D Preset 2"), + _trans("Use 3D Preset 3"), + }; static_assert(NUM_HOTKEYS == sizeof(hotkey_labels) / sizeof(hotkey_labels[0]), "Wrong count of hotkey_labels"); diff --git a/Source/Core/Core/HotkeyManager.h b/Source/Core/Core/HotkeyManager.h index 8cecf426aa..1d0f18132a 100644 --- a/Source/Core/Core/HotkeyManager.h +++ b/Source/Core/Core/HotkeyManager.h @@ -117,6 +117,11 @@ enum Hotkey HK_SAVE_STATE_FILE, HK_LOAD_STATE_FILE, + HK_SWITCH_STEREOSCOPY_PRESET, + HK_USE_STEREOSCOPY_PRESET_0, + HK_USE_STEREOSCOPY_PRESET_1, + HK_USE_STEREOSCOPY_PRESET_2, + NUM_HOTKEYS, }; diff --git a/Source/Core/DolphinWX/Frame.cpp b/Source/Core/DolphinWX/Frame.cpp index d367f94c9b..fef41bbce2 100644 --- a/Source/Core/DolphinWX/Frame.cpp +++ b/Source/Core/DolphinWX/Frame.cpp @@ -1416,29 +1416,73 @@ void CFrame::ParseHotkeys() { State::Load(g_saveSlot); } - if (IsHotkey(HK_DECREASE_DEPTH, true)) + + auto savePreset = [](const std::string& param, int value) + { + IniFile localIni = SConfig::GetInstance().LoadLocalGameIni(); + localIni.GetOrCreateSection("Enhancements")->Set( + StringFromFormat("Stereo%s_%d", param.c_str(), g_Config.iStereoActivePreset), + value); + std::string iniFileName = File::GetUserPath(D_GAMESETTINGS_IDX) + SConfig::GetInstance().GetUniqueID() + ".ini"; + OSD::AddMessage(StringFromFormat("%s: %d", param.c_str(), value) , 1000); + localIni.Save(iniFileName); + }; + + if (IsHotkey(HK_DECREASE_DEPTH)) { if (--g_Config.iStereoDepth < 0) g_Config.iStereoDepth = 0; + g_Config.oStereoPresets[g_Config.iStereoActivePreset].depth = g_Config.iStereoDepth; + savePreset("Depth", g_Config.iStereoDepth); } - if (IsHotkey(HK_INCREASE_DEPTH, true)) + if (IsHotkey(HK_INCREASE_DEPTH)) { if (++g_Config.iStereoDepth > 100) g_Config.iStereoDepth = 100; + g_Config.oStereoPresets[g_Config.iStereoActivePreset].depth = g_Config.iStereoDepth; + savePreset("Depth", g_Config.iStereoDepth); } - if (IsHotkey(HK_DECREASE_CONVERGENCE, true)) + if (IsHotkey(HK_DECREASE_CONVERGENCE)) { g_Config.iStereoConvergence -= 5; if (g_Config.iStereoConvergence < 0) g_Config.iStereoConvergence = 0; + g_Config.oStereoPresets[g_Config.iStereoActivePreset].convergence = g_Config.iStereoConvergence; + savePreset("Convergence", g_Config.iStereoConvergence); } - if (IsHotkey(HK_INCREASE_CONVERGENCE, true)) + if (IsHotkey(HK_INCREASE_CONVERGENCE)) { g_Config.iStereoConvergence += 5; if (g_Config.iStereoConvergence > 500) g_Config.iStereoConvergence = 500; + g_Config.oStereoPresets[g_Config.iStereoActivePreset].convergence = g_Config.iStereoConvergence; + savePreset("Convergence", g_Config.iStereoConvergence); } + if (IsHotkey(HK_SWITCH_STEREOSCOPY_PRESET)) + { + g_Config.iStereoActivePreset = !g_Config.iStereoActivePreset; + g_Config.iStereoConvergence = g_Config.oStereoPresets[g_Config.iStereoActivePreset].convergence; + g_Config.iStereoDepth = g_Config.oStereoPresets[g_Config.iStereoActivePreset].depth; + } + if (IsHotkey(HK_USE_STEREOSCOPY_PRESET_0)) + { + g_Config.iStereoActivePreset = 0; + g_Config.iStereoConvergence = g_Config.oStereoPresets[g_Config.iStereoActivePreset].convergence; + g_Config.iStereoDepth = g_Config.oStereoPresets[g_Config.iStereoActivePreset].depth; + } + if (IsHotkey(HK_USE_STEREOSCOPY_PRESET_1)) + { + g_Config.iStereoActivePreset = 1; + g_Config.iStereoConvergence = g_Config.oStereoPresets[g_Config.iStereoActivePreset].convergence; + g_Config.iStereoDepth = g_Config.oStereoPresets[g_Config.iStereoActivePreset].depth; + } + if (IsHotkey(HK_USE_STEREOSCOPY_PRESET_2)) + { + g_Config.iStereoActivePreset = 2; + g_Config.iStereoConvergence = g_Config.oStereoPresets[g_Config.iStereoActivePreset].convergence; + g_Config.iStereoDepth = g_Config.oStereoPresets[g_Config.iStereoActivePreset].depth; + } static float debugSpeed = 1.0f; if (IsHotkey(HK_FREELOOK_DECREASE_SPEED, true)) debugSpeed /= 1.1f; diff --git a/Source/Core/VideoCommon/VideoConfig.cpp b/Source/Core/VideoCommon/VideoConfig.cpp index 6aadfbf075..ef04dc8287 100644 --- a/Source/Core/VideoCommon/VideoConfig.cpp +++ b/Source/Core/VideoCommon/VideoConfig.cpp @@ -96,6 +96,16 @@ void VideoConfig::Load(const std::string& ini_file) enhancements->Get("StereoConvergence", &iStereoConvergence, 20); enhancements->Get("StereoSwapEyes", &bStereoSwapEyes, false); + //currently these settings are not saved in global config, so we could've initialized them directly + for (int i = 0; i < oStereoPresets.size(); ++i) + { + enhancements->Get(StringFromFormat("StereoConvergence_%d", i), &oStereoPresets[i].depth, iStereoConvergence); + enhancements->Get(StringFromFormat("StereoDepth_%d", i), &oStereoPresets[i].convergence, iStereoDepth); + } + enhancements->Get("StereoActivePreset", &iStereoActivePreset, 0); + iStereoConvergence = oStereoPresets[iStereoActivePreset].convergence; + iStereoDepth = oStereoPresets[iStereoActivePreset].depth; + IniFile::Section* hacks = iniFile.GetOrCreateSection("Hacks"); hacks->Get("EFBAccessEnable", &bEFBAccessEnable, true); hacks->Get("BBoxEnable", &bBBoxEnable, false); @@ -200,6 +210,17 @@ void VideoConfig::GameIniLoad() CHECK_SETTING("Video_Enhancements", "StereoConvergence", iStereoConvergence); CHECK_SETTING("Video_Enhancements", "StereoSwapEyes", bStereoSwapEyes); + //these are not overrides, they are per-game settings, hence no warning + IniFile::Section* enhancements = iniFile.GetOrCreateSection("Enhancements"); + for (int i = 0; i < oStereoPresets.size(); ++i) + { + enhancements->Get(StringFromFormat("StereoConvergence_%d", i), &oStereoPresets[i].depth, iStereoConvergence); + enhancements->Get(StringFromFormat("StereoDepth_%d", i), &oStereoPresets[i].convergence, iStereoDepth); + } + enhancements->Get("StereoActivePreset", &iStereoActivePreset, 0); + iStereoConvergence = oStereoPresets[iStereoActivePreset].convergence; + iStereoDepth = oStereoPresets[iStereoActivePreset].depth; + CHECK_SETTING("Video_Stereoscopy", "StereoEFBMonoDepth", bStereoEFBMonoDepth); CHECK_SETTING("Video_Stereoscopy", "StereoDepthPercentage", iStereoDepthPercentage); CHECK_SETTING("Video_Stereoscopy", "StereoConvergenceMinimum", iStereoConvergenceMinimum); diff --git a/Source/Core/VideoCommon/VideoConfig.h b/Source/Core/VideoCommon/VideoConfig.h index 489929f5fd..3955e1fb2f 100644 --- a/Source/Core/VideoCommon/VideoConfig.h +++ b/Source/Core/VideoCommon/VideoConfig.h @@ -51,6 +51,14 @@ enum StereoMode STEREO_3DVISION }; +constexpr int STEREOSCOPY_PRESETS_NUM = 3; + +struct StereoscopyPreset final +{ + int depth; + int convergence; +}; + // NEVER inherit from this class. struct VideoConfig final { @@ -84,6 +92,8 @@ struct VideoConfig final int iStereoDepth; int iStereoConvergence; bool bStereoSwapEyes; + std::array oStereoPresets; + int iStereoActivePreset; // Information bool bShowFPS;