From 8f2d8565199a9a60360ce428f00ecda255998952 Mon Sep 17 00:00:00 2001 From: Garrett Cox Date: Mon, 29 Apr 2024 18:52:20 -0500 Subject: [PATCH] Add ability to configure motion blur (#266) --- mm/2s2h/BenGui/BenMenuBar.cpp | 6 +++ mm/2s2h/Enhancements/Graphics/MotionBlur.cpp | 39 ++++++++++++++++++++ mm/2s2h/Enhancements/Graphics/MotionBlur.h | 19 ++++++++++ mm/src/code/z_play.c | 3 ++ 4 files changed, 67 insertions(+) create mode 100644 mm/2s2h/Enhancements/Graphics/MotionBlur.cpp create mode 100644 mm/2s2h/Enhancements/Graphics/MotionBlur.h diff --git a/mm/2s2h/BenGui/BenMenuBar.cpp b/mm/2s2h/BenGui/BenMenuBar.cpp index 1337b7380..802532a69 100644 --- a/mm/2s2h/BenGui/BenMenuBar.cpp +++ b/mm/2s2h/BenGui/BenMenuBar.cpp @@ -7,6 +7,7 @@ #include #include #include "2s2h/Enhancements/Enhancements.h" +#include "2s2h/Enhancements/Graphics/MotionBlur.h" #include "2s2h/DeveloperTools/DeveloperTools.h" #include "HudEditor.h" @@ -296,6 +297,11 @@ void DrawEnhancementsMenu() { ImGui::EndMenu(); } + + if (UIWidgets::BeginMenu("Graphics")) { + MotionBlur_RenderMenuOptions(); + ImGui::EndMenu(); + } UIWidgets::CVarCheckbox("Fast Text", "gEnhancements.TimeSavers.FastText", { .tooltip = "Speeds up text rendering, and enables holding of B progress to next message" diff --git a/mm/2s2h/Enhancements/Graphics/MotionBlur.cpp b/mm/2s2h/Enhancements/Graphics/MotionBlur.cpp new file mode 100644 index 000000000..47aa7b1d0 --- /dev/null +++ b/mm/2s2h/Enhancements/Graphics/MotionBlur.cpp @@ -0,0 +1,39 @@ +#include "MotionBlur.h" +#include + +#include "2s2h/BenGui/UIWidgets.hpp" + +extern "C" { +#include "z64.h" +} + +const char* motionBlurOptions[] = { "Dynamic (default)", "Always Off", "Always On" }; + +void MotionBlur_RenderMenuOptions() { + ImGui::SeparatorText("Motion Blur"); + UIWidgets::CVarCombobox("Motion Blur Mode", "gEnhancements.Graphics.MotionBlur.Mode", motionBlurOptions, { + .labelPosition = UIWidgets::LabelPosition::None, + }); + if (CVarGetInteger("gEnhancements.Graphics.MotionBlur.Mode", 0) == 0) { + UIWidgets::Checkbox("On/Off", (bool*)&R_MOTION_BLUR_ENABLED); + if (R_MOTION_BLUR_ENABLED) { + int32_t motionBlurStrength = R_MOTION_BLUR_ALPHA; + if (UIWidgets::SliderInt("Strength", &motionBlurStrength, 0, 255)) { + R_MOTION_BLUR_ALPHA = motionBlurStrength; + } + } + } + if (CVarGetInteger("gEnhancements.Graphics.MotionBlur.Mode", 0) == 2) { + UIWidgets::CVarSliderInt("Strength", "gEnhancements.Graphics.MotionBlur.Strength", 0, 255, 180); + } +} + +extern "C" void MotionBlur_Override(u8* status, s32* alpha) { + if (CVarGetInteger("gEnhancements.Graphics.MotionBlur.Mode", 0) == 1) { + *status = 0; + *alpha = 0; + } else if (CVarGetInteger("gEnhancements.Graphics.MotionBlur.Mode", 0) == 2) { + if (*status == 0) *status = 2; + *alpha = CVarGetInteger("gEnhancements.Graphics.MotionBlur.Strength", 180); + } +} diff --git a/mm/2s2h/Enhancements/Graphics/MotionBlur.h b/mm/2s2h/Enhancements/Graphics/MotionBlur.h new file mode 100644 index 000000000..f17441bd5 --- /dev/null +++ b/mm/2s2h/Enhancements/Graphics/MotionBlur.h @@ -0,0 +1,19 @@ +#ifndef MOTION_BLUR_H +#define MOTION_BLUR_H + +void MotionBlur_RenderMenuOptions(); + +#ifdef __cplusplus +#include + +extern "C" { +#endif + + +void MotionBlur_Override(u8* status, s32* alpha); + +#ifdef __cplusplus +}; +#endif + +#endif // MOTION_BLUR_H diff --git a/mm/src/code/z_play.c b/mm/src/code/z_play.c index b627a5b33..cb2d28f70 100644 --- a/mm/src/code/z_play.c +++ b/mm/src/code/z_play.c @@ -36,6 +36,7 @@ u8 sMotionBlurStatus; #include "debug.h" #include "2s2h/Enhancements/GameInteractor/GameInteractor.h" #include "2s2h/Enhancements/FrameInterpolation/FrameInterpolation.h" +#include "2s2h/Enhancements/Graphics/MotionBlur.h" #include "2s2h/DeveloperTools/CollisionViewer.h" #include "2s2h/framebuffer_effects.h" #include @@ -85,6 +86,8 @@ void Play_DrawMotionBlur(PlayState* this) { sMotionBlurStatus = MOTION_BLUR_OFF; } + MotionBlur_Override(&sMotionBlurStatus, &alpha); + if (sMotionBlurStatus != MOTION_BLUR_OFF) { OPEN_DISPS(gfxCtx);