summaryrefslogtreecommitdiff
path: root/src/cgame
diff options
context:
space:
mode:
Diffstat (limited to 'src/cgame')
-rw-r--r--src/cgame/cg_draw.c136
-rw-r--r--src/cgame/cg_local.h2
-rw-r--r--src/cgame/cg_main.c2
-rw-r--r--src/cgame/cg_view.c3
4 files changed, 143 insertions, 0 deletions
diff --git a/src/cgame/cg_draw.c b/src/cgame/cg_draw.c
index 2b74a3f9..111cb12f 100644
--- a/src/cgame/cg_draw.c
+++ b/src/cgame/cg_draw.c
@@ -2094,6 +2094,139 @@ static void CG_DrawLagometer( rectDef_t *rect, float text_x, float text_y,
CG_DrawDisconnect( );
}
+#define SPEEDOMETER_NUM_SAMPLES 160
+#define SPEEDOMETER_DRAW_TEXT 0x1
+#define SPEEDOMETER_DRAW_GRAPH 0x2
+#define SPEEDOMETER_IGNORE_Z 0x4
+float speedSamples[ SPEEDOMETER_NUM_SAMPLES ];
+// array indices
+int oldestSpeedSample = 0;
+int maxSpeedSample = 0;
+
+/*
+===================
+CG_AddSpeed
+
+append a speed to the sample history
+===================
+*/
+void CG_AddSpeed( void )
+{
+ float speed;
+ vec3_t vel;
+
+ VectorCopy( cg.snap->ps.velocity, vel );
+
+ if( cg_drawSpeed.integer & SPEEDOMETER_IGNORE_Z )
+ vel[ 2 ] = 0;
+
+ speed = VectorLength( vel );
+
+ if( speed > speedSamples[ maxSpeedSample ] )
+ {
+ maxSpeedSample = oldestSpeedSample;
+ speedSamples[ oldestSpeedSample++ ] = speed;
+ oldestSpeedSample %= SPEEDOMETER_NUM_SAMPLES;
+ return;
+ }
+
+ speedSamples[ oldestSpeedSample ] = speed;
+ if( maxSpeedSample == oldestSpeedSample++ )
+ {
+ // if old max was overwritten find a new one
+ int i;
+ for( maxSpeedSample = 0, i = 1; i < SPEEDOMETER_NUM_SAMPLES; i++ )
+ {
+ if( speedSamples[ i ] > speedSamples[ maxSpeedSample ] )
+ maxSpeedSample = i;
+ }
+ }
+
+ oldestSpeedSample %= SPEEDOMETER_NUM_SAMPLES;
+}
+
+/*
+===================
+CG_DrawSpeedText
+CG_DrawSpeedGraph
+CG_DrawSpeed
+===================
+*/
+#define SPEEDOMETER_MIN_RANGE 900
+#define SPEED_MED 1000.f
+#define SPEED_FAST 1600.f
+
+static void CG_DrawSpeedGraph( rectDef_t *rect, vec4_t foreColor,
+ vec4_t backColor )
+{
+ int i;
+ float val, max, top;
+ // colour of graph is interpolated between these values
+ const vec3_t slow = { 0.0, 0.0, 1.0 };
+ const vec3_t medium = { 0.0, 1.0, 0.0 };
+ const vec3_t fast = { 1.0, 0.0, 0.0 };
+ vec4_t color;
+
+ max = speedSamples[ maxSpeedSample ];
+ if( max < SPEEDOMETER_MIN_RANGE )
+ max = SPEEDOMETER_MIN_RANGE;
+
+ trap_R_SetColor( backColor );
+ CG_DrawPic( rect->x, rect->y, rect->w, rect->h, cgs.media.whiteShader );
+
+ Vector4Copy( foreColor, color );
+
+ for( i = 1; i < SPEEDOMETER_NUM_SAMPLES; i++ )
+ {
+ val = speedSamples[ ( oldestSpeedSample + i ) % SPEEDOMETER_NUM_SAMPLES ];
+ if( val < SPEED_MED )
+ VectorLerp( val / SPEED_MED, slow, medium, color );
+ else if( val < SPEED_FAST )
+ VectorLerp( ( val - SPEED_MED ) / ( SPEED_FAST - SPEED_MED ),
+ medium, fast, color );
+ else
+ VectorCopy( fast, color );
+ trap_R_SetColor( color );
+ top = rect->y + ( 1 - val / max ) * rect->h;
+ CG_DrawPic( rect->x + ( i / (float)SPEEDOMETER_NUM_SAMPLES ) * rect->w, top,
+ rect->w / (float)SPEEDOMETER_NUM_SAMPLES, val * rect->h / max,
+ cgs.media.whiteShader );
+ }
+ trap_R_SetColor( NULL );
+}
+
+static void CG_DrawSpeedText( rectDef_t *rect, float text_x, float text_y,
+ float scale, vec4_t foreColor )
+{
+ char speedstr[ 16 ];
+ float val;
+ vec4_t color;
+
+ VectorCopy( foreColor, color );
+ color[ 3 ] = 1;
+
+ if( oldestSpeedSample == 0 )
+ val = speedSamples[ SPEEDOMETER_NUM_SAMPLES - 1 ];
+ else
+ val = speedSamples[ oldestSpeedSample - 1 ];
+
+ Com_sprintf( speedstr, sizeof( speedstr ), "%d", (int)val );
+
+ UI_Text_Paint(
+ rect->x + ( rect->w - UI_Text_Width( speedstr, scale, 0 ) ) / 2.0f,
+ rect->y + ( rect->h + UI_Text_Height( speedstr, scale, 0 ) ) / 2.0f,
+ scale, color, speedstr, 0, 0, ITEM_TEXTSTYLE_NORMAL );
+}
+
+static void CG_DrawSpeed( rectDef_t *rect, float text_x, float text_y,
+ float scale, vec4_t foreColor, vec4_t backColor )
+{
+ if( cg_drawSpeed.integer & SPEEDOMETER_DRAW_GRAPH )
+ CG_DrawSpeedGraph( rect, foreColor, backColor );
+ if( cg_drawSpeed.integer & SPEEDOMETER_DRAW_TEXT )
+ CG_DrawSpeedText( rect, text_x, text_y, scale, foreColor );
+}
+
/*
===================
CG_DrawConsole
@@ -2565,6 +2698,9 @@ void CG_OwnerDraw( float x, float y, float w, float h, float text_x,
case CG_TEAMOVERLAY:
CG_DrawTeamOverlay( &rect, scale, foreColor );
break;
+ case CG_SPEEDOMETER:
+ CG_DrawSpeed( &rect, text_x, text_y, scale, foreColor, backColor );
+ break;
case CG_DEMO_PLAYBACK:
CG_DrawDemoPlayback( &rect, foreColor, shader );
diff --git a/src/cgame/cg_local.h b/src/cgame/cg_local.h
index 7302ac78..22d312d9 100644
--- a/src/cgame/cg_local.h
+++ b/src/cgame/cg_local.h
@@ -1474,6 +1474,7 @@ extern vmCvar_t cg_thirdPersonPitchFollow;
extern vmCvar_t cg_thirdPersonRange;
extern vmCvar_t cg_stereoSeparation;
extern vmCvar_t cg_lagometer;
+extern vmCvar_t cg_drawSpeed;
extern vmCvar_t cg_synchronousClients;
extern vmCvar_t cg_stats;
extern vmCvar_t cg_paused;
@@ -1615,6 +1616,7 @@ char CG_GetColorCharForHealth( int clientnum );
void CG_AddLagometerFrameInfo( void );
void CG_AddLagometerSnapshotInfo( snapshot_t *snap );
+void CG_AddSpeed( void );
void CG_CenterPrint( const char *str, int y, int charWidth );
void CG_DrawActive( stereoFrame_t stereoView );
void CG_OwnerDraw( float x, float y, float w, float h, float text_x,
diff --git a/src/cgame/cg_main.c b/src/cgame/cg_main.c
index bd3acec5..562b8038 100644
--- a/src/cgame/cg_main.c
+++ b/src/cgame/cg_main.c
@@ -149,6 +149,7 @@ vmCvar_t cg_thirdPersonPitchFollow;
vmCvar_t cg_thirdPersonRange;
vmCvar_t cg_stereoSeparation;
vmCvar_t cg_lagometer;
+vmCvar_t cg_drawSpeed;
vmCvar_t cg_synchronousClients;
vmCvar_t cg_stats;
vmCvar_t cg_paused;
@@ -245,6 +246,7 @@ static cvarTable_t cvarTable[ ] =
{ &cg_crosshairSize, "cg_crosshairSize", "1", CVAR_ARCHIVE },
{ &cg_addMarks, "cg_marks", "1", CVAR_ARCHIVE },
{ &cg_lagometer, "cg_lagometer", "0", CVAR_ARCHIVE },
+ { &cg_drawSpeed, "cg_drawSpeed", "0", CVAR_ARCHIVE },
{ &cg_teslaTrailTime, "cg_teslaTrailTime", "250", CVAR_ARCHIVE },
{ &cg_gun_x, "cg_gunX", "0", CVAR_CHEAT },
{ &cg_gun_y, "cg_gunY", "0", CVAR_CHEAT },
diff --git a/src/cgame/cg_view.c b/src/cgame/cg_view.c
index 85d5bea9..02284fca 100644
--- a/src/cgame/cg_view.c
+++ b/src/cgame/cg_view.c
@@ -1437,6 +1437,9 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demo
cg.renderingThirdPerson = ( cg_thirdPerson.integer || ( cg.snap->ps.stats[ STAT_HEALTH ] <= 0 ) ||
( cg.chaseFollow && cg.snap->ps.pm_flags & PMF_FOLLOW) );
+ // update speedometer
+ CG_AddSpeed( );
+
// build cg.refdef
inwater = CG_CalcViewValues( );