overlays: apply message fade in during lifetime extension if necessary

This commit is contained in:
Megamouse 2023-03-02 15:49:00 +01:00
parent c6426245e4
commit 0d34b97948
3 changed files with 47 additions and 9 deletions

View File

@ -10,7 +10,17 @@ namespace rsx
void animation_base::begin_animation(u64 frame) void animation_base::begin_animation(u64 frame)
{ {
frame_start = frame; frame_start = frame;
frame_end = u64(frame + duration * g_cfg.video.vblank_rate); frame_end = frame + get_duration_in_frames();
}
u64 animation_base::get_duration_in_frames() const
{
return u64(duration * g_cfg.video.vblank_rate);
}
u64 animation_base::get_remaining_frames(u64 frame) const
{
return frame >= frame_end ? 0 : (frame_end - frame);
} }
f32 animation_base::get_progress_ratio(u64 frame) const f32 animation_base::get_progress_ratio(u64 frame) const
@ -39,11 +49,16 @@ namespace rsx
return t; return t;
} }
void animation_translate::reset(u64 frame) void animation_translate::reset(u64 start_frame)
{ {
active = false; active = false;
current = start; current = start;
frame_start = 0; frame_start = start_frame;
if (frame_start > 0)
{
frame_end = frame_start + get_duration_in_frames();
}
} }
void animation_translate::apply(compiled_resource& resource) void animation_translate::apply(compiled_resource& resource)
@ -101,11 +116,16 @@ namespace rsx
} }
} }
void animation_color_interpolate::reset(u64 frame) void animation_color_interpolate::reset(u64 start_frame)
{ {
active = false; active = false;
current = start; current = start;
frame_start = 0; frame_start = start_frame;
if (frame_start > 0)
{
frame_end = frame_start + get_duration_in_frames();
}
} }
void animation_color_interpolate::apply(compiled_resource& data) void animation_color_interpolate::apply(compiled_resource& data)

View File

@ -42,8 +42,11 @@ namespace rsx
std::function<void()> on_finish; std::function<void()> on_finish;
u64 get_duration_in_frames() const;
u64 get_remaining_frames(u64 frame) const;
virtual void apply(compiled_resource&) = 0; virtual void apply(compiled_resource&) = 0;
virtual void reset(u64 frame) = 0; virtual void reset(u64 start_frame) = 0;
virtual void update(u64 frame) = 0; virtual void update(u64 frame) = 0;
}; };
@ -58,7 +61,7 @@ namespace rsx
vector3f end{}; vector3f end{};
void apply(compiled_resource& data) override; void apply(compiled_resource& data) override;
void reset(u64 frame) override; void reset(u64 start_frame = 0) override;
void update(u64 frame) override; void update(u64 frame) override;
void finish(); void finish();
}; };
@ -73,7 +76,7 @@ namespace rsx
color4f end{}; color4f end{};
void apply(compiled_resource& data) override; void apply(compiled_resource& data) override;
void reset(u64 frame) override; void reset(u64 start_frame = 0) override;
void update(u64 frame) override; void update(u64 frame) override;
void finish(); void finish();
}; };

View File

@ -123,10 +123,13 @@ namespace rsx
if (m_fade_in_animation.active) if (m_fade_in_animation.active)
{ {
// We are fading in.
m_fade_in_animation.update(rsx::get_current_renderer()->vblank_count); m_fade_in_animation.update(rsx::get_current_renderer()->vblank_count);
} }
else if (time + u64(m_fade_out_animation.duration * 1'000'000) > get_expiration()) else if (time + u64(m_fade_out_animation.duration * 1'000'000) > get_expiration())
{ {
// We are fading out.
// Only activate the animation if the message hasn't expired yet (prevents glitches afterwards). // Only activate the animation if the message hasn't expired yet (prevents glitches afterwards).
if (time <= get_expiration()) if (time <= get_expiration())
{ {
@ -137,7 +140,19 @@ namespace rsx
} }
else if (m_fade_out_animation.active) else if (m_fade_out_animation.active)
{ {
m_fade_out_animation.reset(rsx::get_current_renderer()->vblank_count); // We are fading out, but the expiration was extended.
// Reset the fade in animation to the state of the fade out animation to prevent opacity pop.
const usz current_frame = rsx::get_current_renderer()->vblank_count;
const f32 fade_out_progress = static_cast<f32>(m_fade_out_animation.get_remaining_frames(current_frame)) / static_cast<f32>(m_fade_out_animation.get_duration_in_frames());
const u64 fade_in_frames_done = u64(fade_out_progress * m_fade_in_animation.get_duration_in_frames());
m_fade_in_animation.reset(current_frame - fade_in_frames_done);
m_fade_in_animation.active = true;
m_fade_in_animation.update(current_frame);
// Reset the fade out animation.
m_fade_out_animation.reset();
} }
m_processed = true; m_processed = true;