diff --git a/pcsx2/gui/AppConfig.cpp b/pcsx2/gui/AppConfig.cpp index 4453e7d8f9..7d5eb74def 100644 --- a/pcsx2/gui/AppConfig.cpp +++ b/pcsx2/gui/AppConfig.cpp @@ -378,6 +378,9 @@ AppConfig::AppConfig() EnableSpeedHacks = false; EnableGameFixes = false; + EnablePresets = false; + PresetIndex = 0; + CdvdSource = CDVDsrc_Iso; // To be moved to FileMemoryCard pluign (someday) @@ -480,6 +483,9 @@ void AppConfig::LoadSaveRootItems( IniInterface& ini ) IniEntry( EnableSpeedHacks ); IniEntry( EnableGameFixes ); + + IniEntry( EnablePresets ); + IniEntry( PresetIndex ); #ifdef __WXMSW__ IniEntry( McdCompressNTFS ); @@ -507,7 +513,12 @@ void AppConfig::LoadSave( IniInterface& ini ) EmuOptions.LoadSave( ini ); if( ini.IsLoading() ) + { EmuOptions.GS.LimitScalar = Framerate.NominalScalar; + if (EnablePresets){ + IsOkApplyPreset(PresetIndex); + } + } ini.Flush(); } @@ -713,6 +724,94 @@ void AppConfig::FramerateOptions::LoadSave( IniInterface& ini ) IniEntry( SkipOnTurbo ); } +int AppConfig::GeMaxPresetIndex() +{ + return 5; +} + +bool AppConfig::IsOkApplyPreset(int n) +{ + if (n < 0 || n > GeMaxPresetIndex() ) + { + Console.WriteLn("Warning: ApplyPreset(%d): index too big, Aborting.", n); + return false; + } + + Console.WriteLn("Applying Preset %d ...", n); + + AppConfig default_AppConfig; + Pcsx2Config default_Pcsx2Config; + + Pcsx2Config original_Pcsx2Config = EmuOptions; + EmuOptions = default_Pcsx2Config; //reset EmuOptions. + + //restore the original Pcsx2Config settings which we don't want to override with the application default dettings. + //The ugly part of this is that while most panels are entirely disabled from manual tweaking when a preset is used, + // the options that are not overriden by presets need to be manually excluded from disabling. + // So the Gui panels need to have intimate knowledge of this exclusion list. Bahh.. + EmuOptions.EnableCheats = original_Pcsx2Config.EnableCheats; + EmuOptions.GS.FrameLimitEnable = original_Pcsx2Config.GS.FrameLimitEnable; + EmuOptions.BackupSavestate = original_Pcsx2Config.BackupSavestate; + + //Make sure these options are forced as a base even if in the future they default to other values. + //Also, as with the exclusions list, the gui needs to know what sections are affected by presets + // such that it can disable them from manual tweaking when a preset is used. This includes most panels BTW. + EnableSpeedHacks =false; + EnableGameFixes =false; + EmuOptions.EnablePatches =true; + + //Note that AppConfig was not reset, so if we need some default options for it, we need to set them. + this->Framerate = default_AppConfig.Framerate; + + //Actual application of current preset. + //The presets themselves probably need some voodoo tuning to be reasonably useful. + + bool vuUsed=false, eeUsed=false, hacksUsed=false;//used to prevent application of specific lower preset values on fallthrough. + switch (n){ //currently implemented such that any preset also applies all lower presets, with few exceptions. + + case 5 : //Set VU cycle steal to 2 clicks (maximum-1) + vuUsed?0:(vuUsed=true, EmuOptions.Speedhacks.VUCycleSteal = 2); + + case 4 : //set EE cyclerate to 2 clicks (maximum) + eeUsed?0:(eeUsed=true, EmuOptions.Speedhacks.EECycleRate = 2); + + case 3 : //Set VU cycle steal to 1 click, enable (m)vuBlockHack, set clamp mode to 'none' for both EE/VU + vuUsed?0:(vuUsed=true, EmuOptions.Speedhacks.VUCycleSteal = 1); + EmuOptions.Speedhacks.vuBlockHack=true; + EmuOptions.Cpu.Recompiler.fpuOverflow= + EmuOptions.Cpu.Recompiler.fpuExtraOverflow= + EmuOptions.Cpu.Recompiler.fpuFullMode= + EmuOptions.Cpu.Recompiler.vuOverflow= + EmuOptions.Cpu.Recompiler.vuExtraOverflow= + EmuOptions.Cpu.Recompiler.vuSignOverflow=false; //Clamp mode to 'none' for both EE and VU + + //best balanced hacks combo? + case 2 : //enable EE timing hack, set EE cyclerate to 1 click, enable mvu flag hack + eeUsed?0:(eeUsed=true, EmuOptions.Speedhacks.EECycleRate = 1); + EnableGameFixes=true; + EmuOptions.Gamefixes.EETimingHack=true; + hacksUsed?0:(hacksUsed=true, EmuOptions.Speedhacks.vuFlagHack=true); + + case 1 : //Apply recommended speed hacks (which are individually "ckecked" by default) without mvu flag hack. + EnableSpeedHacks = true; + hacksUsed?0:(hacksUsed=true, EmuOptions.Speedhacks.vuFlagHack=false); + + case 0 : //default application config. + untick all individual speed hacks to make it visually clear none is used. + hacksUsed?0:(hacksUsed=true, EmuOptions.Speedhacks.bitset=0); + + + break; + default: Console.WriteLn("Developer Warning: Preset #%d is not implemented. (--> Using application default).", n); + } + + + EnablePresets=true; + PresetIndex=n; + + return true; +} + + wxFileConfig* OpenFileConfig( const wxString& filename ) { return new wxFileConfig( wxEmptyString, wxEmptyString, filename, wxEmptyString, wxCONFIG_USE_RELATIVE_PATH ); diff --git a/pcsx2/gui/AppConfig.h b/pcsx2/gui/AppConfig.h index af54483714..405001523f 100644 --- a/pcsx2/gui/AppConfig.h +++ b/pcsx2/gui/AppConfig.h @@ -231,6 +231,16 @@ public: bool EnableSpeedHacks; bool EnableGameFixes; + // Presets try to prevent users from overwhelming when they want to change settings (usually to make a game run faster). + // The presets allow to modify the balance between emulation accuracy and emulation speed using a pseudo-linear control. + // It's pseudo since there's no way to arrange groups of all of pcsx2's settings such that each next group makes it slighty faster and slightly less compatiible for all games. + //However, By carefully selecting these preset config groups, it's hopefully possible to achieve this goal for a reasonable percentage (hopefully above 50%) of the games. + //when presets are enabled, the user has practically no control over the emulation settings, and can only choose the preset to use. + + // The next 2 vars enable/disable presets alltogether, and select/reflect current preset, respectively. + bool EnablePresets; + int PresetIndex; + wxString CurrentIso; wxString CurrentELF; CDVD_SourceType CdvdSource; @@ -265,6 +275,10 @@ public: void LoadSave( IniInterface& ini ); void LoadSaveRootItems( IniInterface& ini ); void LoadSaveMemcards( IniInterface& ini ); + + static int GeMaxPresetIndex(); + bool IsOkApplyPreset(int n); + }; extern void AppLoadSettings(); diff --git a/pcsx2/gui/Dialogs/BaseConfigurationDialog.cpp b/pcsx2/gui/Dialogs/BaseConfigurationDialog.cpp index f2c08be743..8377d0d9b0 100644 --- a/pcsx2/gui/Dialogs/BaseConfigurationDialog.cpp +++ b/pcsx2/gui/Dialogs/BaseConfigurationDialog.cpp @@ -138,7 +138,7 @@ void Dialogs::BaseConfigurationDialog::AddOkCancel( wxSizer* sizer ) wxBitmapButton& screenshotButton( *new wxBitmapButton( this, wxID_SAVE, EmbeddedImage().Get() ) ); screenshotButton.SetToolTip( _("Saves a snapshot of this settings panel to a PNG file.") ); - *m_extraButtonSizer += screenshotButton; + *m_extraButtonSizer += screenshotButton|pxMiddle; } Dialogs::BaseConfigurationDialog::~BaseConfigurationDialog() throw() diff --git a/pcsx2/gui/Dialogs/ConfigurationDialog.h b/pcsx2/gui/Dialogs/ConfigurationDialog.h index a04c0678b7..28fc217f9c 100644 --- a/pcsx2/gui/Dialogs/ConfigurationDialog.h +++ b/pcsx2/gui/Dialogs/ConfigurationDialog.h @@ -87,6 +87,14 @@ namespace Dialogs protected: virtual wxString& GetConfSettingsTabName() const { return g_Conf->SysSettingsTabName; } + + pxCheckBox* m_check_presets; + wxSlider* m_slider_presets; + pxStaticText* m_msg_preset; + void AddPresetsControl(); + void Preset_Scroll(wxScrollEvent &event); + void Presets_Toggled(wxCommandEvent &event); + }; // -------------------------------------------------------------------------------------- diff --git a/pcsx2/gui/Dialogs/SysConfigDialog.cpp b/pcsx2/gui/Dialogs/SysConfigDialog.cpp index 2e7dd1afc2..b00d18ebd1 100644 --- a/pcsx2/gui/Dialogs/SysConfigDialog.cpp +++ b/pcsx2/gui/Dialogs/SysConfigDialog.cpp @@ -65,6 +65,102 @@ static void CheckPluginsOverrides() pxIssueConfirmation( dialog, MsgButtons().OK(), L"Dialog.ComponentsConfig.Overrides" ); } +bool isOkGetPresetTextAndColor(int n, wxString& label, wxColor& c){ + switch(n){ + case 0: label=pxE("!Panel:", L"1 - Safest"); c=wxColor(L"Forest GREEN"); break; + case 1: label=pxE("!Panel:", L"2 - Safe (faster)"); c=wxColor(L"Dark Green"); break; + case 2: label=pxE("!Panel:", L"3 - Balanced"); c=wxColor(L"Blue");break; + case 3: label=pxE("!Panel:", L"4 - Aggressive"); c=wxColor(L"Purple"); break; + case 4: label=pxE("!Panel:", L"5 - Aggressive plus"); c=wxColor(L"Orange"); break; + case 5: label=pxE("!Panel:", L"6 - Mostly Harmful"); c=wxColor(L"Red");break; + default: return false; + } + return true; +} + + +void Dialogs::SysConfigDialog::AddPresetsControl() +{ + m_slider_presets = new wxSlider( this, wxID_ANY, g_Conf->PresetIndex, 0, AppConfig::GeMaxPresetIndex(), + wxDefaultPosition, wxDefaultSize, wxHORIZONTAL /*| wxSL_AUTOTICKS | wxSL_LABELS */); + + m_slider_presets->SetToolTip( + pxE( "!Notice:Tooltip", + L"The Presets apply speed hacks, some recompiler options and some game fixes known to boost speed.\n" + L"Known important game fixes ('Patches') will be applied automatically.\n\n" + L"Presets info:\n" + L"1 - The most accurate emulation but also the slowest.\n" + L"3 --> Tries to balance speed with compatibility.\n" + L"4 - Some more aggressive hacks.\n" + L"6 - Too many hacks which will probably slow down most games.\n" + ) + ); + m_slider_presets->Enable(g_Conf->EnablePresets); + + m_check_presets = new pxCheckBox( this, pxE("!Panel:", L"Preset:"), 0); + m_check_presets->SetToolTip( + pxE( "!Notice:Tooltip", + L"The Presets apply speed hacks, some recompiler options and some game fixes known to boost speed.\n" + L"Known important game fixes ('Patches') will be applied automatically.\n\n" + L"--> Uncheck to modify settings manually (with current preset as base)" + ) + ); + m_check_presets->SetValue(g_Conf->EnablePresets); + + wxString l; wxColor c(wxColour( L"Red" )); + isOkGetPresetTextAndColor(g_Conf->PresetIndex, l, c); + m_msg_preset = new pxStaticText(this, l, wxALIGN_LEFT); + m_msg_preset->Enable(g_Conf->EnablePresets); + m_msg_preset->SetForegroundColour( c ); + m_msg_preset->Bold(); + + //I'm unable to do without the next 2 rows.. what am I missing? + m_msg_preset->SetMinWidth(150); + m_msg_preset->Unwrapped(); + + + *m_extraButtonSizer += 20; + *m_extraButtonSizer += *m_check_presets | pxMiddle; + *m_extraButtonSizer += *m_slider_presets | pxMiddle; + *m_extraButtonSizer += 5; + *m_extraButtonSizer += *m_msg_preset | pxMiddle; + + Connect( m_slider_presets->GetId(), wxEVT_SCROLL_THUMBTRACK, wxScrollEventHandler( Dialogs::SysConfigDialog::Preset_Scroll ) ); + Connect( m_slider_presets->GetId(), wxEVT_SCROLL_CHANGED, wxScrollEventHandler( Dialogs::SysConfigDialog::Preset_Scroll ) ); + Connect( m_check_presets->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( Dialogs::SysConfigDialog::Presets_Toggled ) ); +} + +void Dialogs::SysConfigDialog::Presets_Toggled(wxCommandEvent &event) +{ + g_Conf->EnablePresets = m_check_presets->IsChecked(); + m_slider_presets->Enable(g_Conf->EnablePresets); + m_msg_preset->Enable(g_Conf->EnablePresets); + + if (g_Conf->EnablePresets) + g_Conf->IsOkApplyPreset(g_Conf->PresetIndex); + + sApp.DispatchEvent( AppStatus_SettingsApplied ); + event.Skip(); +} + + +void Dialogs::SysConfigDialog::Preset_Scroll(wxScrollEvent &event) +{ + if (m_slider_presets->GetValue() == g_Conf->PresetIndex) + return; + + wxString pl; + wxColor c; + isOkGetPresetTextAndColor(m_slider_presets->GetValue(), pl, c); + m_msg_preset->SetLabel(pl); + m_msg_preset->SetForegroundColour( c ); + + g_Conf->IsOkApplyPreset(m_slider_presets->GetValue()); + + sApp.DispatchEvent( AppStatus_SettingsApplied ); + event.Skip(); +} + Dialogs::SysConfigDialog::SysConfigDialog(wxWindow* parent) : BaseConfigurationDialog( parent, AddAppName(_("Emulation Settings - %s")), 580 ) { @@ -82,6 +178,7 @@ Dialogs::SysConfigDialog::SysConfigDialog(wxWindow* parent) AddListbook(); AddOkCancel(); + AddPresetsControl(); if( wxGetApp().Overrides.HasCustomHacks() ) wxGetApp().PostMethod( CheckHacksOverrides ); diff --git a/pcsx2/gui/Panels/CpuPanel.cpp b/pcsx2/gui/Panels/CpuPanel.cpp index 56d682f021..811b6e2d1b 100644 --- a/pcsx2/gui/Panels/CpuPanel.cpp +++ b/pcsx2/gui/Panels/CpuPanel.cpp @@ -174,7 +174,7 @@ Panels::CpuPanelEE::CpuPanelEE( wxWindow* parent ) *this += new AdvancedOptionsFPU( this ) | StdExpand(); *this += 12; - *this += new wxButton( this, wxID_DEFAULT, _("Restore Defaults") ) | StdButton(); + *this += new wxButton( this, wxID_DEFAULT, _("Restore Defaults")) | StdButton(); Connect( wxID_DEFAULT, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CpuPanelEE::OnRestoreDefaults ) ); } @@ -245,6 +245,11 @@ void Panels::CpuPanelEE::AppStatusEvent_OnSettingsApplied() const Pcsx2Config::RecompilerOptions& recOps( g_Conf->EmuOptions.Cpu.Recompiler ); m_panel_RecEE->SetSelection( (int)recOps.EnableEE ); m_panel_RecIOP->SetSelection( (int)recOps.EnableIOP ); + + m_panel_RecEE->Enable(!g_Conf->EnablePresets); + m_panel_RecIOP->Enable(!g_Conf->EnablePresets); + + this->Enable(!g_Conf->EnablePresets); } void Panels::CpuPanelEE::OnRestoreDefaults(wxCommandEvent &evt) @@ -290,6 +295,10 @@ void Panels::CpuPanelVU::AppStatusEvent_OnSettingsApplied() m_panel_VU1->SetSelection( recOps.EnableVU1 ? 1 : 0 ); else m_panel_VU1->SetSelection( recOps.EnableVU1 ? 2 : 0 ); + + this->Enable(!g_Conf->EnablePresets); + m_panel_VU0->Enable(!g_Conf->EnablePresets); + m_panel_VU1->Enable(!g_Conf->EnablePresets); } void Panels::CpuPanelVU::OnRestoreDefaults(wxCommandEvent &evt) @@ -341,6 +350,8 @@ void Panels::AdvancedOptionsFPU::AppStatusEvent_OnSettingsApplied() else if( recOps.fpuExtraOverflow ) m_ClampModePanel->SetSelection( 2 ); else if( recOps.fpuOverflow ) m_ClampModePanel->SetSelection( 1 ); else m_ClampModePanel->SetSelection( 0 ); + + this->Enable(!g_Conf->EnablePresets); } void Panels::AdvancedOptionsVU::Apply() @@ -374,5 +385,7 @@ void Panels::AdvancedOptionsVU::AppStatusEvent_OnSettingsApplied() else if( recOps.vuExtraOverflow ) m_ClampModePanel->SetSelection( 2 ); else if( recOps.vuOverflow ) m_ClampModePanel->SetSelection( 1 ); else m_ClampModePanel->SetSelection( 0 ); + + this->Enable(!g_Conf->EnablePresets); } diff --git a/pcsx2/gui/Panels/GSWindowPanel.cpp b/pcsx2/gui/Panels/GSWindowPanel.cpp index 4f0080b7b5..3d3c3962ef 100644 --- a/pcsx2/gui/Panels/GSWindowPanel.cpp +++ b/pcsx2/gui/Panels/GSWindowPanel.cpp @@ -123,6 +123,8 @@ void Panels::GSWindowSettingsPanel::AppStatusEvent_OnSettingsApplied() m_text_WindowWidth ->SetValue( wxsFormat( L"%d", conf.WindowSize.GetWidth() ) ); m_text_WindowHeight ->SetValue( wxsFormat( L"%d", conf.WindowSize.GetHeight() ) ); + + m_check_VsyncEnable->Enable(!g_Conf->EnablePresets); } void Panels::GSWindowSettingsPanel::Apply() diff --git a/pcsx2/gui/Panels/GameFixesPanel.cpp b/pcsx2/gui/Panels/GameFixesPanel.cpp index ac14e3014b..ab5ef757bb 100644 --- a/pcsx2/gui/Panels/GameFixesPanel.cpp +++ b/pcsx2/gui/Panels/GameFixesPanel.cpp @@ -127,7 +127,7 @@ void Panels::GameFixesPanel::Apply() void Panels::GameFixesPanel::EnableStuff() { for (GamefixId i=GamefixId_FIRST; i < pxEnumEnd; ++i) - m_checkbox[i]->Enable(m_check_Enable->GetValue()); + m_checkbox[i]->Enable(m_check_Enable->GetValue() && !g_Conf->EnablePresets); } void Panels::GameFixesPanel::OnEnable_Toggled( wxCommandEvent& evt ) @@ -140,5 +140,10 @@ void Panels::GameFixesPanel::AppStatusEvent_OnSettingsApplied() { const Pcsx2Config::GamefixOptions& opts( g_Conf->EmuOptions.Gamefixes ); for (GamefixId i=GamefixId_FIRST; i < pxEnumEnd; ++i) - m_checkbox[i]->SetValue( opts.Get((GamefixId)i) ); + m_checkbox[i]->SetValue( opts.Get((GamefixId)i) );//apply the use/don't-use fix values + + m_check_Enable->SetValue( g_Conf->EnableGameFixes );//main gamefixes checkbox + EnableStuff();// enable/disable the all the fixes controls according to the main one + + this->Enable(!g_Conf->EnablePresets); } diff --git a/pcsx2/gui/Panels/SpeedhacksPanel.cpp b/pcsx2/gui/Panels/SpeedhacksPanel.cpp index 58ab05f015..321658c6f8 100644 --- a/pcsx2/gui/Panels/SpeedhacksPanel.cpp +++ b/pcsx2/gui/Panels/SpeedhacksPanel.cpp @@ -268,8 +268,8 @@ Panels::SpeedHacksPanel::SpeedHacksPanel( wxWindow* parent ) Connect( wxEVT_SCROLL_TOP, wxScrollEventHandler( SpeedHacksPanel::Slider_Click ) ); Connect( wxEVT_SCROLL_BOTTOM, wxScrollEventHandler( SpeedHacksPanel::Slider_Click ) ); - Connect( m_slider_eecycle->GetId(), wxEVT_SCROLL_CHANGED, wxScrollEventHandler( SpeedHacksPanel::EECycleRate_Scroll ) ); - Connect( m_slider_vustealer->GetId(), wxEVT_SCROLL_CHANGED, wxScrollEventHandler( SpeedHacksPanel::VUCycleRate_Scroll ) ); + Connect( m_slider_eecycle->GetId(), wxEVT_SCROLL_THUMBTRACK, wxScrollEventHandler( SpeedHacksPanel::EECycleRate_Scroll ) ); + Connect( m_slider_vustealer->GetId(), wxEVT_SCROLL_THUMBTRACK, wxScrollEventHandler( SpeedHacksPanel::VUCycleRate_Scroll ) ); Connect( m_check_Enable->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( SpeedHacksPanel::OnEnable_Toggled ) ); Connect( wxID_DEFAULT, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SpeedHacksPanel::Defaults_Click ) ); } @@ -283,7 +283,7 @@ void Panels::SpeedHacksPanel::EnableStuff() while( it != end ) { - (*it)->GetWindow()->Enable( m_check_Enable->GetValue() ); + (*it)->GetWindow()->Enable( m_check_Enable->GetValue() && !g_Conf->EnablePresets); ++it; } } @@ -316,6 +316,7 @@ void Panels::SpeedHacksPanel::AppStatusEvent_OnSettingsApplied( const Pcsx2Confi // Layout necessary to ensure changed slider text gets re-aligned properly Layout(); + this->Enable(!g_Conf->EnablePresets); } void Panels::SpeedHacksPanel::Apply() diff --git a/pcsx2/gui/Panels/VideoPanel.cpp b/pcsx2/gui/Panels/VideoPanel.cpp index ab340f161c..4930b048c7 100644 --- a/pcsx2/gui/Panels/VideoPanel.cpp +++ b/pcsx2/gui/Panels/VideoPanel.cpp @@ -125,6 +125,12 @@ void Panels::FramelimiterPanel::AppStatusEvent_OnSettingsApplied() m_text_BaseNtsc ->SetValue( gsconf.FramerateNTSC.ToString() ); m_text_BasePal ->SetValue( gsconf.FrameratePAL.ToString() ); + + m_spin_NominalPct->Enable(!g_Conf->EnablePresets); + m_spin_TurboPct->Enable(!g_Conf->EnablePresets); + m_spin_SlomoPct->Enable(!g_Conf->EnablePresets); + m_text_BaseNtsc->Enable(!g_Conf->EnablePresets); + m_text_BasePal->Enable(!g_Conf->EnablePresets); } void Panels::FramelimiterPanel::Apply() @@ -247,6 +253,8 @@ void Panels::FrameSkipPanel::AppStatusEvent_OnSettingsApplied() m_spin_FramesToDraw ->SetValue( gsconf.FramesToDraw ); m_spin_FramesToSkip ->SetValue( gsconf.FramesToSkip ); + + this->Enable(!g_Conf->EnablePresets); } void Panels::FrameSkipPanel::Apply() @@ -352,4 +360,7 @@ void Panels::VideoPanel::AppStatusEvent_OnSettingsApplied() { m_check_SynchronousGS->SetValue( g_Conf->EmuOptions.GS.SynchronousMTGS ); m_check_DisableOutput->SetValue( g_Conf->EmuOptions.GS.DisableOutput ); + + m_check_SynchronousGS->Enable(!g_Conf->EnablePresets); + m_check_DisableOutput->Enable(!g_Conf->EnablePresets); }