* fix the animation timing, the notification start_time
must be in millisec to avoid losing precision
* convert the animation duration to millisec once during settings parsing * decrease the notification margin from 10.0 to 5.0, it looked way shifted on larger screens * pass around instances on std::chrono instead of float, use float in the final stage when processing/operating-on the time (if needed) * decrease the animation duration to 0.35 sec, looks more swishy!
This commit is contained in:
parent
460c978100
commit
9f1e09b97a
@ -124,8 +124,9 @@ struct Overlay_Appearance {
|
|||||||
float notification_g = 0.29f;
|
float notification_g = 0.29f;
|
||||||
float notification_b = 0.48f;
|
float notification_b = 0.48f;
|
||||||
float notification_a = 1.0f;
|
float notification_a = 1.0f;
|
||||||
float notification_rounding = 0.0f;
|
float notification_rounding = 0.0f; // corners roundness for all notifications
|
||||||
float notification_animation = 0.0f;
|
uint32 notification_animation = 0; // sliding animation duration (millisec)
|
||||||
|
|
||||||
std::string ach_unlock_datetime_format = "%Y/%m/%d - %H:%M:%S";
|
std::string ach_unlock_datetime_format = "%Y/%m/%d - %H:%M:%S";
|
||||||
|
|
||||||
float background_r = -1.0f;
|
float background_r = -1.0f;
|
||||||
|
@ -257,7 +257,7 @@ static void load_overlay_appearance(class Settings *settings_client, class Setti
|
|||||||
settings_client->overlay_appearance.notification_rounding = nnotification_rounding;
|
settings_client->overlay_appearance.notification_rounding = nnotification_rounding;
|
||||||
settings_server->overlay_appearance.notification_rounding = nnotification_rounding;
|
settings_server->overlay_appearance.notification_rounding = nnotification_rounding;
|
||||||
} else if (name.compare("Notification_Animation") == 0) {
|
} else if (name.compare("Notification_Animation") == 0) {
|
||||||
float nnotification_animation = std::stof(value, NULL);
|
uint32 nnotification_animation = (uint32)(std::stof(value, NULL) * 1000.0f); // convert sec to milli
|
||||||
settings_client->overlay_appearance.notification_animation = nnotification_animation;
|
settings_client->overlay_appearance.notification_animation = nnotification_animation;
|
||||||
settings_server->overlay_appearance.notification_animation = nnotification_animation;
|
settings_server->overlay_appearance.notification_animation = nnotification_animation;
|
||||||
} else if (name.compare("Achievement_Unlock_Datetime_Format") == 0) {
|
} else if (name.compare("Achievement_Unlock_Datetime_Format") == 0) {
|
||||||
|
@ -69,7 +69,7 @@ struct Notification
|
|||||||
|
|
||||||
int id{};
|
int id{};
|
||||||
uint8 type{};
|
uint8 type{};
|
||||||
std::chrono::seconds start_time{};
|
std::chrono::milliseconds start_time{};
|
||||||
std::string message{};
|
std::string message{};
|
||||||
std::pair<const Friend, friend_window_state>* frd{};
|
std::pair<const Friend, friend_window_state>* frd{};
|
||||||
std::weak_ptr<uint64_t> icon{};
|
std::weak_ptr<uint64_t> icon{};
|
||||||
@ -187,8 +187,9 @@ class Steam_Overlay
|
|||||||
// Double click on friend
|
// Double click on friend
|
||||||
void build_friend_window(Friend const& frd, friend_window_state &state);
|
void build_friend_window(Friend const& frd, friend_window_state &state);
|
||||||
// Notifications like achievements, chat and invitations
|
// Notifications like achievements, chat and invitations
|
||||||
void set_next_notification_pos(float width, float height, float elapsed, const Notification ¬i, struct NotificationsIndexes &idx);
|
void set_next_notification_pos(float width, float height, std::chrono::milliseconds elapsed, const Notification ¬i, struct NotificationsIndexes &idx);
|
||||||
float animate_factor(float elapsed);
|
// factor controlling the amount of sliding during the animation, 0 means disabled
|
||||||
|
float animate_factor(std::chrono::milliseconds elapsed);
|
||||||
void build_notifications(int width, int height);
|
void build_notifications(int width, int height);
|
||||||
// invite a single friend
|
// invite a single friend
|
||||||
void invite_friend(uint64 friend_id, class Steam_Friends* steamFriends, class Steam_Matchmaking* steamMatchmaking);
|
void invite_friend(uint64 friend_id, class Steam_Friends* steamFriends, class Steam_Matchmaking* steamMatchmaking);
|
||||||
|
@ -604,7 +604,7 @@ bool Steam_Overlay::submit_notification(notification_type type, const std::strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
Notification notif{};
|
Notification notif{};
|
||||||
notif.start_time = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch());
|
notif.start_time = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch());
|
||||||
notif.id = id;
|
notif.id = id;
|
||||||
notif.type = (uint8)type;
|
notif.type = (uint8)type;
|
||||||
notif.message = msg;
|
notif.message = msg;
|
||||||
@ -834,7 +834,7 @@ void Steam_Overlay::build_friend_window(Friend const& frd, friend_window_state&
|
|||||||
}
|
}
|
||||||
|
|
||||||
// set the position of the next notification
|
// set the position of the next notification
|
||||||
void Steam_Overlay::set_next_notification_pos(float width, float height, float elapsed, const Notification ¬i, struct NotificationsIndexes &idx)
|
void Steam_Overlay::set_next_notification_pos(float width, float height, std::chrono::milliseconds elapsed, const Notification ¬i, struct NotificationsIndexes &idx)
|
||||||
{
|
{
|
||||||
const float noti_width = width * Notification::width_percent;
|
const float noti_width = width * Notification::width_percent;
|
||||||
|
|
||||||
@ -878,9 +878,9 @@ void Steam_Overlay::set_next_notification_pos(float width, float height, float e
|
|||||||
// 0 on the y-axis is top, 0 on the x-axis is left
|
// 0 on the y-axis is top, 0 on the x-axis is left
|
||||||
float x = 0.0f;
|
float x = 0.0f;
|
||||||
float y = 0.0f;
|
float y = 0.0f;
|
||||||
float anchor_margin = 10.0f;
|
float anchor_margin = 5.0f;
|
||||||
float margin_y = 0.f;
|
float margin_y = 0.0f;
|
||||||
float animate_size = 0.f;
|
float animate_size = 0.0f;
|
||||||
|
|
||||||
switch (pos) {
|
switch (pos) {
|
||||||
// top
|
// top
|
||||||
@ -937,20 +937,23 @@ void Steam_Overlay::set_next_notification_pos(float width, float height, float e
|
|||||||
ImGui::SetNextWindowBgAlpha(0.9f);
|
ImGui::SetNextWindowBgAlpha(0.9f);
|
||||||
}
|
}
|
||||||
|
|
||||||
float Steam_Overlay::animate_factor(float elapsed)
|
float Steam_Overlay::animate_factor(std::chrono::milliseconds elapsed)
|
||||||
{
|
{
|
||||||
float factor = 0.0f;
|
if (settings->overlay_appearance.notification_animation <= 0) return 0.0f; // no animation
|
||||||
float animation_duration = settings->overlay_appearance.notification_animation * 1000;
|
|
||||||
PRINT_DEBUG("ELAPSED %f", elapsed);
|
|
||||||
|
|
||||||
if (animation_duration > 0) {
|
std::chrono::milliseconds animation_duration(settings->overlay_appearance.notification_animation);
|
||||||
if (elapsed < animation_duration) {
|
// PRINT_DEBUG("ELAPSED %u/%u", (uint32)elapsed.count(), (uint32)animation_duration.count());
|
||||||
factor = 1 - (elapsed / animation_duration);
|
|
||||||
PRINT_DEBUG("SHOW FACTOR %f", factor);
|
float factor = 0.0f;
|
||||||
}
|
if (elapsed < animation_duration) { // sliding in
|
||||||
else if (elapsed > Notification::show_time.count() - animation_duration) {
|
factor = 1.0f - (static_cast<float>(elapsed.count()) / animation_duration.count());
|
||||||
factor = 1 - (Notification::show_time.count() - elapsed) / animation_duration;
|
// PRINT_DEBUG("SHOW FACTOR %f", factor);
|
||||||
PRINT_DEBUG("HIDE FACTOR %f", factor);
|
} else {
|
||||||
|
// time between sliding in/out animation
|
||||||
|
auto steady_time = Notification::show_time - animation_duration;
|
||||||
|
if (elapsed > steady_time) {
|
||||||
|
factor = 1.0f - static_cast<float>((Notification::show_time - elapsed).count()) / animation_duration.count();
|
||||||
|
// PRINT_DEBUG("HIDE FACTOR %f", factor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -970,7 +973,7 @@ void Steam_Overlay::build_notifications(int width, int height)
|
|||||||
for (auto it = notifications.begin(); it != notifications.end(); ++it) {
|
for (auto it = notifications.begin(); it != notifications.end(); ++it) {
|
||||||
auto elapsed_notif = now - it->start_time;
|
auto elapsed_notif = now - it->start_time;
|
||||||
|
|
||||||
set_next_notification_pos(width, height, elapsed_notif.count(), *it, idx);
|
set_next_notification_pos(width, height, elapsed_notif, *it, idx);
|
||||||
|
|
||||||
if ( elapsed_notif < Notification::fade_in) { // still appearing (fading in)
|
if ( elapsed_notif < Notification::fade_in) { // still appearing (fading in)
|
||||||
float alpha = settings->overlay_appearance.notification_a * (elapsed_notif.count() / static_cast<float>(Notification::fade_in.count()));
|
float alpha = settings->overlay_appearance.notification_a * (elapsed_notif.count() / static_cast<float>(Notification::fade_in.count()));
|
||||||
@ -1033,11 +1036,12 @@ void Steam_Overlay::build_notifications(int width, int height)
|
|||||||
|
|
||||||
case notification_type::invite: {
|
case notification_type::invite: {
|
||||||
ImGui::TextWrapped("%s", it->message.c_str());
|
ImGui::TextWrapped("%s", it->message.c_str());
|
||||||
if (ImGui::Button(translationJoin[current_language]))
|
if (ImGui::Button(translationJoin[current_language])) {
|
||||||
{
|
|
||||||
it->frd->second.window_state |= window_state_join;
|
it->frd->second.window_state |= window_state_join;
|
||||||
friend_actions_temp.push(it->frd->first);
|
friend_actions_temp.push(it->frd->first);
|
||||||
it->start_time = std::chrono::seconds(0);
|
// when we click "accept game invite" from someone else, we want to remove this notification immediately since it's no longer relevant
|
||||||
|
// this assignment will make the notification elapsed time insanely large
|
||||||
|
it->start_time = std::chrono::milliseconds(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -47,11 +47,11 @@ Notification_G=0.15
|
|||||||
Notification_B=0.18
|
Notification_B=0.18
|
||||||
Notification_A=1.0
|
Notification_A=1.0
|
||||||
|
|
||||||
# notification rounded corners
|
# notifications corners roundness
|
||||||
Notification_Rounding=10.0
|
Notification_Rounding=10.0
|
||||||
|
|
||||||
# notification animation in seconds. Set to 0 to disable
|
# notification animation in seconds. Set to 0 to disable
|
||||||
Notification_Animation=0.5
|
Notification_Animation=0.35
|
||||||
|
|
||||||
# format for the achievement unlock date/time, limited to 79 characters
|
# format for the achievement unlock date/time, limited to 79 characters
|
||||||
# if the output formatted string exceeded this limit, the builtin format will be used
|
# if the output formatted string exceeded this limit, the builtin format will be used
|
||||||
|
Loading…
x
Reference in New Issue
Block a user