From 7612e386419ef913bda5a62a5c8f234190542bb0 Mon Sep 17 00:00:00 2001 From: Ariel A <24759293+aarant@users.noreply.github.com> Date: Sun, 26 Jan 2025 20:52:50 -0500 Subject: [PATCH] fix: improved FadeScreenHardware during fade-in --- src/palette.c | 41 +++++++++++++++++++++++++++++------------ src/scrcmd.c | 2 ++ 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/palette.c b/src/palette.c index 303e6ced42..59fbdcfab4 100644 --- a/src/palette.c +++ b/src/palette.c @@ -2,8 +2,10 @@ #include "palette.h" #include "util.h" #include "decompress.h" +#include "field_weather.h" #include "gpu_regs.h" #include "task.h" +#include "constants/field_weather.h" #include "constants/rgb.h" enum @@ -967,25 +969,41 @@ static void UpdateBlendRegisters(void) { SetGpuReg(REG_OFFSET_BLDCNT, (u16)gPaletteFade_blendCnt); SetGpuReg(REG_OFFSET_BLDY, gPaletteFade.y); - // If fade-out, also adjust BLDALPHA and DISPCNT - if (!gPaletteFade.yDec /*&& gPaletteFade.mode == HARDWARE_FADE*/) { + // if TGT2 enabled, also adjust BLDALPHA and DISPCNT + if (((u16)gPaletteFade_blendCnt) & BLDCNT_TGT2_ALL) { u16 bldAlpha = GetGpuReg(REG_OFFSET_BLDALPHA); u8 tgt1 = BLDALPHA_TGT1(bldAlpha); u8 tgt2 = BLDALPHA_TGT2(bldAlpha); - u8 bldFade; + u8 mode = (gPaletteFade_blendCnt & BLDCNT_EFFECT_EFF_MASK) == BLDCNT_EFFECT_LIGHTEN ? FADE_FROM_WHITE : FADE_FROM_BLACK; + if (!gPaletteFade.yDec) + mode++; - switch (gPaletteFade_blendCnt & BLDCNT_EFFECT_EFF_MASK) + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK); + + switch (mode) { - // FADE_TO_BLACK - case BLDCNT_EFFECT_DARKEN: - bldFade = BLDALPHA_TGT1(max(0, 16 - gPaletteFade.y)); + case FADE_FROM_BLACK: + // increment each target until reaching weather's values SetGpuReg( REG_OFFSET_BLDALPHA, - BLDALPHA_BLEND(min(tgt1, bldFade), min(tgt2, bldFade)) + BLDALPHA_BLEND( + min(++tgt1, gWeatherPtr->currBlendEVA), + min(++tgt2, gWeatherPtr->currBlendEVB) + ) ); break; - // FADE_TO_WHITE - case BLDCNT_EFFECT_LIGHTEN: + case FADE_TO_BLACK: + bldAlpha = BLDALPHA_TGT1(max(0, 16 - gPaletteFade.y)); + SetGpuReg( + REG_OFFSET_BLDALPHA, + BLDALPHA_BLEND(min(tgt1, bldAlpha), min(tgt2, bldAlpha)) + ); + break; + // Not handled; blend sprites will pop in, + // but the effect coming from white looks okay + // case FADE_FROM_WHITE: + // break; + case FADE_TO_WHITE: SetGpuReg( REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(min(++tgt1, 31), min(++tgt2, 31)) @@ -996,8 +1014,7 @@ static void UpdateBlendRegisters(void) SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK); break; } - } else - ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK); + } if (gPaletteFade.hardwareFadeFinishing) { diff --git a/src/scrcmd.c b/src/scrcmd.c index edca8dbbbe..b6f15b2fbe 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -663,6 +663,8 @@ bool8 ScrCmd_fadescreenswapbuffers(struct ScriptContext *ctx) switch (mode) { case FADE_FROM_BLACK: + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0)); + break; case FADE_FROM_WHITE: // Restore last weather blend before fading in, // since BLDALPHA was modified by fade-out