2010-11-20 10:37:14 +00:00
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
/* If you are missing that file, acquire a complete release at teeworlds.com. */
2010-05-29 07:25:38 +00:00
# include <engine/graphics.h>
2020-09-26 19:41:58 +00:00
# include <engine/shared/config.h>
2010-05-29 07:25:38 +00:00
# include <engine/textrender.h>
2008-08-27 15:48:50 +00:00
2020-09-26 19:41:58 +00:00
# include <game/generated/protocol.h>
2008-08-27 15:48:50 +00:00
2020-09-26 19:41:58 +00:00
# include <game/client/gameclient.h>
2022-05-29 16:33:38 +00:00
# include <game/client/prediction/entities/character.h>
# include <game/localization.h>
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
# include "debughud.h"
2008-08-27 15:48:50 +00:00
2010-05-29 07:25:38 +00:00
void CDebugHud : : RenderNetCorrections ( )
2008-08-27 15:48:50 +00:00
{
2010-09-12 10:55:37 +00:00
if ( ! g_Config . m_Debug | | g_Config . m_DbgGraphs | | ! m_pClient - > m_Snap . m_pLocalCharacter | | ! m_pClient - > m_Snap . m_pLocalPrevCharacter )
2008-08-27 15:48:50 +00:00
return ;
2023-08-05 21:18:08 +00:00
const float Height = 300.0f ;
const float Width = Height * Graphics ( ) - > ScreenAspect ( ) ;
Graphics ( ) - > MapScreen ( 0.0f , 0.0f , Width , Height ) ;
const float Velspeed = length ( vec2 ( m_pClient - > m_Snap . m_pLocalCharacter - > m_VelX / 256.0f , m_pClient - > m_Snap . m_pLocalCharacter - > m_VelY / 256.0f ) ) * Client ( ) - > GameTickSpeed ( ) ;
const float VelspeedX = m_pClient - > m_Snap . m_pLocalCharacter - > m_VelX / 256.0f * Client ( ) - > GameTickSpeed ( ) ;
const float VelspeedY = m_pClient - > m_Snap . m_pLocalCharacter - > m_VelY / 256.0f * Client ( ) - > GameTickSpeed ( ) ;
const float Ramp = VelocityRamp ( Velspeed , m_pClient - > m_aTuning [ g_Config . m_ClDummy ] . m_VelrampStart , m_pClient - > m_aTuning [ g_Config . m_ClDummy ] . m_VelrampRange , m_pClient - > m_aTuning [ g_Config . m_ClDummy ] . m_VelrampCurvature ) ;
const CCharacter * pCharacter = m_pClient - > m_GameWorld . GetCharacterByID ( m_pClient - > m_Snap . m_LocalClientID ) ;
2011-04-13 18:37:12 +00:00
2023-08-05 21:18:08 +00:00
const float FontSize = 5.0f ;
const float LineHeight = FontSize + 1.0f ;
2011-04-13 18:37:12 +00:00
2023-08-05 21:18:08 +00:00
float y = 50.0f ;
char aBuf [ 128 ] ;
const auto & & RenderRow = [ & ] ( const char * pLabel , const char * pValue ) {
TextRender ( ) - > Text ( Width - 100.0f , y , FontSize , pLabel ) ;
TextRender ( ) - > Text ( Width - 10.0f - TextRender ( ) - > TextWidth ( FontSize , pValue ) , y , FontSize , pValue ) ;
y + = LineHeight ;
} ;
2010-08-13 01:07:51 +00:00
2023-08-05 21:18:08 +00:00
TextRender ( ) - > TextColor ( TextRender ( ) - > DefaultTextColor ( ) ) ;
2010-08-13 01:07:51 +00:00
2022-06-15 08:52:29 +00:00
str_format ( aBuf , sizeof ( aBuf ) , " %.0f Bps " , Velspeed / 32 ) ;
2023-08-05 21:18:08 +00:00
RenderRow ( " Velspeed: " , aBuf ) ;
2022-06-15 08:52:29 +00:00
str_format ( aBuf , sizeof ( aBuf ) , " %.0f Bps " , VelspeedX / 32 * Ramp ) ;
2023-08-05 21:18:08 +00:00
RenderRow ( " Velspeed.x * Ramp: " , aBuf ) ;
2022-06-15 08:52:29 +00:00
str_format ( aBuf , sizeof ( aBuf ) , " %.0f Bps " , VelspeedY / 32 ) ;
2023-08-05 21:18:08 +00:00
RenderRow ( " Velspeed.y: " , aBuf ) ;
2010-08-13 01:07:51 +00:00
str_format ( aBuf , sizeof ( aBuf ) , " %.2f " , Ramp ) ;
2023-08-05 21:18:08 +00:00
RenderRow ( " Ramp: " , aBuf ) ;
2023-08-20 11:03:01 +00:00
str_from_int ( pCharacter = = nullptr ? - 1 : pCharacter - > m_TeleCheckpoint , aBuf ) ;
2023-08-05 21:18:08 +00:00
RenderRow ( " Checkpoint: " , aBuf ) ;
2023-08-20 11:03:01 +00:00
str_from_int ( pCharacter = = nullptr ? - 1 : pCharacter - > m_TuneZone , aBuf ) ;
2023-08-05 21:18:08 +00:00
RenderRow ( " Tune zone: " , aBuf ) ;
2022-03-21 06:10:44 +00:00
str_format ( aBuf , sizeof ( aBuf ) , " %.2f " , m_pClient - > m_Snap . m_pLocalCharacter - > m_X / 32.0f ) ;
2023-08-05 21:18:08 +00:00
RenderRow ( " Pos.x: " , aBuf ) ;
2022-03-21 06:10:44 +00:00
str_format ( aBuf , sizeof ( aBuf ) , " %.2f " , m_pClient - > m_Snap . m_pLocalCharacter - > m_Y / 32.0f ) ;
2023-08-05 21:18:08 +00:00
RenderRow ( " Pos.y: " , aBuf ) ;
2023-08-20 11:03:01 +00:00
str_from_int ( m_pClient - > m_Snap . m_pLocalCharacter - > m_Angle , aBuf ) ;
2023-08-05 21:18:08 +00:00
RenderRow ( " Angle: " , aBuf ) ;
2023-08-20 11:03:01 +00:00
str_from_int ( m_pClient - > NetobjNumCorrections ( ) , aBuf ) ;
2023-08-05 21:18:08 +00:00
RenderRow ( " Netobj corrections " , aBuf ) ;
RenderRow ( " on: " , m_pClient - > NetobjCorrectedOn ( ) ) ;
2008-08-27 15:48:50 +00:00
}
2010-05-29 07:25:38 +00:00
void CDebugHud : : RenderTuning ( )
2008-08-27 15:48:50 +00:00
{
2023-08-05 21:27:59 +00:00
enum
{
DBG_TUNING_OFF = 0 ,
DBG_TUNING_SHOW_CHANGED ,
DBG_TUNING_SHOW_ALL ,
} ;
if ( g_Config . m_DbgTuning = = DBG_TUNING_OFF )
2008-08-27 15:48:50 +00:00
return ;
2011-04-13 18:37:12 +00:00
2023-08-05 21:27:59 +00:00
const CCharacter * pCharacter = m_pClient - > m_GameWorld . GetCharacterByID ( m_pClient - > m_Snap . m_LocalClientID ) ;
2011-04-13 18:37:12 +00:00
2023-08-05 21:27:59 +00:00
const CTuningParams StandardTuning ;
const CTuningParams * pGlobalTuning = m_pClient - > GetTuning ( 0 ) ;
const CTuningParams * pZoneTuning = ! m_pClient - > m_GameWorld . m_WorldConfig . m_UseTuneZones | | pCharacter = = nullptr ? nullptr : m_pClient - > GetTuning ( pCharacter - > m_TuneZone ) ;
const CTuningParams * pActiveTuning = pZoneTuning = = nullptr ? pGlobalTuning : pZoneTuning ;
2011-04-13 18:37:12 +00:00
2023-08-05 21:27:59 +00:00
const float Height = 300.0f ;
const float Width = Height * Graphics ( ) - > ScreenAspect ( ) ;
Graphics ( ) - > MapScreen ( 0.0f , 0.0f , Width , Height ) ;
2011-04-13 18:37:12 +00:00
2023-08-05 21:27:59 +00:00
const float FontSize = 5.0f ;
const float StartY = 50.0f ;
float y = StartY ;
float StartX = 30.0f ;
const auto & & RenderRow = [ & ] ( const char * pCol1 , const char * pCol2 , const char * pCol3 ) {
float x = StartX ;
TextRender ( ) - > Text ( x - TextRender ( ) - > TextWidth ( FontSize , pCol1 ) , y , FontSize , pCol1 ) ;
x + = 30.0f ;
TextRender ( ) - > Text ( x - TextRender ( ) - > TextWidth ( FontSize , pCol2 ) , y , FontSize , pCol2 ) ;
x + = 10.0f ;
TextRender ( ) - > Text ( x , y , FontSize , pCol3 ) ;
2008-08-27 15:48:50 +00:00
2023-08-05 21:27:59 +00:00
y + = FontSize + 1.0f ;
2011-04-13 18:37:12 +00:00
2023-08-05 21:27:59 +00:00
if ( y > = Height - 80.0f )
{
y = StartY ;
StartX + = 130.0f ;
}
} ;
2008-08-27 15:48:50 +00:00
2023-08-05 21:27:59 +00:00
for ( int i = 0 ; i < CTuningParams : : Num ( ) ; i + + )
{
float CurrentGlobal , CurrentZone , Standard ;
pGlobalTuning - > Get ( i , & CurrentGlobal ) ;
if ( pZoneTuning = = nullptr )
CurrentZone = 0.0f ;
else
pZoneTuning - > Get ( i , & CurrentZone ) ;
StandardTuning . Get ( i , & Standard ) ;
2008-08-27 15:48:50 +00:00
2023-08-05 21:27:59 +00:00
if ( g_Config . m_DbgTuning = = DBG_TUNING_SHOW_CHANGED & & Standard = = CurrentGlobal & & ( pZoneTuning = = nullptr | | Standard = = CurrentZone ) )
continue ; // skip unchanged params
2011-04-13 18:37:12 +00:00
2023-08-05 21:27:59 +00:00
if ( y = = StartY )
{
TextRender ( ) - > TextColor ( TextRender ( ) - > DefaultTextColor ( ) ) ;
RenderRow ( " Standard " , " Current " , " Tuning " ) ;
}
ColorRGBA TextColor ;
if ( g_Config . m_DbgTuning = = DBG_TUNING_SHOW_ALL & & Standard = = CurrentGlobal & & ( pZoneTuning = = nullptr | | Standard = = CurrentZone ) )
TextColor = ColorRGBA ( 0.75f , 0.75f , 0.75f , 1.0f ) ; // grey: value unchanged globally and in current zone
else if ( Standard = = CurrentGlobal & & pZoneTuning ! = nullptr & & Standard ! = CurrentZone )
TextColor = ColorRGBA ( 0.6f , 0.6f , 1.0f , 1.0f ) ; // blue: value changed only in current zone
else if ( Standard ! = CurrentGlobal & & pZoneTuning ! = nullptr & & Standard = = CurrentZone )
TextColor = ColorRGBA ( 0.4f , 1.0f , 0.4f , 1.0f ) ; // green: value changed globally but reset to default by tune zone
else
TextColor = ColorRGBA ( 1.0f , 0.5f , 0.5f , 1.0f ) ; // red: value changed globally
TextRender ( ) - > TextColor ( TextColor ) ;
char aBufStandard [ 32 ] ;
str_format ( aBufStandard , sizeof ( aBufStandard ) , " %.2f " , Standard ) ;
char aBufCurrent [ 32 ] ;
str_format ( aBufCurrent , sizeof ( aBufCurrent ) , " %.2f " , pZoneTuning = = nullptr ? CurrentGlobal : CurrentZone ) ;
RenderRow ( aBufStandard , aBufCurrent , CTuningParams : : Name ( i ) ) ;
2008-08-27 15:48:50 +00:00
}
2011-04-13 18:37:12 +00:00
2023-08-05 21:27:59 +00:00
TextRender ( ) - > TextColor ( TextRender ( ) - > DefaultTextColor ( ) ) ;
if ( g_Config . m_DbgTuning = = DBG_TUNING_SHOW_CHANGED )
return ;
// Render Velspeed.X * Ramp Graphs
Graphics ( ) - > MapScreen ( 0.0f , 0.0f , Graphics ( ) - > ScreenWidth ( ) , Graphics ( ) - > ScreenHeight ( ) ) ;
const float GraphSpacing = Graphics ( ) - > ScreenWidth ( ) / 100.0f ;
const float GraphW = Graphics ( ) - > ScreenWidth ( ) / 4.0f ;
const float GraphH = Graphics ( ) - > ScreenHeight ( ) / 6.0f ;
const float GraphX = GraphW ;
const float GraphY = Graphics ( ) - > ScreenHeight ( ) - GraphH - GraphSpacing ;
2022-04-14 11:31:00 +00:00
const int StepSizeRampGraph = 270 ;
const int StepSizeZoomedInGraph = 14 ;
2023-08-05 21:27:59 +00:00
if ( m_OldVelrampStart ! = pActiveTuning - > m_VelrampStart | | m_OldVelrampRange ! = pActiveTuning - > m_VelrampRange | | m_OldVelrampCurvature ! = pActiveTuning - > m_VelrampCurvature )
2008-08-27 15:48:50 +00:00
{
2023-08-05 21:27:59 +00:00
m_OldVelrampStart = pActiveTuning - > m_VelrampStart ;
m_OldVelrampRange = pActiveTuning - > m_VelrampRange ;
m_OldVelrampCurvature = pActiveTuning - > m_VelrampCurvature ;
2022-04-14 11:31:00 +00:00
m_RampGraph . Init ( 0.0f , 0.0f ) ;
m_SpeedTurningPoint = 0 ;
2023-08-05 21:27:59 +00:00
float PreviousRampedSpeed = 1.0f ;
2022-08-12 12:01:46 +00:00
for ( size_t i = 0 ; i < CGraph : : MAX_VALUES ; i + + )
2022-04-14 11:31:00 +00:00
{
// This is a calculation of the speed values per second on the X axis, from 270 to 34560 in steps of 270
2023-08-05 21:27:59 +00:00
const float Speed = ( i + 1 ) * StepSizeRampGraph ;
const float Ramp = VelocityRamp ( Speed , m_pClient - > m_aTuning [ g_Config . m_ClDummy ] . m_VelrampStart , m_pClient - > m_aTuning [ g_Config . m_ClDummy ] . m_VelrampRange , m_pClient - > m_aTuning [ g_Config . m_ClDummy ] . m_VelrampCurvature ) ;
const float RampedSpeed = Speed * Ramp ;
if ( RampedSpeed > = PreviousRampedSpeed )
2022-04-14 11:31:00 +00:00
{
2023-10-17 16:00:13 +00:00
m_RampGraph . InsertAt ( i , RampedSpeed / 32 , ColorRGBA ( 0.0f , 1.0f , 0.0f , 0.75f ) ) ;
2022-04-14 11:31:00 +00:00
m_SpeedTurningPoint = Speed ;
}
else
{
2023-10-17 16:00:13 +00:00
m_RampGraph . InsertAt ( i , RampedSpeed / 32 , ColorRGBA ( 1.0f , 0.0f , 0.0f , 0.75f ) ) ;
2022-04-14 11:31:00 +00:00
}
2023-08-05 21:27:59 +00:00
PreviousRampedSpeed = RampedSpeed ;
2022-04-14 11:31:00 +00:00
}
2022-08-12 11:58:07 +00:00
m_RampGraph . Scale ( ) ;
2022-04-14 11:31:00 +00:00
m_ZoomedInGraph . Init ( 0.0f , 0.0f ) ;
2023-08-05 21:27:59 +00:00
PreviousRampedSpeed = 1.0f ;
2022-04-14 11:31:00 +00:00
MiddleOfZoomedInGraph = m_SpeedTurningPoint ;
2022-08-12 12:01:46 +00:00
for ( size_t i = 0 ; i < CGraph : : MAX_VALUES ; i + + )
2022-04-14 11:31:00 +00:00
{
// This is a calculation of the speed values per second on the X axis, from (MiddleOfZoomedInGraph - 64 * StepSize) to (MiddleOfZoomedInGraph + 64 * StepSize)
2023-08-05 21:27:59 +00:00
const float Speed = MiddleOfZoomedInGraph - 64 * StepSizeZoomedInGraph + i * StepSizeZoomedInGraph ;
const float Ramp = VelocityRamp ( Speed , m_pClient - > m_aTuning [ g_Config . m_ClDummy ] . m_VelrampStart , m_pClient - > m_aTuning [ g_Config . m_ClDummy ] . m_VelrampRange , m_pClient - > m_aTuning [ g_Config . m_ClDummy ] . m_VelrampCurvature ) ;
const float RampedSpeed = Speed * Ramp ;
if ( RampedSpeed > = PreviousRampedSpeed )
2022-04-14 11:31:00 +00:00
{
2023-10-17 16:00:13 +00:00
m_ZoomedInGraph . InsertAt ( i , RampedSpeed / 32 , ColorRGBA ( 0.0f , 1.0f , 0.0f , 0.75f ) ) ;
2022-04-14 11:31:00 +00:00
m_SpeedTurningPoint = Speed ;
}
else
{
2023-10-17 16:00:13 +00:00
m_ZoomedInGraph . InsertAt ( i , RampedSpeed / 32 , ColorRGBA ( 1.0f , 0.0f , 0.0f , 0.75f ) ) ;
2022-04-14 11:31:00 +00:00
}
if ( i = = 0 )
{
2022-08-12 12:23:50 +00:00
m_ZoomedInGraph . SetMin ( RampedSpeed ) ;
2022-04-14 11:31:00 +00:00
}
2023-08-05 21:27:59 +00:00
PreviousRampedSpeed = RampedSpeed ;
2022-04-14 11:31:00 +00:00
}
2022-08-12 11:58:07 +00:00
m_ZoomedInGraph . Scale ( ) ;
2008-08-27 15:48:50 +00:00
}
2023-08-05 21:27:59 +00:00
const float GraphFontSize = 12.0f ;
2022-04-14 11:31:00 +00:00
char aBuf [ 128 ] ;
2023-08-05 21:27:59 +00:00
str_format ( aBuf , sizeof ( aBuf ) , " Velspeed.X * Ramp in Bps (Velspeed %d to %d) " , StepSizeRampGraph / 32 , 128 * StepSizeRampGraph / 32 ) ;
m_RampGraph . Render ( Graphics ( ) , TextRender ( ) , GraphX , GraphY , GraphW , GraphH , aBuf ) ;
2022-04-14 11:31:00 +00:00
str_format ( aBuf , sizeof ( aBuf ) , " Max Velspeed before it ramps off: %.2f Bps " , m_SpeedTurningPoint / 32 ) ;
2023-08-05 21:27:59 +00:00
TextRender ( ) - > Text ( GraphX , GraphY - GraphFontSize , GraphFontSize , aBuf ) ;
2022-04-14 11:31:00 +00:00
str_format ( aBuf , sizeof ( aBuf ) , " Zoomed in on turning point (Velspeed %d to %d) " , ( ( int ) MiddleOfZoomedInGraph - 64 * StepSizeZoomedInGraph ) / 32 , ( ( int ) MiddleOfZoomedInGraph + 64 * StepSizeZoomedInGraph ) / 32 ) ;
2023-08-05 21:27:59 +00:00
m_ZoomedInGraph . Render ( Graphics ( ) , TextRender ( ) , GraphX + GraphW + GraphSpacing , GraphY , GraphW , GraphH , aBuf ) ;
2008-08-27 15:48:50 +00:00
}
2020-11-03 07:03:24 +00:00
void CDebugHud : : RenderHint ( )
{
if ( ! g_Config . m_Debug )
return ;
2023-08-02 20:14:39 +00:00
const float Height = 300.0f ;
const float Width = Height * Graphics ( ) - > ScreenAspect ( ) ;
Graphics ( ) - > MapScreen ( 0.0f , 0.0f , Width , Height ) ;
const float FontSize = 5.0f ;
const float Spacing = 5.0f ;
TextRender ( ) - > TextColor ( TextRender ( ) - > DefaultTextColor ( ) ) ;
TextRender ( ) - > Text ( Spacing , Height - FontSize - Spacing , FontSize , Localize ( " Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. " ) ) ;
2020-11-03 07:03:24 +00:00
}
2010-05-29 07:25:38 +00:00
void CDebugHud : : OnRender ( )
2008-08-27 15:48:50 +00:00
{
2010-05-29 07:25:38 +00:00
RenderTuning ( ) ;
RenderNetCorrections ( ) ;
2020-11-03 07:03:24 +00:00
RenderHint ( ) ;
2008-08-27 15:48:50 +00:00
}