diff options
author | Andrey Nazarov <skuller@skuller.net> | 2007-11-24 01:05:28 +0000 |
---|---|---|
committer | Andrey Nazarov <skuller@skuller.net> | 2007-11-24 01:05:28 +0000 |
commit | 5eaaac93ad3b0d2777815717059d977912bd96f7 (patch) | |
tree | dcfa5d015f4035034e16f11f7adc1013d2fa5880 /source/cl_draw.c | |
parent | 3f0f134217531bd2f7d099f12e4ea77d3565cf91 (diff) |
Renamed `cl_uprate' and `cl_dnrate' to `net_uprate'
and `net_dnrate' respectively, moved related code to net_common.c
Simplified on-secreen lagometer, now controlled with `scr_lag_draw',
`scr_lag_x' and `scr_lag_y' variables.
Diffstat (limited to 'source/cl_draw.c')
-rw-r--r-- | source/cl_draw.c | 357 |
1 files changed, 82 insertions, 275 deletions
diff --git a/source/cl_draw.c b/source/cl_draw.c index 9f46860..e7e4dcd 100644 --- a/source/cl_draw.c +++ b/source/cl_draw.c @@ -19,8 +19,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "cl_local.h" -#include <setjmp.h> -#include "q_lex.h" // // cl_draw.c - draw all 2D elements during gameplay @@ -29,16 +27,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. cvar_t *scr_draw2d; cvar_t *scr_showturtle; cvar_t *scr_showfollowing; -cvar_t *scr_lag_placement; -cvar_t *scr_lag_type; -cvar_t *scr_lag_background; +cvar_t *scr_lag_x; +cvar_t *scr_lag_y; +cvar_t *scr_lag_draw; cvar_t *scr_alpha; #define SCR_DrawString( x, y, flags, string ) \ UIS_DrawStringEx( x, y, flags, MAX_STRING_CHARS, string, scr_font ) -// ============================================================================ - /* ============== SCR_LoadingString @@ -68,276 +64,90 @@ LAGOMETER =============================================================================== */ -#define LAG_SAMPLES 1024 -#define LAG_MASK ( LAG_SAMPLES - 1 ) +#define LAG_WIDTH 48 +#define LAG_HEIGHT 48 -#define LAG_HISTORY 16 -#define LAG_HISTORY_MASK ( LAG_HISTORY - 1 ) +#define LAG_MAX 200 -#define SUPRESSED_PACKET_MASK 0x4000 -#define DROPPED_PACKET_MASK 0x8000 +#define LAG_CRIT_BIT ( 1 << 31 ) +#define LAG_WARN_BIT ( 1 << 30 ) #define LAG_BASE 0xD5 #define LAG_WARN 0xDC #define LAG_CRIT 0xF2 -typedef struct lagometer_s { - uint16 ping[LAG_SAMPLES]; - uint16 inSize[LAG_SAMPLES]; - uint8 delta[LAG_SAMPLES]; - int inTime[LAG_HISTORY]; - int inPacketNum; - - uint16 outSize[LAG_SAMPLES]; - int outTime[LAG_HISTORY]; - int outPacketNum; -} lagometer_t; - -static lagometer_t lag; -static vrect_t lag_rc; -static int lag_max; - -/* -============== -SCR_ClearLagometer -============== -*/ -void SCR_ClearLagometer( void ) { - memset( &lag, 0, sizeof( lag ) ); -} - -/* -============== -SCR_AddLagometerPacketInfo -============== -*/ -void SCR_AddLagometerPacketInfo( void ) { - uint16 ping; - int i, j; - - i = cls.netchan->incoming_acknowledged & CMD_MASK; - ping = ( cls.realtime - cl.history[i].realtime ) & 0x3FFF; - - if( cl.frameflags & FF_SURPRESSED ) { - ping |= SUPRESSED_PACKET_MASK; - } - if( cls.netchan->dropped ) { - ping |= DROPPED_PACKET_MASK; - } - - i = lag.inPacketNum & LAG_MASK; - j = lag.inPacketNum & LAG_HISTORY_MASK; - lag.inTime[j] = cls.realtime; - lag.ping[i] = ping; - lag.inSize[i] = msg_read.cursize; - lag.delta[i] = cl.frame.delta > 0 ? ( cl.frame.number - cl.frame.delta ) : 0; - - lag.inPacketNum++; - -} - -/* -============== -SCR_AddLagometerOutPacketInfo -============== -*/ -void SCR_AddLagometerOutPacketInfo( int size ) { - int i, j; - - i = lag.outPacketNum & LAG_MASK; - j = lag.outPacketNum & LAG_HISTORY_MASK; - lag.outTime[j] = cls.realtime; - lag.outSize[i] = size; - - lag.outPacketNum++; -} - -static void SCR_DrawPingGraph( void ) { - int i, j, v; - int color; - - for( i = 0; i < lag_rc.width; i++ ) { - j = lag.inPacketNum - i - 1; - if( j < 0 ) { - break; - } - - v = lag.ping[j & LAG_MASK]; - - color = LAG_BASE; - if( v & SUPRESSED_PACKET_MASK ) { - v &= ~SUPRESSED_PACKET_MASK; - color = LAG_WARN; - } - if( v & DROPPED_PACKET_MASK ) { - v &= ~DROPPED_PACKET_MASK; - color = LAG_CRIT; - } - - v = v * lag_rc.height / lag_max; - if( v > lag_rc.height ) { - v = lag_rc.height; - } - - ref.DrawFill( lag_rc.x + lag_rc.width - i - 1, lag_rc.y + lag_rc.height - v, 1, v, color ); - - } -} - -static void SCR_DrawOutPacketGraph( void ) { - int i, j, v; - - for( i = 0; i < lag_rc.width; i++ ) { - j = lag.outPacketNum - i - 1; - if( j < 0 ) { - break; - } - - v = lag.outSize[j & LAG_MASK]; - - v = v * lag_rc.height / lag_max; - if( v > lag_rc.height ) { - v = lag_rc.height; - } +static struct { + int samples[LAG_WIDTH]; + int head; +} lag; - ref.DrawFill( lag_rc.x + lag_rc.width - i - 1, lag_rc.y + lag_rc.height - v, 1, v, LAG_BASE ); - } +void SCR_LagClear( void ) { + lag.head = 0; } -static void SCR_DrawInPacketGraph( void ) { - int i, j, v; - - for( i = 0; i < lag_rc.width; i++ ) { - j = lag.inPacketNum - i - 1; - if( j < 0 ) { - break; - } +void SCR_LagSample( void ) { + int i = cls.netchan->incoming_acknowledged & CMD_MASK; + client_history_t *h = &cl.history[i]; + int ping = cls.realtime - h->sent; - v = lag.inSize[j & LAG_MASK]; + h->rcvd = cls.realtime; + if( !h->cmdNumber ) { + return; + } - v = v * lag_rc.height / lag_max; - if( v > lag_rc.height ) { - v = lag_rc.height; - } + for( i = 0; i < cls.netchan->dropped; i++ ) { + lag.samples[lag.head % LAG_WIDTH] = LAG_MAX | LAG_CRIT_BIT; + lag.head++; + } - ref.DrawFill( lag_rc.x + lag_rc.width - i - 1, lag_rc.y + lag_rc.height - v, 1, v, LAG_BASE ); - } + if( cl.frameflags & FF_SURPRESSED ) { + ping |= LAG_WARN_BIT; + } + lag.samples[lag.head % LAG_WIDTH] = ping; + lag.head++; } -static void SCR_DrawDeltaGraph( void ) { - int i, j, v; - int color; +static void SCR_LagDraw( int x, int y ) { + int i, j, v, c; - for( i = 0; i < lag_rc.width; i++ ) { - j = lag.inPacketNum - i - 1; + for( i = 0; i < LAG_WIDTH; i++ ) { + j = lag.head - i - 1; if( j < 0 ) { break; } - v = lag.delta[j & LAG_MASK]; - - color = LAG_BASE; - if( !v ) { - v = lag_max; - color = LAG_WARN; - } - - v = v * lag_rc.height / lag_max; - if( v > lag_rc.height ) { - v = lag_rc.height; - } - - ref.DrawFill( lag_rc.x + lag_rc.width - i - 1, lag_rc.y + lag_rc.height - v, 1, v, color ); - } -} - -static void SCR_DrawDisconnect( vrect_t *rc ) { - if( !cls.netchan ) { - return; - } - if( cls.netchan->outgoing_sequence - cls.netchan->incoming_acknowledged > CMD_BACKUP - 1 ) { - if( ( cls.realtime >> 8 ) & 3 ) { - ref.DrawStretchPic( rc->x, rc->y, rc->width, rc->height, scr_net ); - } - } -} - -static int CL_Ping_m( char *buffer, int bufferSize ) { - int i, j; - int start; - int ping; - - start = lag.inPacketNum - LAG_HISTORY + 1; - if( start < 0 ) { - start = 0; - } - - ping = 0; - if( lag.inPacketNum > 1 ) { - for( i = start; i < lag.inPacketNum; i++ ) { - j = lag.ping[i & LAG_MASK]; - ping += j & ~( SUPRESSED_PACKET_MASK | DROPPED_PACKET_MASK ); - } - - ping /= i - start; - } - return Com_sprintf( buffer, bufferSize, "%i", ping ); -} + v = lag.samples[j % LAG_WIDTH]; -static int CL_UpRate_m( char *buffer, int bufferSize ) { - int i; - float size; - int startTime, endTime; - - i = lag.outPacketNum - LAG_HISTORY + 1; - if( i < 0 ) { - i = 0; - } - - startTime = lag.outTime[i & LAG_HISTORY_MASK]; - endTime = lag.outTime[( lag.outPacketNum - 1 ) & - LAG_HISTORY_MASK]; + if( v & LAG_CRIT_BIT ) { + c = LAG_CRIT; + } else if( v & LAG_WARN_BIT ) { + c = LAG_WARN; + } else { + c = LAG_BASE; + } - size = 0; - if( startTime != endTime ) { - for( ; i < lag.outPacketNum; i++ ) { - size += lag.outSize[i & LAG_MASK]; + v &= ~(LAG_WARN_BIT|LAG_CRIT_BIT); + v = v * LAG_HEIGHT / LAG_MAX; + if( v > LAG_HEIGHT ) { + v = LAG_HEIGHT; } - size /= endTime - startTime; + ref.DrawFill( x + LAG_WIDTH - i - 1, y + LAG_HEIGHT - v, 1, v, c ); } - return Com_sprintf( buffer, bufferSize, "%1.2f", size ); } -static int CL_DnRate_m( char *buffer, int bufferSize ) { - int i; - float size; - int startTime, endTime; - - i = lag.inPacketNum - LAG_HISTORY + 1; - if( i < 0 ) { - i = 0; - } +/* +=============================================================================== - startTime = lag.inTime[i & LAG_HISTORY_MASK]; - endTime = lag.inTime[( lag.inPacketNum - 1 ) & - LAG_HISTORY_MASK]; +DRAW OBJECTS - size = 0; - if( startTime != endTime ) { - for( ; i < lag.inPacketNum; i++ ) { - size += lag.inSize[i & LAG_MASK]; - } - - size /= endTime - startTime; - } - return Com_sprintf( buffer, bufferSize, "%1.2f", size ); -} +=============================================================================== +*/ typedef struct { list_t entry; int x, y; - int type; + //int type; //union { cvar_t *cvar; xmacro_t macro; @@ -438,11 +248,11 @@ static void draw_objects( void ) { y = obj->y; flags = 0; if( x < 0 ) { - x += scr_hudWidth; + x += scr_hudWidth + 1; flags |= UI_RIGHT; } if( y < 0 ) { - y += scr_hudHeight - 8; + y += scr_hudHeight - 8 + 1; } if( obj->macro ) { obj->macro( buffer, sizeof( buffer ) ); @@ -598,6 +408,7 @@ SCR_Draw2D */ void SCR_Draw2D( void ) { clipRect_t rc; + int x, y; if( !scr_draw2d->integer || ( cls.key_dest & KEY_MENU ) ) { return; @@ -642,32 +453,32 @@ void SCR_Draw2D( void ) { SCR_DrawCenterString(); - lag_rc.x = scr_hudWidth - 48; - lag_rc.y = scr_hudHeight - 48; - lag_rc.width = 48; - lag_rc.height = 48; - - lag_max = 60; - - switch( scr_lag_type->integer ) { - case 1: - SCR_DrawPingGraph(); - break; - case 2: - SCR_DrawOutPacketGraph(); - break; - case 3: - SCR_DrawInPacketGraph(); - break; - case 4: - SCR_DrawDeltaGraph(); - break; + x = scr_lag_x->integer; + y = scr_lag_y->integer; + + if( x < 0 ) { + x += scr_hudWidth - LAG_WIDTH + 1; + } + if( y < 0 ) { + y += scr_hudHeight - LAG_HEIGHT + 1; } - draw_objects(); + // draw ping graph + if( scr_lag_draw->integer ) { + if( scr_lag_draw->integer > 1 ) { + ref.DrawFill( x, y, LAG_WIDTH, LAG_HEIGHT, 4 ); + } + SCR_LagDraw( x, y ); + } // draw phone jack - SCR_DrawDisconnect( &lag_rc ); + if( cls.netchan && cls.netchan->outgoing_sequence - cls.netchan->incoming_acknowledged >= CMD_BACKUP ) { + if( ( cls.realtime >> 8 ) & 3 ) { + ref.DrawStretchPic( x, y, LAG_WIDTH, LAG_HEIGHT, scr_net ); + } + } + + draw_objects(); ref.SetColor( DRAW_COLOR_CLEAR, NULL ); @@ -698,15 +509,11 @@ void SCR_InitDraw( void ) { scr_draw2d = Cvar_Get( "scr_draw2d", "2", 0 ); scr_showturtle = Cvar_Get( "scr_showturtle", "1", 0 ); scr_showfollowing = Cvar_Get( "scr_showfollowing", "0", 0 ); - scr_lag_placement = Cvar_Get( "scr_lag_placement", "48x48-1-1", 0 ); - scr_lag_type = Cvar_Get( "scr_lag_type", "0", 0 ); - scr_lag_background = Cvar_Get( "scr_lag_background", "0", 0 ); + scr_lag_x = Cvar_Get( "scr_lag_x", "-1", 0 ); + scr_lag_y = Cvar_Get( "scr_lag_y", "-1", 0 ); + scr_lag_draw = Cvar_Get( "scr_lag_draw", "0", 0 ); scr_alpha = Cvar_Get( "scr_alpha", "1", 0 ); - Cmd_AddMacro( "cl_ping", CL_Ping_m ); - Cmd_AddMacro( "cl_uprate", CL_UpRate_m ); - Cmd_AddMacro( "cl_dnrate", CL_DnRate_m ); - Cmd_Register( scr_drawcmds ); } |