diff --git a/src/Cafe/GameProfile/GameProfile.h b/src/Cafe/GameProfile/GameProfile.h index 2742e339..1f5164d1 100644 --- a/src/Cafe/GameProfile/GameProfile.h +++ b/src/Cafe/GameProfile/GameProfile.h @@ -9,8 +9,6 @@ struct gameProfileIntegerOption_t class GameProfile { - friend class GameProfileWindow; - public: static const uint32 kThreadQuantumDefault = 45000; @@ -25,23 +23,36 @@ public: [[nodiscard]] const std::optional& GetGameName() const { return m_gameName; } [[nodiscard]] const std::optional& ShouldLoadSharedLibraries() const { return m_loadSharedLibraries; } + void SetShouldLoadSharedLibraries(bool shouldLoadSharedLibraries) { m_loadSharedLibraries = shouldLoadSharedLibraries; } [[nodiscard]] bool StartWithGamepadView() const { return m_startWithPadView; } + void SetStartWithGamepadView(bool startWithPadView) { m_startWithPadView = startWithPadView; } [[nodiscard]] const std::optional& GetGraphicsAPI() const { return m_graphics_api; } + void SetGraphicsAPI(GraphicAPI graphicApi) { m_graphics_api = graphicApi; } + void ClearGraphicsAPI() { m_graphics_api.reset(); } [[nodiscard]] const AccurateShaderMulOption& GetAccurateShaderMul() const { return m_accurateShaderMul; } + void SetAccurateShaderMul(AccurateShaderMulOption accurateShaderMulOption) { m_accurateShaderMul = accurateShaderMulOption; } #ifdef ENABLE_METAL [[nodiscard]] bool GetShaderFastMath() const { return m_shaderFastMath; } + void SetShaderFastMath(bool shaderFastMath) { m_shaderFastMath = shaderFastMath; } [[nodiscard]] MetalBufferCacheMode GetBufferCacheMode() const { return m_metalBufferCacheMode; } + void SetBufferCacheMode(MetalBufferCacheMode metalBufferCacheMode) { m_metalBufferCacheMode = metalBufferCacheMode; } [[nodiscard]] PositionInvariance GetPositionInvariance() const { return m_positionInvariance; } + void SetPositionInvariance(PositionInvariance positionInvariance) { m_positionInvariance = positionInvariance; } #endif [[nodiscard]] const std::optional& GetPrecompiledShadersState() const { return m_precompiledShaders; } [[nodiscard]] uint32 GetThreadQuantum() const { return m_threadQuantum; } + void SetThreadQuantum(uint32 threadQuantum){ m_threadQuantum = threadQuantum; } [[nodiscard]] const std::optional& GetCPUMode() const { return m_cpuMode; } + void SetCPUMode(CPUMode cpuMode) { m_cpuMode = cpuMode; } [[nodiscard]] bool IsAudioDisabled() const { return m_disableAudio; } - [[nodiscard]] const std::array< std::optional, 8>& GetControllerProfile() const { return m_controllerProfile; } + [[nodiscard]] const std::array< std::optional, 8>& GetControllerProfiles() const { return m_controllerProfile; } + [[nodiscard]] const std::optional& GetControllerProfile(size_t controllerIndex) const { return m_controllerProfile[controllerIndex]; } + void SetControllerProfile(size_t controllerIndex, const std::string& profileName) { m_controllerProfile[controllerIndex] = profileName; } + void ResetControllerProfile(size_t controllerIndex) { m_controllerProfile[controllerIndex].reset(); } #if BOOST_PLAT_ANDROID struct DriverSetting diff --git a/src/gui/wxgui/GameProfileWindow.cpp b/src/gui/wxgui/GameProfileWindow.cpp index 5962133e..e74c578f 100644 --- a/src/gui/wxgui/GameProfileWindow.cpp +++ b/src/gui/wxgui/GameProfileWindow.cpp @@ -270,16 +270,16 @@ void GameProfileWindow::SetProfileInt(gameProfileIntegerOption_t& option, wxChec void GameProfileWindow::ApplyProfile() { - if(m_game_profile.m_gameName) - this->SetTitle(_("Edit game profile") + " - " + m_game_profile.m_gameName.value()); + if (auto gameName = m_game_profile.GetGameName()) + this->SetTitle(_("Edit game profile") + " - " + gameName.value()); // general - m_load_libs->SetValue(m_game_profile.m_loadSharedLibraries.value()); - m_start_with_padview->SetValue(m_game_profile.m_startWithPadView); + m_load_libs->SetValue(m_game_profile.ShouldLoadSharedLibraries().value_or(false)); + m_start_with_padview->SetValue(m_game_profile.StartWithGamepadView()); // cpu // wxString cpu_modes[] = { _("Singlecore-Interpreter"), _("Singlecore-Recompiler"), _("Triplecore-Recompiler"), _("Auto (recommended)") }; - switch(m_game_profile.m_cpuMode.value()) + switch(m_game_profile.GetCPUMode().value_or(CPUMode::MulticoreRecompiler)) { case CPUMode::SinglecoreInterpreter: m_cpu_mode->SetSelection(0); break; case CPUMode::SinglecoreRecompiler: m_cpu_mode->SetSelection(1); break; @@ -288,18 +288,18 @@ void GameProfileWindow::ApplyProfile() default: m_cpu_mode->SetSelection(3); } - m_thread_quantum->SetStringSelection(fmt::format("{}", m_game_profile.m_threadQuantum)); + m_thread_quantum->SetStringSelection(fmt::format("{}", m_game_profile.GetThreadQuantum())); // gpu - if (!m_game_profile.m_graphics_api.has_value()) - m_graphic_api->SetSelection(0); // selecting "" + if (auto graphicsApi = m_game_profile.GetGraphicsAPI()) + m_graphic_api->SetSelection(1 + graphicsApi.value()); // "", OpenGL, Vulkan, Metal else - m_graphic_api->SetSelection(1 + m_game_profile.m_graphics_api.value()); // "", OpenGL, Vulkan, Metal - m_shader_mul_accuracy->SetSelection((int)m_game_profile.m_accurateShaderMul); + m_graphic_api->SetSelection(0); // selecting "" + m_shader_mul_accuracy->SetSelection((int)m_game_profile.GetAccurateShaderMul()); #ifdef ENABLE_METAL - m_shader_fast_math->SetSelection((int)m_game_profile.m_shaderFastMath); - m_metal_buffer_cache_mode->SetSelection((int)m_game_profile.m_metalBufferCacheMode); - m_position_invariance->SetSelection((int)m_game_profile.m_positionInvariance); + m_shader_fast_math->SetSelection((int)m_game_profile.GetShaderFastMath()); + m_metal_buffer_cache_mode->SetSelection((int)m_game_profile.GetBufferCacheMode()); + m_position_invariance->SetSelection((int)m_game_profile.GetPositionInvariance()); #endif //// audio @@ -319,15 +319,15 @@ void GameProfileWindow::ApplyProfile() for (int i = 0; i < InputManager::kMaxController; ++i) { - const bool has_value = m_game_profile.m_controllerProfile[i].has_value(); - if (has_value) + if (auto controllerProfile = m_game_profile.GetControllerProfile(i)) { - const auto& v = m_game_profile.m_controllerProfile[i].value(); + const auto& v = controllerProfile.value(); m_controller_profile[i]->SetStringSelection(wxString::FromUTF8(v)); } - else + { m_controller_profile[i]->SetSelection(wxNOT_FOUND); + } } } @@ -336,57 +336,60 @@ void GameProfileWindow::SaveProfile() // update game profile struct m_game_profile.Reset(); // general - m_game_profile.m_loadSharedLibraries = m_load_libs->GetValue(); - m_game_profile.m_startWithPadView = m_start_with_padview->GetValue(); + m_game_profile.SetShouldLoadSharedLibraries(m_load_libs->GetValue()); + m_game_profile.SetStartWithGamepadView(m_start_with_padview->GetValue()); // cpu - switch(m_cpu_mode->GetSelection()) + CPUMode cpuMode; + switch (m_cpu_mode->GetSelection()) { - case 0: m_game_profile.m_cpuMode = CPUMode::SinglecoreInterpreter; break; - case 1: m_game_profile.m_cpuMode = CPUMode::SinglecoreRecompiler; break; - case 2: m_game_profile.m_cpuMode = CPUMode::MulticoreRecompiler; break; + case 0: cpuMode = CPUMode::SinglecoreInterpreter; break; + case 1: cpuMode = CPUMode::SinglecoreRecompiler; break; + case 2: cpuMode = CPUMode::MulticoreRecompiler; break; default: - m_game_profile.m_cpuMode = CPUMode::Auto; + cpuMode = CPUMode::Auto; } + m_game_profile.SetCPUMode(cpuMode); const wxString thread_quantum = m_thread_quantum->GetStringSelection(); if (!thread_quantum.empty()) { - m_game_profile.m_threadQuantum = ConvertString(thread_quantum.ToStdString()); - m_game_profile.m_threadQuantum = std::min(m_game_profile.m_threadQuantum, 536870912); - m_game_profile.m_threadQuantum = std::max(m_game_profile.m_threadQuantum, 5000); + auto threadQuantum = ConvertString(thread_quantum.ToStdString()); + threadQuantum = std::clamp(5000u, 536870912u, threadQuantum); + m_game_profile.SetThreadQuantum(threadQuantum); } // gpu - m_game_profile.m_accurateShaderMul = (AccurateShaderMulOption)m_shader_mul_accuracy->GetSelection(); - if (m_game_profile.m_accurateShaderMul != AccurateShaderMulOption::False && m_game_profile.m_accurateShaderMul != AccurateShaderMulOption::True) - m_game_profile.m_accurateShaderMul = AccurateShaderMulOption::True; // force a legal value + auto accurateShaderMul = (AccurateShaderMulOption)m_shader_mul_accuracy->GetSelection(); + if (accurateShaderMul != AccurateShaderMulOption::False && accurateShaderMul != AccurateShaderMulOption::True) + accurateShaderMul = AccurateShaderMulOption::True; // force a legal value + m_game_profile.SetAccurateShaderMul(accurateShaderMul); #ifdef ENABLE_METAL - m_game_profile.m_shaderFastMath = (bool)m_shader_fast_math->GetSelection(); - m_game_profile.m_metalBufferCacheMode = (MetalBufferCacheMode)m_metal_buffer_cache_mode->GetSelection(); - m_game_profile.m_positionInvariance = (PositionInvariance)m_position_invariance->GetSelection(); + m_game_profile.SetShaderFastMath((bool)m_shader_fast_math->GetSelection()); + m_game_profile.SetBufferCacheMode((MetalBufferCacheMode)m_metal_buffer_cache_mode->GetSelection()); + m_game_profile.SetPositionInvariance((PositionInvariance)m_position_invariance->GetSelection()); #endif if (m_graphic_api->GetSelection() == 0) - m_game_profile.m_graphics_api = {}; + m_game_profile.ClearGraphicsAPI(); else - m_game_profile.m_graphics_api = (GraphicAPI)(m_graphic_api->GetSelection() - 1); // "", OpenGL, Vulkan, Metal + m_game_profile.SetGraphicsAPI((GraphicAPI)(m_graphic_api->GetSelection() - 1)); // "", OpenGL, Vulkan, Metal // controller for (int i = 0; i < 8; ++i) { if(m_controller_profile[i]->GetSelection() == wxNOT_FOUND) { - m_game_profile.m_controllerProfile[i].reset(); + m_game_profile.ResetControllerProfile(i); continue; } const wxString profile_name = m_controller_profile[i]->GetStringSelection(); if (profile_name.empty()) - m_game_profile.m_controllerProfile[i].reset(); + m_game_profile.ResetControllerProfile(i); else - m_game_profile.m_controllerProfile[i] = profile_name.ToUTF8(); + m_game_profile.SetControllerProfile(i, profile_name.utf8_string()); } // update game profile file diff --git a/src/input/InputManager.cpp b/src/input/InputManager.cpp index 44973d8d..0df6b5dd 100644 --- a/src/input/InputManager.cpp +++ b/src/input/InputManager.cpp @@ -761,7 +761,7 @@ ControllerProviderPtr InputManager::get_api_provider(InputAPI::Type api, const C void InputManager::apply_game_profile() { - const auto& profiles = g_current_game_profile->GetControllerProfile(); + const auto& profiles = g_current_game_profile->GetControllerProfiles(); for (int i = 0; i < kMaxController; ++i) { if (profiles[i] && !profiles[i]->empty())