diff --git a/src/k_menu.h b/src/k_menu.h index e750146cd..a34d0a94b 100644 --- a/src/k_menu.h +++ b/src/k_menu.h @@ -178,6 +178,12 @@ struct menu_t boolean (*inputroutine)(INT32); // if set, called every frame in the input handler. Returning true overwrites normal input handling. }; +struct menu_anim_t +{ + tic_t start; + INT16 dist; +}; + typedef enum { MM_NOTHING = 0, // is just displayed until the user do someting diff --git a/src/k_menudraw.c b/src/k_menudraw.c index 923c0423b..3a9b1d332 100644 --- a/src/k_menudraw.c +++ b/src/k_menudraw.c @@ -67,6 +67,9 @@ // And just some randomness for the exits. #include "m_random.h" +#include "i_time.h" +#include "m_easing.h" + #ifdef PC_DOS #include // for snprintf int snprintf(char *str, size_t n, const char *fmt, ...); @@ -77,6 +80,29 @@ int snprintf(char *str, size_t n, const char *fmt, ...); #include "discord.h" #endif +static fixed_t M_TimeFrac(tic_t tics, tic_t duration) +{ + return tics < duration ? (tics * FRACUNIT + rendertimefrac) / duration : FRACUNIT; +} + +static fixed_t M_ReverseTimeFrac(tic_t tics, tic_t duration) +{ + return FRACUNIT - M_TimeFrac(duration - tics, duration); +} + +static fixed_t M_DueFrac(tic_t start, tic_t duration) +{ + tic_t t = I_GetTime(); + tic_t n = t - start; + return M_TimeFrac(min(n, duration), duration); +} + +// FIXME: C++ template +#define M_EaseWithTransition(EasingFunc, N) \ + (menutransition.tics != menutransition.dest ? EasingFunc(menutransition.in ?\ + M_ReverseTimeFrac(menutransition.tics, menutransition.endmenu->transitionTics) :\ + M_TimeFrac(menutransition.tics, menutransition.startmenu->transitionTics), 0, N) : 0) + #define SKULLXOFF -32 #define LINEHEIGHT 16 #define STRINGHEIGHT 8 diff --git a/src/typedef.h b/src/typedef.h index 82b2bd7b4..be029d99a 100644 --- a/src/typedef.h +++ b/src/typedef.h @@ -200,6 +200,7 @@ TYPEDEF (trackingResult_t); TYPEDEF (menucolor_t); TYPEDEF (menuitem_t); TYPEDEF (menu_t); +TYPEDEF (menu_anim_t); TYPEDEF (menucmd_t); TYPEDEF (setup_player_colors_t); TYPEDEF (setup_player_t);