diff --git a/include/banjo_config.h b/include/banjo_config.h index 8ff60e1..911235c 100644 --- a/include/banjo_config.h +++ b/include/banjo_config.h @@ -24,6 +24,10 @@ namespace banjo { namespace sound { inline const std::string bgm_volume = "bgm_volume"; } + + namespace graphics { + inline const std::string cutscene_aspect_ratio_mode = "cutscene_aspect_ratio_mode"; + } } // TODO: Move loading configs to the runtime once we have a way to allow per-project customization. @@ -70,6 +74,15 @@ namespace banjo { NoteSavingMode get_note_saving_mode(); + enum class CutsceneAspectRatioMode { + Original, + Clamp16x9, + Full, + OptionCount + }; + + CutsceneAspectRatioMode get_cutscene_aspect_ratio_mode(); + void open_quit_game_prompt(); }; diff --git a/src/game/config.cpp b/src/game/config.cpp index 8cb0a3f..c030ec1 100644 --- a/src/game/config.cpp +++ b/src/game/config.cpp @@ -117,6 +117,11 @@ banjo::AnalogCamMode banjo::get_analog_cam_mode() { return get_general_config_enum_value(banjo::configkeys::general::analog_cam_mode); } +template +T get_graphics_config_enum_value(const std::string& option_id) { + return static_cast(std::get(recompui::config::get_graphics_config().get_option_value(option_id))); +} + static void add_sound_options(recomp::config::Config &config) { config.add_percent_number_option( banjo::configkeys::sound::bgm_volume, @@ -134,6 +139,26 @@ int banjo::get_bgm_volume() { return get_sound_config_number_value(banjo::configkeys::sound::bgm_volume); } +static void add_graphics_options(recomp::config::Config &config) { + using EnumOptionVector = const std::vector; + static EnumOptionVector cutscene_aspect_ratio_mode_options = { + {banjo::CutsceneAspectRatioMode::Original, "Original", "Original"}, + {banjo::CutsceneAspectRatioMode::Clamp16x9, "Clamp16x9", "16:9"}, + {banjo::CutsceneAspectRatioMode::Full, "Expand", "Expand"}, + }; + config.add_enum_option( + banjo::configkeys::graphics::cutscene_aspect_ratio_mode, + "Cutscene Aspect Ratio", + "Sets the aspect ratio limit for cutscenes. Cutscenes have been adjusted to work in 16:9, which is the default option. Wider aspect ratios may show details that weren't meant to be on-screen.", + cutscene_aspect_ratio_mode_options, + banjo::CutsceneAspectRatioMode::Clamp16x9 + ); +} + + banjo::CutsceneAspectRatioMode banjo::get_cutscene_aspect_ratio_mode() { + return get_graphics_config_enum_value(banjo::configkeys::graphics::cutscene_aspect_ratio_mode); + } + void banjo::init_config() { std::filesystem::path recomp_dir = recompui::file::get_app_folder_path(); @@ -150,6 +175,7 @@ void banjo::init_config() { add_general_options(general_config); auto &graphics_config = recompui::config::create_graphics_tab(); + add_graphics_options(graphics_config); recompui::config::create_controls_tab(); diff --git a/src/game/recomp_api.cpp b/src/game/recomp_api.cpp index 34a01b4..27e1164 100644 --- a/src/game/recomp_api.cpp +++ b/src/game/recomp_api.cpp @@ -104,8 +104,22 @@ extern "C" void recomp_get_target_aspect_ratio(uint8_t* rdram, recomp_context* c } extern "C" void recomp_get_cutscene_aspect_ratio(uint8_t *rdram, recomp_context *ctx) { - float ar = 16.0f / 9.0f; - _return(ctx, ar); + float original = _arg<0, float>(rdram, ctx); + int width, height; + recompui::get_window_size(width, height); + + switch (banjo::get_cutscene_aspect_ratio_mode()) { + case banjo::CutsceneAspectRatioMode::Original: + _return(ctx, original); + return; + case banjo::CutsceneAspectRatioMode::Clamp16x9: + default: + _return(ctx, 16.0f / 9.0f); + return; + case banjo::CutsceneAspectRatioMode::Full: + _return(ctx, std::max(static_cast(width) / height, original)); + return; + } } extern "C" void recomp_get_bgm_volume(uint8_t* rdram, recomp_context* ctx) {