You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
252 lines
6.9 KiB
252 lines
6.9 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=============================================================================// |
|
|
|
#include "vgui_budgetbargraphpanel.h" |
|
#include "vgui_basebudgetpanel.h" |
|
#include <vgui/ISurface.h> |
|
#include "vgui_controls/Label.h" |
|
#include "convar.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
ConVar budget_bargraph_background_alpha( "budget_bargraph_background_alpha", "128", FCVAR_ARCHIVE, "how translucent the budget panel is" ); |
|
|
|
ConVar budget_peaks_window( "budget_peaks_window", "30", FCVAR_ARCHIVE, "number of frames to look at when figuring out peak frametimes" ); |
|
ConVar budget_averages_window( "budget_averages_window", "30", FCVAR_ARCHIVE, "number of frames to look at when figuring out average frametimes" ); |
|
ConVar budget_show_peaks( "budget_show_peaks", "1", FCVAR_ARCHIVE, "enable/disable peaks in the budget panel" ); |
|
ConVar budget_show_averages( "budget_show_averages", "0", FCVAR_ARCHIVE, "enable/disable averages in the budget panel" ); |
|
|
|
|
|
CBudgetBarGraphPanel::CBudgetBarGraphPanel( CBaseBudgetPanel *pParent, const char *pPanelName ) : |
|
BaseClass( pParent, pPanelName ) |
|
{ |
|
m_pBudgetPanel = pParent; |
|
|
|
SetProportional( false ); |
|
SetKeyBoardInputEnabled( false ); |
|
SetMouseInputEnabled( false ); |
|
SetVisible( true ); |
|
|
|
SetPaintBackgroundEnabled( true ); |
|
SetBgColor( Color( 255, 0, 0, budget_bargraph_background_alpha.GetInt() ) ); |
|
} |
|
|
|
CBudgetBarGraphPanel::~CBudgetBarGraphPanel() |
|
{ |
|
} |
|
|
|
void CBudgetBarGraphPanel::GetBudgetGroupTopAndBottom( int id, int &top, int &bottom ) |
|
{ |
|
// Ask where the corresponding graph label is. |
|
m_pBudgetPanel->GetGraphLabelScreenSpaceTopAndBottom( id, top, bottom ); |
|
int tall = bottom - top; |
|
|
|
int x = 0; |
|
ScreenToLocal( x, top ); |
|
|
|
bottom = top + tall; |
|
} |
|
|
|
void CBudgetBarGraphPanel::DrawBarAtIndex( int id, float percent ) |
|
{ |
|
int panelWidth, panelHeight; |
|
GetSize( panelWidth, panelHeight ); |
|
|
|
int top, bottom; |
|
GetBudgetGroupTopAndBottom( id, top, bottom ); |
|
|
|
int left = 0; |
|
int right = panelWidth * percent; |
|
|
|
int red, green, blue, alpha; |
|
m_pBudgetPanel->GetConfigData().m_BudgetGroupInfo[id].m_Color.GetColor( red, green, blue, alpha ); |
|
|
|
// DrawFilledRect is panel relative |
|
vgui::surface()->DrawSetColor( 0, 0, 0, alpha ); |
|
vgui::surface()->DrawFilledRect( left, top, right+2, bottom ); |
|
|
|
vgui::surface()->DrawSetColor( 255, 255, 255, alpha ); |
|
vgui::surface()->DrawFilledRect( left, top+1, right+1, bottom-1 ); |
|
|
|
vgui::surface()->DrawSetColor( red, green, blue, alpha ); |
|
vgui::surface()->DrawFilledRect( left, top+2, right, bottom-2 ); |
|
} |
|
|
|
void CBudgetBarGraphPanel::DrawTickAtIndex( int id, float percent, int red, int green, int blue, int alpha ) |
|
{ |
|
if( percent > 1.0f ) |
|
{ |
|
percent = 1.0f; |
|
} |
|
int panelWidth, panelHeight; |
|
GetSize( panelWidth, panelHeight ); |
|
|
|
int top, bottom; |
|
GetBudgetGroupTopAndBottom( id, top, bottom ); |
|
|
|
int right = ( int )( panelWidth * percent + 1.0f ); |
|
int left = right - 2; |
|
|
|
// DrawFilledRect is panel relative |
|
vgui::surface()->DrawSetColor( 0, 0, 0, alpha ); |
|
vgui::surface()->DrawFilledRect( left-2, top, right+2, bottom ); |
|
|
|
vgui::surface()->DrawSetColor( 255, 255, 255, alpha ); |
|
vgui::surface()->DrawFilledRect( left-1, top+1, right+1, bottom-1 ); |
|
|
|
vgui::surface()->DrawSetColor( red, green, blue, alpha ); |
|
vgui::surface()->DrawFilledRect( left, top+2, right, bottom-2 ); |
|
} |
|
|
|
void CBudgetBarGraphPanel::DrawTimeLines( void ) |
|
{ |
|
int panelWidth, panelHeight; |
|
GetSize( panelWidth, panelHeight ); |
|
int i; |
|
int left, right, top, bottom; |
|
top = 0; |
|
bottom = panelHeight; |
|
|
|
const CBudgetPanelConfigData &config = m_pBudgetPanel->GetConfigData(); |
|
|
|
float flValueInterval = config.m_flTimeLabelInterval; |
|
if ( config.m_nLinesPerTimeLabel != 0.0f ) |
|
{ |
|
flValueInterval = config.m_flTimeLabelInterval / config.m_nLinesPerTimeLabel; |
|
} |
|
|
|
int nTotalLines = config.m_flBarGraphRange; |
|
if ( flValueInterval != 0.0f ) |
|
{ |
|
nTotalLines /= flValueInterval; |
|
} |
|
nTotalLines += 2; |
|
|
|
for( i = 0; i < nTotalLines; i++ ) |
|
{ |
|
int alpha; |
|
if( i % (config.m_nLinesPerTimeLabel*2) == 0 ) |
|
{ |
|
alpha = 150; |
|
} |
|
else if( i % config.m_nLinesPerTimeLabel == 0 ) |
|
{ |
|
alpha = 100; |
|
} |
|
else |
|
{ |
|
alpha = 50; |
|
} |
|
|
|
float flTemp = ( config.m_flBarGraphRange != 0.0f ) ? ( flValueInterval / config.m_flBarGraphRange ) : flValueInterval; |
|
left = -0.5f + panelWidth * ( float )( i * flTemp ); |
|
right = left + 1; |
|
|
|
vgui::surface()->DrawSetColor( 0, 0, 0, alpha ); |
|
vgui::surface()->DrawFilledRect( left-1, top, right+1, bottom ); |
|
|
|
vgui::surface()->DrawSetColor( 255, 255, 255, alpha ); |
|
vgui::surface()->DrawFilledRect( left, top+1, right, bottom-1 ); |
|
} |
|
} |
|
|
|
void CBudgetBarGraphPanel::DrawInstantaneous() |
|
{ |
|
int nGroups, nSamplesPerGroup, nSampleOffset; |
|
const double *pBudgetGroupTimes = m_pBudgetPanel->GetBudgetGroupData( nGroups, nSamplesPerGroup, nSampleOffset ); |
|
if( !pBudgetGroupTimes ) |
|
{ |
|
return; |
|
} |
|
|
|
int i; |
|
for( i = 0; i < nGroups; i++ ) |
|
{ |
|
float percent = m_pBudgetPanel->GetBudgetGroupPercent( pBudgetGroupTimes[nSamplesPerGroup * i + nSampleOffset] ); |
|
DrawBarAtIndex( i, percent ); |
|
} |
|
} |
|
|
|
void CBudgetBarGraphPanel::DrawPeaks() |
|
{ |
|
int nGroups, nSamplesPerGroup, nSampleOffset; |
|
const double *pBudgetGroupTimes = m_pBudgetPanel->GetBudgetGroupData( nGroups, nSamplesPerGroup, nSampleOffset ); |
|
if( !pBudgetGroupTimes ) |
|
{ |
|
return; |
|
} |
|
int numSamples = budget_peaks_window.GetInt(); |
|
int i; |
|
for( i = 0; i < nGroups; i++ ) |
|
{ |
|
double max = 0; |
|
int j; |
|
for( j = 0; j < numSamples; j++ ) |
|
{ |
|
double tmp; |
|
int offset = ( nSampleOffset - j + BUDGET_HISTORY_COUNT ) % BUDGET_HISTORY_COUNT; |
|
tmp = pBudgetGroupTimes[i * nSamplesPerGroup + offset]; |
|
if( tmp > max ) |
|
{ |
|
max = tmp; |
|
} |
|
} |
|
float percent = m_pBudgetPanel->GetBudgetGroupPercent( max ); |
|
DrawTickAtIndex( i, percent, 255, 0, 0, 255 ); |
|
} |
|
} |
|
|
|
void CBudgetBarGraphPanel::DrawAverages() |
|
{ |
|
int nGroups, nSamplesPerGroup, nSampleOffset; |
|
const double *pBudgetGroupTimes = m_pBudgetPanel->GetBudgetGroupData( nGroups, nSamplesPerGroup, nSampleOffset ); |
|
if( !pBudgetGroupTimes ) |
|
{ |
|
return; |
|
} |
|
int numSamples = budget_averages_window.GetInt(); |
|
int i; |
|
for( i = 0; i < nGroups; i++ ) |
|
{ |
|
int red, green, blue, alpha; |
|
m_pBudgetPanel->GetConfigData().m_BudgetGroupInfo[i].m_Color.GetColor( red, green, blue, alpha ); |
|
|
|
double sum = 0; |
|
int j; |
|
for( j = 0; j < numSamples; j++ ) |
|
{ |
|
int offset = ( nSampleOffset - j + BUDGET_HISTORY_COUNT ) % BUDGET_HISTORY_COUNT; |
|
sum += pBudgetGroupTimes[i * nSamplesPerGroup + offset]; |
|
} |
|
sum *= ( 1.0f / numSamples ); |
|
float percent = m_pBudgetPanel->GetBudgetGroupPercent( sum ); |
|
DrawTickAtIndex( i, percent, red, green, blue, alpha ); |
|
} |
|
} |
|
|
|
void CBudgetBarGraphPanel::Paint( void ) |
|
{ |
|
int width, height; |
|
GetSize( width, height ); |
|
|
|
if ( !m_pBudgetPanel->IsDedicated() ) |
|
{ |
|
SetBgColor( Color( 255, 0, 0, budget_bargraph_background_alpha.GetInt() ) ); |
|
} |
|
|
|
DrawTimeLines(); |
|
DrawInstantaneous(); |
|
if( budget_show_peaks.GetBool() ) |
|
{ |
|
DrawPeaks(); |
|
} |
|
if( budget_show_averages.GetBool() ) |
|
{ |
|
DrawAverages(); |
|
} |
|
} |
|
|
|
|