mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-20 10:37:37 -04:00
fading between subtitles
This commit is contained in:
parent
b46a5f8772
commit
285ace8630
|
@ -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,
|
||||
|
|
|
@ -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
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue