From 0ab5b41c4b2a3dc01ec04a5a72d8ba4374ad2581 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Mon, 30 Dec 2024 01:33:07 -0600 Subject: [PATCH] misc: Move dirty hack related stuff into a separate viewmodel, only show slider when translation delay is enabled. --- .../UI/ViewModels/SettingsHacksViewModel.cs | 77 +++++++++++++++++++ .../UI/ViewModels/SettingsViewModel.cs | 75 +++--------------- .../UI/Views/Settings/SettingsHacksView.axaml | 15 ++-- .../Views/Settings/SettingsHacksView.axaml.cs | 4 - .../UI/Windows/SettingsWindow.axaml.cs | 2 +- .../ConfigurationState.Migration.cs | 4 +- .../Configuration/ConfigurationState.Model.cs | 16 ++-- 7 files changed, 108 insertions(+), 85 deletions(-) create mode 100644 src/Ryujinx/UI/ViewModels/SettingsHacksViewModel.cs diff --git a/src/Ryujinx/UI/ViewModels/SettingsHacksViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsHacksViewModel.cs new file mode 100644 index 000000000..b93cdd6dc --- /dev/null +++ b/src/Ryujinx/UI/ViewModels/SettingsHacksViewModel.cs @@ -0,0 +1,77 @@ +using Gommon; +using Ryujinx.Ava.Utilities.Configuration; + +namespace Ryujinx.Ava.UI.ViewModels +{ + public class SettingsHacksViewModel : BaseModel + { + private readonly SettingsViewModel _baseViewModel; + + public SettingsHacksViewModel() {} + + public SettingsHacksViewModel(SettingsViewModel settingsVm) + { + _baseViewModel = settingsVm; + } + + private bool _xc2MenuSoftlockFix = ConfigurationState.Instance.Hacks.Xc2MenuSoftlockFix; + private bool _shaderTranslationThreadSleep = ConfigurationState.Instance.Hacks.EnableShaderTranslationDelay; + private int _shaderTranslationSleepDelay = ConfigurationState.Instance.Hacks.ShaderTranslationDelay; + + public bool Xc2MenuSoftlockFixEnabled + { + get => _xc2MenuSoftlockFix; + set + { + _xc2MenuSoftlockFix = value; + + OnPropertyChanged(); + } + } + + public bool ShaderTranslationDelayEnabled + { + get => _shaderTranslationThreadSleep; + set + { + _shaderTranslationThreadSleep = value; + + OnPropertyChanged(); + } + } + + public string ShaderTranslationDelayTooltipText => $"Current value: {ShaderTranslationDelay}"; + + public int ShaderTranslationDelay + { + get => _shaderTranslationSleepDelay; + set + { + _shaderTranslationSleepDelay = value; + + OnPropertiesChanged(nameof(ShaderTranslationDelay), nameof(ShaderTranslationDelayTooltipText)); + } + } + + public static string Xc2MenuFixTooltip { get; } = Lambda.String(sb => + { + sb.AppendLine( + "This fix applies a 2ms delay (via 'Thread.Sleep(2)') every time the game tries to read data from the emulated Switch filesystem.") + .AppendLine(); + + sb.AppendLine("From the issue on GitHub:").AppendLine(); + sb.Append( + "When clicking very fast from game main menu to 2nd submenu, " + + "there is a low chance that the game will softlock, " + + "the submenu won't show up, while background music is still there."); + }); + + public static string ShaderTranslationDelayTooltip { get; } = Lambda.String(sb => + { + sb.AppendLine("This hack applies the delay you specify every time shaders are attempted to be translated.") + .AppendLine(); + + sb.Append("Configurable via slider, only when this option is enabled."); + }); + } +} diff --git a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs index 8126b3c7d..a5bdd2f88 100644 --- a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs @@ -65,9 +65,7 @@ namespace Ryujinx.Ava.UI.ViewModels private string _ldnPassphrase; private string _ldnServer; - private bool _xc2MenuSoftlockFix = ConfigurationState.Instance.Hacks.Xc2MenuSoftlockFix; - private bool _shaderTranslationThreadSleep = ConfigurationState.Instance.Hacks.EnableShaderCompilationThreadSleep; - private int _shaderTranslationSleepDelay = ConfigurationState.Instance.Hacks.ShaderCompilationThreadSleepDelay; + public SettingsHacksViewModel DirtyHacks { get; } public int ResolutionScale { @@ -279,41 +277,6 @@ namespace Ryujinx.Ava.UI.ViewModels } } - public bool Xc2MenuSoftlockFixEnabled - { - get => _xc2MenuSoftlockFix; - set - { - _xc2MenuSoftlockFix = value; - - OnPropertyChanged(); - } - } - - public bool ShaderTranslationDelayEnabled - { - get => _shaderTranslationThreadSleep; - set - { - _shaderTranslationThreadSleep = value; - - OnPropertyChanged(); - } - } - - public string ShaderTranslationDelayTooltipText => $"Current value: {ShaderTranslationDelay}"; - - public int ShaderTranslationDelay - { - get => _shaderTranslationSleepDelay; - set - { - _shaderTranslationSleepDelay = value; - - OnPropertiesChanged(nameof(ShaderTranslationDelay), nameof(ShaderTranslationDelayTooltipText)); - } - } - public int Language { get; set; } public int Region { get; set; } public int FsGlobalAccessLogMode { get; set; } @@ -426,9 +389,12 @@ namespace Ryujinx.Ava.UI.ViewModels { _virtualFileSystem = virtualFileSystem; _contentManager = contentManager; + if (Program.PreviewerDetached) { Task.Run(LoadTimeZones); + + DirtyHacks = new SettingsHacksViewModel(this); } } @@ -448,6 +414,8 @@ namespace Ryujinx.Ava.UI.ViewModels { Task.Run(LoadAvailableGpus); LoadCurrentConfiguration(); + + DirtyHacks = new SettingsHacksViewModel(this); } } @@ -662,9 +630,9 @@ namespace Ryujinx.Ava.UI.ViewModels OpenglDebugLevel = (int)config.Logger.GraphicsDebugLevel.Value; MultiplayerModeIndex = (int)config.Multiplayer.Mode.Value; - DisableP2P = config.Multiplayer.DisableP2p.Value; - LdnPassphrase = config.Multiplayer.LdnPassphrase.Value; - LdnServer = config.Multiplayer.LdnServer.Value; + DisableP2P = config.Multiplayer.DisableP2p; + LdnPassphrase = config.Multiplayer.LdnPassphrase; + LdnServer = config.Multiplayer.LdnServer; } public void SaveSettings() @@ -788,9 +756,9 @@ namespace Ryujinx.Ava.UI.ViewModels config.Multiplayer.LdnServer.Value = LdnServer; // Dirty Hacks - config.Hacks.Xc2MenuSoftlockFix.Value = Xc2MenuSoftlockFixEnabled; - config.Hacks.EnableShaderCompilationThreadSleep.Value = ShaderTranslationDelayEnabled; - config.Hacks.ShaderCompilationThreadSleepDelay.Value = ShaderTranslationDelay; + config.Hacks.Xc2MenuSoftlockFix.Value = DirtyHacks.Xc2MenuSoftlockFixEnabled; + config.Hacks.EnableShaderTranslationDelay.Value = DirtyHacks.ShaderTranslationDelayEnabled; + config.Hacks.ShaderTranslationDelay.Value = DirtyHacks.ShaderTranslationDelay; config.ToFileFormat().SaveConfig(Program.ConfigurationPath); @@ -824,24 +792,5 @@ namespace Ryujinx.Ava.UI.ViewModels RevertIfNotSaved(); CloseWindow?.Invoke(); } - - public static string Xc2MenuFixTooltip { get; } = Lambda.String(sb => - { - sb.AppendLine( - "This fix applies a 2ms delay (via 'Thread.Sleep(2)') every time the game tries to read data from the emulated Switch filesystem.") - .AppendLine(); - - sb.AppendLine("From the issue on GitHub:").AppendLine(); - sb.Append( - "When clicking very fast from game main menu to 2nd submenu, " + - "there is a low chance that the game will softlock, " + - "the submenu won't show up, while background music is still there."); - }); - - public static string ShaderTranslationDelayTooltip { get; } = Lambda.String(sb => - { - sb.Append( - "This hack applies the delay you specify every time shaders are attempted to be translated."); - }); } } diff --git a/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml index b597706df..087112368 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml @@ -34,10 +34,10 @@ Margin="0,10,0,0" Orientation="Horizontal" HorizontalAlignment="Center" - ToolTip.Tip="{Binding Xc2MenuFixTooltip}"> + ToolTip.Tip="{Binding DirtyHacks.Xc2MenuFixTooltip}"> + IsChecked="{Binding DirtyHacks.Xc2MenuSoftlockFixEnabled}"/> @@ -47,16 +47,17 @@ Margin="0,10,0,0" Orientation="Horizontal" HorizontalAlignment="Center" - ToolTip.Tip="{Binding ShaderTranslationDelayTooltip}"> + ToolTip.Tip="{Binding DirtyHacks.ShaderTranslationDelayTooltip}"> + IsChecked="{Binding DirtyHacks.ShaderTranslationDelayEnabled}"/> - it.Hack == DirtyHacks.ShaderCompilationThreadSleep); - Hacks.EnableShaderCompilationThreadSleep.Value = shaderCompilationThreadSleep != null; - Hacks.ShaderCompilationThreadSleepDelay.Value = shaderCompilationThreadSleep?.Value ?? 0; + Hacks.EnableShaderTranslationDelay.Value = shaderCompilationThreadSleep != null; + Hacks.ShaderTranslationDelay.Value = shaderCompilationThreadSleep?.Value ?? 0; } if (configurationFileUpdated) diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs b/src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs index ef3d565da..2a91bf65b 100644 --- a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs +++ b/src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs @@ -629,18 +629,18 @@ namespace Ryujinx.Ava.Utilities.Configuration public ReactiveObject Xc2MenuSoftlockFix { get; private set; } - public ReactiveObject EnableShaderCompilationThreadSleep { get; private set; } + public ReactiveObject EnableShaderTranslationDelay { get; private set; } - public ReactiveObject ShaderCompilationThreadSleepDelay { get; private set; } + public ReactiveObject ShaderTranslationDelay { get; private set; } public HacksSection() { ShowDirtyHacks = new ReactiveObject(); Xc2MenuSoftlockFix = new ReactiveObject(); Xc2MenuSoftlockFix.Event += HackChanged; - EnableShaderCompilationThreadSleep = new ReactiveObject(); - EnableShaderCompilationThreadSleep.Event += HackChanged; - ShaderCompilationThreadSleepDelay = new ReactiveObject(); + EnableShaderTranslationDelay = new ReactiveObject(); + EnableShaderTranslationDelay.Event += HackChanged; + ShaderTranslationDelay = new ReactiveObject(); } private void HackChanged(object sender, ReactiveEventArgs rxe) @@ -651,7 +651,7 @@ namespace Ryujinx.Ava.Utilities.Configuration if (newHacks != _lastHackCollection) { RyuLogger.Info?.Print(LogClass.Configuration, - $"EnabledDirtyHacks set to: [{_lastHackCollection}]", "LogValueChange"); + $"EnabledDirtyHacks set to: [{newHacks}]", "LogValueChange"); _lastHackCollection = newHacks; } @@ -668,8 +668,8 @@ namespace Ryujinx.Ava.Utilities.Configuration if (Xc2MenuSoftlockFix) Apply(DirtyHacks.Xc2MenuSoftlockFix); - if (EnableShaderCompilationThreadSleep) - Apply(DirtyHacks.ShaderCompilationThreadSleep, ShaderCompilationThreadSleepDelay); + if (EnableShaderTranslationDelay) + Apply(DirtyHacks.ShaderCompilationThreadSleep, ShaderTranslationDelay); return enabledHacks.ToArray();