diff --git a/UnleashedRecomp/gpu/video.cpp b/UnleashedRecomp/gpu/video.cpp index a9edd0b..35817f5 100644 --- a/UnleashedRecomp/gpu/video.cpp +++ b/UnleashedRecomp/gpu/video.cpp @@ -3052,6 +3052,24 @@ void Video::ComputeViewportDimensions() break; } + + case EAspectRatio::Custom: + { + float customAspectRatio = Config::CustomAspectRatio; + + if (aspectRatio > customAspectRatio) + { + s_viewportWidth = height * customAspectRatio; + s_viewportHeight = height; + } + else + { + s_viewportWidth = width; + s_viewportHeight = width * (1. / customAspectRatio); + } + + break; + } default: s_viewportWidth = width; diff --git a/UnleashedRecomp/locale/config_locale.cpp b/UnleashedRecomp/locale/config_locale.cpp index 1242e4e..ea25adc 100644 --- a/UnleashedRecomp/locale/config_locale.cpp +++ b/UnleashedRecomp/locale/config_locale.cpp @@ -546,7 +546,8 @@ CONFIG_DEFINE_ENUM_LOCALE(EAspectRatio) { EAspectRatio::Auto, { "AUTO", "Auto: the aspect ratio will dynamically adjust to the window size." } }, { EAspectRatio::Wide, { "16:9", "16:9: locks the game to a widescreen aspect ratio." } }, { EAspectRatio::Narrow, { "4:3", "4:3: locks the game to a narrow aspect ratio." } }, - { EAspectRatio::OriginalNarrow, { "ORIGINAL 4:3", "Original 4:3: locks the game to a narrow aspect ratio and retains parity with the game's original implementation." } } + { EAspectRatio::OriginalNarrow, { "ORIGINAL 4:3", "Original 4:3: locks the game to a narrow aspect ratio and retains parity with the game's original implementation." } }, + { EAspectRatio::Custom, { "Custom", "Custom:\nThe aspect ratio is set by using the CustomAspectRatio value in the config.toml file." } } } }, { @@ -564,7 +565,8 @@ CONFIG_DEFINE_ENUM_LOCALE(EAspectRatio) { EAspectRatio::Auto, { "AUTO", "Auto: Das Seitenverhältnis passt sich automatisch der Fenstergröße an." } }, { EAspectRatio::Wide, { "16:9", "16:9: Stellt das Spiel in einem Breitbildschirm-Format dar." } }, { EAspectRatio::Narrow, { "4:3", "4:3: Stellt das Spiel in einem Mittel-Format dar." } }, - { EAspectRatio::OriginalNarrow, { "ORIGINAL 4:3", "Original 4:3: Stellt das Spiel in einem Mittel-Format dar, was der ursprünglichen Implementation originalgetreut bleibt." } } + { EAspectRatio::OriginalNarrow, { "ORIGINAL 4:3", "Original 4:3: Stellt das Spiel in einem Mittel-Format dar, was der ursprünglichen Implementation originalgetreut bleibt." } }, + { EAspectRatio::Custom, { "Benutzerdefiniert", "Benutzerdefiniert:\nDas Seitenverhältnis entspricht dem Wert CustomAspectRatio in der Datei config.toml." } } } }, { diff --git a/UnleashedRecomp/user/config.cpp b/UnleashedRecomp/user/config.cpp index bd622b7..104e173 100644 --- a/UnleashedRecomp/user/config.cpp +++ b/UnleashedRecomp/user/config.cpp @@ -322,6 +322,7 @@ CONFIG_DEFINE_ENUM_TEMPLATE(EAspectRatio) { "16:9", EAspectRatio::Wide }, { "4:3", EAspectRatio::Narrow }, { "Original 4:3", EAspectRatio::OriginalNarrow }, + { "Custom", EAspectRatio::Custom }, }; CONFIG_DEFINE_ENUM_TEMPLATE(ETripleBuffering) diff --git a/UnleashedRecomp/user/config.h b/UnleashedRecomp/user/config.h index 9e87d12..25cb1c7 100644 --- a/UnleashedRecomp/user/config.h +++ b/UnleashedRecomp/user/config.h @@ -85,7 +85,8 @@ enum class EAspectRatio : uint32_t Auto, Wide, Narrow, - OriginalNarrow + OriginalNarrow, + Custom }; enum class ETripleBuffering : uint32_t diff --git a/UnleashedRecomp/user/config_def.h b/UnleashedRecomp/user/config_def.h index 80eb29c..948080f 100644 --- a/UnleashedRecomp/user/config_def.h +++ b/UnleashedRecomp/user/config_def.h @@ -56,6 +56,7 @@ CONFIG_DEFINE("Video", int32_t, WindowHeight, 720); CONFIG_DEFINE_ENUM("Video", EWindowState, WindowState, EWindowState::Normal); CONFIG_DEFINE_LOCALISED("Video", int32_t, Monitor, 0); CONFIG_DEFINE_ENUM_LOCALISED("Video", EAspectRatio, AspectRatio, EAspectRatio::Auto); +CONFIG_DEFINE("Video", float, CustomAspectRatio, (16.0f / 9.0f)); CONFIG_DEFINE_LOCALISED("Video", float, ResolutionScale, 1.0f); CONFIG_DEFINE_LOCALISED("Video", bool, Fullscreen, true); CONFIG_DEFINE_LOCALISED("Video", bool, VSync, true);