summaryrefslogtreecommitdiff
path: root/common/vgui/vgui_budgetbargraphpanel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'common/vgui/vgui_budgetbargraphpanel.cpp')
-rw-r--r--common/vgui/vgui_budgetbargraphpanel.cpp252
1 files changed, 252 insertions, 0 deletions
diff --git a/common/vgui/vgui_budgetbargraphpanel.cpp b/common/vgui/vgui_budgetbargraphpanel.cpp
new file mode 100644
index 0000000..2db8fad
--- /dev/null
+++ b/common/vgui/vgui_budgetbargraphpanel.cpp
@@ -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();
+ }
+}
+