fading between subtitles

This commit is contained in:
westonCoder 2023-10-10 11:01:55 -05:00
parent b46a5f8772
commit 285ace8630
4 changed files with 57 additions and 16 deletions

View file

@ -510,22 +510,30 @@ void controlsRenderPrompt(enum ControllerAction action, char* message, float opa
gSPDisplayList(renderState->dl++, ui_material_revert_list[BUTTON_ICONS_INDEX]);
}
void controlsRenderSubtitle(char* message, float opacity, struct RenderState* renderState) {
void controlsRenderSubtitle(char* message, float textOpacity, float backgroundOpacity, struct RenderState* renderState) {
struct Vector2s16 size = fontMeasure(&gDejaVuSansFont, message);
int opacityAsInt = (int)(255 * opacity);
int textOpacityAsInt = (int)(255 * textOpacity);
if (opacityAsInt > 255) {
opacityAsInt = 255;
} else if (opacityAsInt < 0) {
opacityAsInt = 0;
if (textOpacityAsInt > 255) {
textOpacityAsInt = 255;
} else if (textOpacityAsInt < 0) {
textOpacityAsInt = 0;
}
int backgroundOpacityAsInt = (int)(255 * backgroundOpacity);
if (backgroundOpacityAsInt > 255) {
backgroundOpacityAsInt = 255;
} else if (backgroundOpacityAsInt < 0) {
backgroundOpacityAsInt = 0;
}
int textPositionX = (SUBTITLE_SIDE_MARGIN + SUBTITLE_PADDING);
int textPositionY = (SCREEN_HT - SUBTITLE_BOTTOM_MARGIN - SUBTITLE_PADDING) - size.y;
gSPDisplayList(renderState->dl++, ui_material_list[SOLID_TRANSPARENT_OVERLAY_INDEX]);
gDPSetEnvColor(renderState->dl++, 0, 0, 0, opacityAsInt / 2);
gDPSetEnvColor(renderState->dl++, 0, 0, 0, backgroundOpacityAsInt);
gDPFillRectangle(
renderState->dl++,
textPositionX - CONTROL_PROMPT_PADDING,
@ -536,7 +544,7 @@ void controlsRenderSubtitle(char* message, float opacity, struct RenderState* re
gSPDisplayList(renderState->dl++, ui_material_revert_list[SOLID_TRANSPARENT_OVERLAY_INDEX]);
gSPDisplayList(renderState->dl++, ui_material_list[DEJAVU_SANS_INDEX]);
gDPSetEnvColor(renderState->dl++, 255, 140, 155, opacityAsInt);
gDPSetEnvColor(renderState->dl++, 255, 140, 155, textOpacityAsInt);
renderState->dl = fontRender(
&gDejaVuSansFont,
message,

View file

@ -42,6 +42,6 @@ enum MenuDirection controlsMenuUpdate(struct ControlsMenu* controlsMenu);
void controlsMenuRender(struct ControlsMenu* controlsMenu, struct RenderState* renderState, struct GraphicsTask* task);
void controlsRenderPrompt(enum ControllerAction action, char* message, float opacity, struct RenderState* renderState);
void controlsRenderSubtitle(char* message, float opacity, struct RenderState* renderState);
void controlsRenderSubtitle(char* message, float textOpacity, float backgroundOpacity, struct RenderState* renderState);
#endif

View file

@ -38,6 +38,8 @@ void hudInit(struct Hud* hud) {
hud->promptType = CutscenePromptTypeNone;
hud->promptOpacity = 0.0f;
hud->subtitleOpacity = 0.0f;
hud->backgroundOpacity = 0.0f;
hud->subtitleFadeTime = 0.75;
hud->chosenLanguage = gSaveData.controls.subtitleLanguage;
hud->flags = 0;
hud->resolvedPrompts = 0;
@ -63,14 +65,25 @@ void hudUpdate(struct Hud* hud) {
hud->chosenLanguage = gSaveData.controls.subtitleLanguage;
float targetPromptOpacity = (hud->flags & HudFlagsShowingPrompt) ? 1.0 : 0.0f;
float targetSubtitleOpacity = (hud->flags & HudFlagsShowingSubtitle) ? 0.85: 0.0f;
float targetSubtitleOpacity = ((hud->flags & HudFlagsShowingSubtitle) && !(hud->flags & HudFlagsSubtitleQueued)) ? 0.85: 0.0f;
float targetBackgroundOpacity = (hud->flags & HudFlagsShowingSubtitle && !(hud->flags & HudFlagsSubtitleQueued)) ? 0.45: 0.0f;
if (targetPromptOpacity != hud->promptOpacity) {
hud->promptOpacity = mathfMoveTowards(hud->promptOpacity, targetPromptOpacity, FIXED_DELTA_TIME / PROMPT_FADE_TIME);
}
if (targetSubtitleOpacity != hud->subtitleOpacity) {
hud->subtitleOpacity = mathfMoveTowards(hud->subtitleOpacity, targetSubtitleOpacity, FIXED_DELTA_TIME / SUBTITLE_FADE_TIME);
hud->subtitleOpacity = mathfMoveTowards(hud->subtitleOpacity, targetSubtitleOpacity, FIXED_DELTA_TIME / hud->subtitleFadeTime);
}
if ((hud->subtitleOpacity == 0.0f) && (hud->flags & HudFlagsSubtitleQueued)){
hud->flags &= ~HudFlagsSubtitleQueued;
hud->subtitleType = hud->queuedSubtitleType;
hud->queuedSubtitleType = SubtitleKeyNone;
}
if (targetBackgroundOpacity != hud->backgroundOpacity) {
hud->backgroundOpacity = mathfMoveTowards(hud->backgroundOpacity, targetBackgroundOpacity, FIXED_DELTA_TIME / hud->subtitleFadeTime);
}
if (targetPromptOpacity && (hud->resolvedPrompts & (1 << hud->promptType)) != 0) {
@ -139,13 +152,29 @@ void hudShowActionPrompt(struct Hud* hud, enum CutscenePromptType promptType) {
}
void hudShowSubtitle(struct Hud* hud, enum SubtitleKey subtitleType) {
if (subtitleType == SubtitleKeyNone) {
hud->flags &= ~HudFlagsShowingSubtitle;
if (subtitleType == hud->subtitleType){
return;
}
if (subtitleType == SubtitleKeyNone) {
hud->flags &= ~HudFlagsShowingSubtitle;
hud->flags &= ~HudFlagsSubtitleQueued;
hud->subtitleFadeTime = 0.75;
return;
}
if (hud->flags & HudFlagsShowingSubtitle){
hud->flags |= HudFlagsSubtitleQueued;
hud->queuedSubtitleType = subtitleType;
hud->subtitleFadeTime = 0.3;
}
else{
hud->flags |= HudFlagsShowingSubtitle;
hud->subtitleType = subtitleType;
hud->subtitleFadeTime = 0.75;
}
}
void hudResolvePrompt(struct Hud* hud, enum CutscenePromptType promptType) {
@ -272,6 +301,6 @@ void hudRender(struct Hud* hud, struct Player* player, struct RenderState* rende
}
if (hud->subtitleOpacity > 0.0f && gSaveData.controls.flags & ControlSaveSubtitlesEnabled) {
controlsRenderSubtitle(SubtitleLanguageValues[hud->chosenLanguage][hud->subtitleType], hud->subtitleOpacity, renderState);
controlsRenderSubtitle(SubtitleLanguageValues[hud->chosenLanguage][hud->subtitleType], hud->subtitleOpacity, hud->backgroundOpacity, renderState);
}
}

View file

@ -17,15 +17,19 @@ enum HudFlags {
HudFlagsLookedPortalable1 = (1 << 1),
HudFlagsShowingPrompt = (1 << 2),
HudFlagsShowingSubtitle= (1 << 3),
HudFlagsSubtitleQueued= (1 << 4),
};
struct Hud {
int chosenLanguage;
enum CutscenePromptType promptType;
enum SubtitleKey subtitleType;
enum SubtitleKey queuedSubtitleType;
float promptOpacity;
float subtitleOpacity;
float backgroundOpacity;
float subtitleFadeTime;
float fadeInTimer;
u16 flags;