From d481a23c49d1e79dd8545326309e8bd9ca844f07 Mon Sep 17 00:00:00 2001 From: Irastris Date: Sun, 12 Apr 2026 13:56:00 -0400 Subject: [PATCH] Frame interp: Refactor JUTFader Now works regardless of interpolation being on/off --- .../include/JSystem/JUtility/JUTFader.h | 1 + libs/JSystem/src/JFramework/JFWDisplay.cpp | 23 ++++++++----------- libs/JSystem/src/JUtility/JUTFader.cpp | 7 ++++-- src/m_Do/m_Do_graphic.cpp | 4 +++- 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/libs/JSystem/include/JSystem/JUtility/JUTFader.h b/libs/JSystem/include/JSystem/JUtility/JUTFader.h index e68c648442..6c98a6840f 100644 --- a/libs/JSystem/include/JSystem/JUtility/JUTFader.h +++ b/libs/JSystem/include/JSystem/JUtility/JUTFader.h @@ -16,6 +16,7 @@ public: }; JUTFader(int, int, int, int, JUtility::TColor); + void advance(); void control(); void setStatus(JUTFader::EStatus, int); diff --git a/libs/JSystem/src/JFramework/JFWDisplay.cpp b/libs/JSystem/src/JFramework/JFWDisplay.cpp index d3e7abf0a1..ce4c870064 100644 --- a/libs/JSystem/src/JFramework/JFWDisplay.cpp +++ b/libs/JSystem/src/JFramework/JFWDisplay.cpp @@ -224,20 +224,17 @@ void JFWDisplay::endGX() { if (mFader != NULL) { ortho.setPort(); #ifdef TARGET_PC - if (dusk::getSettings().game.enableFrameInterpolation) { - u32 advance_count = 1; - if (s_faderSimSteps >= 0) { - advance_count = static_cast(s_faderSimSteps); - s_faderSimSteps = -1; - } - for (u32 i = 0; i < advance_count; i++) { - mFader->control(); - } - if (mFader->getStatus() != 1) { - mFader->draw(); - } + u32 advance_count = 1; + if (dusk::getSettings().game.enableFrameInterpolation && s_faderSimSteps >= 0) { + advance_count = static_cast(s_faderSimSteps); + s_faderSimSteps = -1; } else { - mFader->control(); + s_faderSimSteps = -1; + } + for (u32 i = 0; i < advance_count; i++) { + mFader->advance(); + } + if (mFader->getStatus() != 1) { mFader->draw(); } #else diff --git a/libs/JSystem/src/JUtility/JUTFader.cpp b/libs/JSystem/src/JUtility/JUTFader.cpp index 1848e92787..f7fa963e63 100644 --- a/libs/JSystem/src/JUtility/JUTFader.cpp +++ b/libs/JSystem/src/JUtility/JUTFader.cpp @@ -17,7 +17,7 @@ JUTFader::JUTFader(int x, int y, int width, int height, JUtility::TColor pColor) mEStatus = UNKSTATUS_M1; } -void JUTFader::control() { +void JUTFader::advance() { if (0 <= mEStatus && mEStatus-- == 0) { mStatus = field_0x24; } @@ -59,9 +59,12 @@ void JUTFader::control() { break; } +} +void JUTFader::control() { + advance(); #ifndef TARGET_PC - // Frame interpolation: draw call moved to JFWDisplay + // FRAME INTERP NOTE: Draw is called by JFWDisplay when interpolation is active draw(); #endif } diff --git a/src/m_Do/m_Do_graphic.cpp b/src/m_Do/m_Do_graphic.cpp index ff9e2042a0..e14cd37b5c 100644 --- a/src/m_Do/m_Do_graphic.cpp +++ b/src/m_Do/m_Do_graphic.cpp @@ -2419,7 +2419,9 @@ int mDoGph_Painter() { #if TARGET_PC dusk::g_imguiConsole.PostDraw(); - JFWDisplay::getManager()->setFaderSimSteps(pending_ui_ticks); + if (dusk::getSettings().game.enableFrameInterpolation) { + JFWDisplay::getManager()->setFaderSimSteps(pending_ui_ticks); + } #endif mDoGph_gInf_c::endRender();