146 lines
3.4 KiB
C++
146 lines
3.4 KiB
C++
#include "extdll.h"
|
|
#include "basemenu.h"
|
|
#include "utils.h"
|
|
#include "ui_title_anim.h"
|
|
|
|
#define BANNER_X_FIX -16
|
|
#define BANNER_Y_FIX -20
|
|
|
|
// Title Transition Time period
|
|
#define TTT_PERIOD 200.0f
|
|
|
|
quad_t TitleLerpQuads[2];
|
|
int transition_initial_time;
|
|
int transition_state;
|
|
HIMAGE TransPic = 0;
|
|
int PreClickDepth;
|
|
bool hold_button_stack = false;
|
|
|
|
void UI_TACheckMenuDepth( void )
|
|
{
|
|
PreClickDepth = uiStatic.menuDepth;
|
|
}
|
|
|
|
menuPicButton_s *ButtonStack[UI_MAX_MENUDEPTH];
|
|
int ButtonStackDepth;
|
|
|
|
void UI_PopPButtonStack()
|
|
{
|
|
if( hold_button_stack ) return;
|
|
|
|
if ( ButtonStack[ButtonStackDepth] ) UI_SetTitleAnim( AS_TO_BUTTON, ButtonStack[ButtonStackDepth] );
|
|
if ( ButtonStackDepth ) ButtonStackDepth--;
|
|
}
|
|
|
|
void UI_PushPButtonStack( menuPicButton_s *button )
|
|
{
|
|
if( ButtonStack[ButtonStackDepth] == button )
|
|
return;
|
|
|
|
ButtonStackDepth++;
|
|
ButtonStack[ButtonStackDepth] = button;
|
|
}
|
|
|
|
float UI_GetTitleTransFraction( void )
|
|
{
|
|
float fraction = (float)(uiStatic.realTime - transition_initial_time ) / TTT_PERIOD;
|
|
|
|
if( fraction > 1.0f )
|
|
fraction = 1.0f;
|
|
|
|
return fraction;
|
|
}
|
|
|
|
void LerpQuad( quad_t a, quad_t b, float frac, quad_t *c )
|
|
{
|
|
c->x = a.x + (b.x - a.x) * frac;
|
|
c->y = a.y + (b.y - a.y) * frac;
|
|
c->lx = a.lx + (b.lx - a.lx) * frac;
|
|
c->ly = a.ly + (b.ly - a.ly) * frac;
|
|
}
|
|
|
|
void UI_SetupTitleQuad()
|
|
{
|
|
TitleLerpQuads[1].x = UI_BANNER_POSX + BANNER_X_FIX;
|
|
TitleLerpQuads[1].y = UI_BANNER_POSY + BANNER_Y_FIX;
|
|
TitleLerpQuads[1].lx = UI_BANNER_WIDTH - 125;
|
|
TitleLerpQuads[1].ly = UI_BANNER_HEIGHT - 40;
|
|
}
|
|
|
|
void UI_DrawTitleAnim()
|
|
{
|
|
UI_SetupTitleQuad();
|
|
|
|
if( !TransPic ) return;
|
|
|
|
wrect_t r = { 0, uiStatic.buttons_width, 26, 51 };
|
|
|
|
float frac = UI_GetTitleTransFraction();/*(sin(gpGlobals->time*4)+1)/2*/;
|
|
|
|
#ifdef TA_ALT_MODE
|
|
if( frac == 1 && transition_state == AS_TO_BUTTON )
|
|
return;
|
|
#else
|
|
if( frac == 1 ) return;
|
|
#endif
|
|
|
|
quad_t c;
|
|
|
|
int f_idx = (transition_state == AS_TO_TITLE) ? 0 : 1;
|
|
int s_idx = (transition_state == AS_TO_TITLE) ? 1 : 0;
|
|
|
|
LerpQuad( TitleLerpQuads[f_idx], TitleLerpQuads[s_idx], frac, &c );
|
|
|
|
PIC_Set( TransPic, 255, 255, 255, 255 );
|
|
PIC_DrawAdditive( c.x, c.y, c.lx, c.ly, &r );
|
|
}
|
|
|
|
void UI_SetTitleAnim( int anim_state, menuPicButton_s *button )
|
|
{
|
|
// skip buttons which don't call new menu
|
|
if( !button || PreClickDepth == uiStatic.menuDepth && anim_state == AS_TO_TITLE )
|
|
return;
|
|
|
|
// replace cancel\done button with button which called this menu
|
|
if( PreClickDepth > uiStatic.menuDepth && anim_state == AS_TO_TITLE )
|
|
{
|
|
anim_state = AS_TO_BUTTON;
|
|
|
|
// HACK HACK HACK
|
|
if ( ButtonStack[ButtonStackDepth + 1] )
|
|
button = ButtonStack[ButtonStackDepth+1];
|
|
}
|
|
|
|
// don't reset anim if dialog buttons pressed
|
|
if( button->generic.id == 130 || button->generic.id == 131 )
|
|
return;
|
|
|
|
if( anim_state == AS_TO_TITLE )
|
|
UI_PushPButtonStack( button );
|
|
|
|
transition_state = anim_state;
|
|
|
|
TitleLerpQuads[0].x = button->generic.x;
|
|
TitleLerpQuads[0].y = button->generic.y;
|
|
TitleLerpQuads[0].lx = button->generic.width;
|
|
TitleLerpQuads[0].ly = button->generic.height;
|
|
|
|
transition_initial_time = uiStatic.realTime;
|
|
TransPic = button->pic;
|
|
}
|
|
|
|
void UI_InitTitleAnim()
|
|
{
|
|
memset( TitleLerpQuads, 0, sizeof( quad_t ) * 2 );
|
|
|
|
UI_SetupTitleQuad();
|
|
|
|
ButtonStackDepth = 0;
|
|
memset( ButtonStack, 0, sizeof( ButtonStack ));
|
|
}
|
|
|
|
void UI_ClearButtonStack( void )
|
|
{
|
|
ButtonStackDepth = 0;
|
|
memset( ButtonStack, 0, sizeof( ButtonStack ));
|
|
} |