mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-09 18:29:35 +00:00
1
This commit is contained in:
@@ -0,0 +1,252 @@
|
||||
//========= 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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user