444 lines
12 KiB
C++
444 lines
12 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
//=============================================================================//
|
|
|
|
#include "vgui_basebudgetpanel.h"
|
|
#include "vgui_controls/Label.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
CBaseBudgetPanel::CBaseBudgetPanel( vgui::Panel *pParent, const char *pElementName )
|
|
: vgui::Panel( pParent, pElementName )
|
|
{
|
|
m_BudgetHistoryOffset = 0;
|
|
|
|
SetProportional( false );
|
|
SetKeyBoardInputEnabled( false );
|
|
SetMouseInputEnabled( false );
|
|
SetVisible( true );
|
|
|
|
// set the scheme before any child control is created
|
|
vgui::HScheme scheme = vgui::scheme()->LoadSchemeFromFile("resource/SourceScheme.res", "Client");
|
|
SetScheme( scheme );
|
|
|
|
m_pBudgetHistoryPanel = NULL;
|
|
m_pBudgetBarGraphPanel = NULL;
|
|
SetZPos( 1001 );
|
|
|
|
m_bDedicated = false;
|
|
}
|
|
|
|
|
|
CBaseBudgetPanel::~CBaseBudgetPanel()
|
|
{
|
|
}
|
|
|
|
|
|
float CBaseBudgetPanel::GetBudgetGroupPercent( float value )
|
|
{
|
|
if ( m_ConfigData.m_flBarGraphRange == 0.0f )
|
|
return 1.0f;
|
|
return value / m_ConfigData.m_flBarGraphRange;
|
|
}
|
|
|
|
|
|
const double *CBaseBudgetPanel::GetBudgetGroupData( int &nGroups, int &nSamplesPerGroup, int &nSampleOffset ) const
|
|
{
|
|
nGroups = m_ConfigData.m_BudgetGroupInfo.Count();
|
|
nSamplesPerGroup = BUDGET_HISTORY_COUNT;
|
|
nSampleOffset = m_BudgetHistoryOffset;
|
|
if( m_BudgetGroupTimes.Count() == 0 )
|
|
{
|
|
return NULL;
|
|
}
|
|
else
|
|
{
|
|
return &m_BudgetGroupTimes[0].m_Time[0];
|
|
}
|
|
}
|
|
|
|
|
|
void CBaseBudgetPanel::ClearTimesForAllGroupsForThisFrame( void )
|
|
{
|
|
int i;
|
|
for( i = 0; i < m_ConfigData.m_BudgetGroupInfo.Count(); i++ )
|
|
{
|
|
m_BudgetGroupTimes[i].m_Time[m_BudgetHistoryOffset] = 0.0;
|
|
}
|
|
}
|
|
|
|
void CBaseBudgetPanel::ClearAllTimesForGroup( int groupID )
|
|
{
|
|
int i;
|
|
for( i = 0; i < BUDGET_HISTORY_COUNT; i++ )
|
|
{
|
|
m_BudgetGroupTimes[groupID].m_Time[i] = 0.0;
|
|
}
|
|
}
|
|
|
|
|
|
void CBaseBudgetPanel::OnConfigDataChanged( const CBudgetPanelConfigData &data )
|
|
{
|
|
int oldNumGroups = m_ConfigData.m_BudgetGroupInfo.Count();
|
|
|
|
// Copy in the config data and rebuild everything.
|
|
Rebuild( data );
|
|
|
|
if ( m_ConfigData.m_BudgetGroupInfo.Count() > m_BudgetGroupTimes.Count() )
|
|
{
|
|
m_BudgetGroupTimes.EnsureCount( m_ConfigData.m_BudgetGroupInfo.Count() );
|
|
for ( int i = oldNumGroups; i < m_ConfigData.m_BudgetGroupInfo.Count(); i++ )
|
|
{
|
|
ClearAllTimesForGroup( i );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_BudgetGroupTimes.SetSize( m_ConfigData.m_BudgetGroupInfo.Count() );
|
|
for ( int i = 0; i < m_BudgetGroupTimes.Count(); i++ )
|
|
{
|
|
ClearAllTimesForGroup( i );
|
|
}
|
|
}
|
|
|
|
InvalidateLayout( false, true );
|
|
}
|
|
|
|
|
|
void CBaseBudgetPanel::ResetAll()
|
|
{
|
|
m_ConfigData.m_BudgetGroupInfo.Purge();
|
|
|
|
for ( int i=0; i < m_GraphLabels.Count(); i++ )
|
|
m_GraphLabels[i]->MarkForDeletion();
|
|
m_GraphLabels.Purge();
|
|
|
|
for ( int i=0; i < m_TimeLabels.Count(); i++ )
|
|
m_TimeLabels[i]->MarkForDeletion();
|
|
m_TimeLabels.Purge();
|
|
}
|
|
|
|
|
|
void CBaseBudgetPanel::Rebuild( const CBudgetPanelConfigData &data )
|
|
{
|
|
int oldNumBudgetGroups = m_ConfigData.m_BudgetGroupInfo.Count();
|
|
int oldNumHistoryLabels = m_ConfigData.m_HistoryLabelValues.Count();
|
|
|
|
int oldNumTimeLabels = m_TimeLabels.Count();
|
|
|
|
// Copy the new config in.
|
|
m_ConfigData = data;
|
|
|
|
int nParentWidth, nParentHeight;
|
|
GetParent()->GetSize( nParentWidth, nParentHeight );
|
|
if ( m_ConfigData.m_Width > nParentWidth )
|
|
{
|
|
m_ConfigData.m_Width = nParentWidth;
|
|
}
|
|
if ( m_ConfigData.m_Height > nParentHeight )
|
|
{
|
|
m_ConfigData.m_Height = nParentHeight;
|
|
}
|
|
if ( m_ConfigData.m_xCoord + m_ConfigData.m_Width > nParentWidth )
|
|
{
|
|
m_ConfigData.m_xCoord = nParentWidth - m_ConfigData.m_Width;
|
|
}
|
|
if ( m_ConfigData.m_yCoord + m_ConfigData.m_Height > nParentHeight )
|
|
{
|
|
m_ConfigData.m_yCoord = nParentHeight - m_ConfigData.m_Height;
|
|
}
|
|
|
|
// Recreate the history and bar graph panels.
|
|
if( m_pBudgetHistoryPanel )
|
|
{
|
|
m_pBudgetHistoryPanel->MarkForDeletion();
|
|
}
|
|
m_pBudgetHistoryPanel = new CBudgetHistoryPanel( this, "FrametimeHistory" );
|
|
|
|
if( m_pBudgetBarGraphPanel )
|
|
{
|
|
m_pBudgetBarGraphPanel->MarkForDeletion();
|
|
}
|
|
m_pBudgetBarGraphPanel = new CBudgetBarGraphPanel( this, "BudgetBarGraph" );
|
|
|
|
// Create any new labels we need.
|
|
int i;
|
|
|
|
if ( m_ConfigData.m_BudgetGroupInfo.Count() > m_GraphLabels.Count() )
|
|
{
|
|
m_GraphLabels.EnsureCount( m_ConfigData.m_BudgetGroupInfo.Count() );
|
|
for( i = oldNumBudgetGroups; i < m_ConfigData.m_BudgetGroupInfo.Count(); i++ )
|
|
{
|
|
const char *pBudgetGroupName = m_ConfigData.m_BudgetGroupInfo[i].m_Name.String();
|
|
m_GraphLabels[i] = new vgui::Label( this, pBudgetGroupName, pBudgetGroupName );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
while ( m_GraphLabels.Count() > m_ConfigData.m_BudgetGroupInfo.Count() )
|
|
{
|
|
m_GraphLabels[m_GraphLabels.Count()-1]->MarkForDeletion();
|
|
m_GraphLabels.Remove( m_GraphLabels.Count()-1 );
|
|
}
|
|
}
|
|
Assert( m_GraphLabels.Count() == m_ConfigData.m_BudgetGroupInfo.Count() );
|
|
|
|
|
|
// Create new history labels.
|
|
if ( m_ConfigData.m_HistoryLabelValues.Count() > m_HistoryLabels.Count() )
|
|
{
|
|
m_HistoryLabels.EnsureCount( m_ConfigData.m_HistoryLabelValues.Count() );
|
|
for ( i=oldNumHistoryLabels; i < m_HistoryLabels.Count(); i++ )
|
|
{
|
|
m_HistoryLabels[i] = new vgui::Label( this, "history label", "history label" );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
while ( m_HistoryLabels.Count() > m_ConfigData.m_HistoryLabelValues.Count() )
|
|
{
|
|
m_HistoryLabels[m_HistoryLabels.Count()-1]->MarkForDeletion();
|
|
m_HistoryLabels.Remove( m_HistoryLabels.Count()-1 );
|
|
}
|
|
}
|
|
SetHistoryLabelText();
|
|
|
|
|
|
// Note: the time lines still use milliseconds for the computations about where to draw them,
|
|
// but each BudgetGroupDataType_t has its own scale.
|
|
int nTimeLabels = m_ConfigData.m_flBarGraphRange + data.m_flTimeLabelInterval;
|
|
if ( data.m_flTimeLabelInterval != 0.0f )
|
|
{
|
|
nTimeLabels /= data.m_flTimeLabelInterval;
|
|
}
|
|
|
|
if ( nTimeLabels > m_TimeLabels.Count() )
|
|
{
|
|
m_TimeLabels.EnsureCount( nTimeLabels );
|
|
for( i = oldNumTimeLabels; i < m_TimeLabels.Count(); i++ )
|
|
{
|
|
char name[1024];
|
|
Q_snprintf( name, sizeof( name ), "time_label_%d", i );
|
|
m_TimeLabels[i] = new vgui::Label( this, name, "TEXT NOT SET YET" );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
while ( m_TimeLabels.Count() > nTimeLabels )
|
|
{
|
|
m_TimeLabels[m_TimeLabels.Count()-1]->MarkForDeletion();
|
|
m_TimeLabels.Remove( m_TimeLabels.Count()-1 );
|
|
}
|
|
}
|
|
|
|
SetTimeLabelText();
|
|
}
|
|
|
|
void CBaseBudgetPanel::UpdateWindowGeometry()
|
|
{
|
|
if( m_ConfigData.m_Width > BUDGET_HISTORY_COUNT )
|
|
{
|
|
m_ConfigData.m_Width = BUDGET_HISTORY_COUNT;
|
|
}
|
|
|
|
SetPos( m_ConfigData.m_xCoord, m_ConfigData.m_yCoord );
|
|
SetSize( m_ConfigData.m_Width, m_ConfigData.m_Height );
|
|
}
|
|
|
|
void CBaseBudgetPanel::PerformLayout()
|
|
{
|
|
if ( !m_pBudgetHistoryPanel || !m_pBudgetBarGraphPanel )
|
|
return;
|
|
|
|
|
|
int maxFPSLabelWidth = 0;
|
|
int i;
|
|
for( i = 0; i < m_HistoryLabels.Count(); i++ )
|
|
{
|
|
int labelWidth, labelHeight;
|
|
m_HistoryLabels[i]->GetContentSize( labelWidth, labelHeight );
|
|
if( labelWidth > maxFPSLabelWidth )
|
|
{
|
|
maxFPSLabelWidth = labelWidth;
|
|
}
|
|
}
|
|
|
|
m_pBudgetHistoryPanel->SetRange( 0, m_ConfigData.m_flHistoryRange );
|
|
|
|
|
|
float bottomOfHistoryPercentage = m_ConfigData.m_flBottomOfHistoryFraction;
|
|
UpdateWindowGeometry();
|
|
int x, y, totalWidth, totalHeight;
|
|
int totalHeightMinusTimeLabels;
|
|
GetPos( x, y );
|
|
GetSize( totalWidth, totalHeight );
|
|
|
|
int maxTimeLabelHeight = 0;
|
|
for( i = 0; i < m_TimeLabels.Count(); i++ )
|
|
{
|
|
int labelWidth, labelHeight;
|
|
m_TimeLabels[i]->GetContentSize( labelWidth, labelHeight );
|
|
maxTimeLabelHeight = max( maxTimeLabelHeight, labelHeight );
|
|
}
|
|
|
|
totalHeightMinusTimeLabels = totalHeight - maxTimeLabelHeight;
|
|
|
|
m_pBudgetHistoryPanel->SetPos( 0, 0 );
|
|
int budgetHistoryHeight = totalHeightMinusTimeLabels * bottomOfHistoryPercentage;
|
|
m_pBudgetHistoryPanel->SetSize( totalWidth - maxFPSLabelWidth,
|
|
budgetHistoryHeight );
|
|
|
|
int maxLabelWidth = 0;
|
|
for( i = 0; i < m_GraphLabels.Count(); i++ )
|
|
{
|
|
int width, height;
|
|
m_GraphLabels[i]->GetContentSize( width, height );
|
|
if( maxLabelWidth < width )
|
|
{
|
|
maxLabelWidth = width;
|
|
}
|
|
}
|
|
|
|
m_pBudgetBarGraphPanel->SetPos( maxLabelWidth,
|
|
totalHeightMinusTimeLabels * bottomOfHistoryPercentage );
|
|
m_pBudgetBarGraphPanel->SetSize( totalWidth - maxLabelWidth,
|
|
totalHeightMinusTimeLabels * ( 1 - bottomOfHistoryPercentage ) );
|
|
|
|
for( i = 0; i < m_GraphLabels.Count(); i++ )
|
|
{
|
|
m_GraphLabels[i]->SetPos( 0,
|
|
( bottomOfHistoryPercentage * totalHeightMinusTimeLabels ) +
|
|
( i * totalHeightMinusTimeLabels *
|
|
( 1 - bottomOfHistoryPercentage ) ) / m_ConfigData.m_BudgetGroupInfo.Count() );
|
|
// fudge height by 1 for rounding
|
|
m_GraphLabels[i]->SetSize( maxLabelWidth, 1 + ( totalHeightMinusTimeLabels *
|
|
( 1 - bottomOfHistoryPercentage ) ) / m_ConfigData.m_BudgetGroupInfo.Count() );
|
|
m_GraphLabels[i]->SetContentAlignment( vgui::Label::a_east );
|
|
}
|
|
|
|
// Note: the time lines still use milliseconds for the computations about where to draw them,
|
|
// but each BudgetGroupDataType_t has its own scale.
|
|
float fRange = m_ConfigData.m_flBarGraphRange;
|
|
for( i = 0; i < m_TimeLabels.Count(); i++ )
|
|
{
|
|
int labelWidth, labelHeight;
|
|
m_TimeLabels[i]->GetContentSize( labelWidth, labelHeight );
|
|
x = maxLabelWidth + ( i * m_ConfigData.m_flTimeLabelInterval ) / fRange * ( totalWidth - maxLabelWidth );
|
|
|
|
m_TimeLabels[i]->SetPos( x - ( labelWidth * 0.5 ), totalHeight - labelHeight );
|
|
m_TimeLabels[i]->SetSize( labelWidth, labelHeight );
|
|
m_TimeLabels[i]->SetContentAlignment( vgui::Label::a_east );
|
|
}
|
|
|
|
|
|
// position the fps labels
|
|
fRange = m_ConfigData.m_flHistoryRange;
|
|
for( i = 0; i < m_HistoryLabels.Count(); i++ )
|
|
{
|
|
int labelWidth, labelHeight;
|
|
m_HistoryLabels[i]->GetContentSize( labelWidth, labelHeight );
|
|
y = (fRange != 0) ? budgetHistoryHeight * m_ConfigData.m_HistoryLabelValues[i] / ( float )fRange : 0.0f;
|
|
int top = ( int )( budgetHistoryHeight - y - 1 - labelHeight * 0.5f );
|
|
m_HistoryLabels[i]->SetPos( totalWidth - maxFPSLabelWidth, top );
|
|
m_HistoryLabels[i]->SetSize( labelWidth, labelHeight );
|
|
m_HistoryLabels[i]->SetContentAlignment( vgui::Label::a_east );
|
|
}
|
|
}
|
|
|
|
void CBaseBudgetPanel::ApplySchemeSettings( vgui::IScheme *pScheme )
|
|
{
|
|
BaseClass::ApplySchemeSettings( pScheme );
|
|
|
|
int i;
|
|
for( i = 0; i < m_ConfigData.m_BudgetGroupInfo.Count(); i++ )
|
|
{
|
|
m_GraphLabels[i]->SetFgColor( m_ConfigData.m_BudgetGroupInfo[i].m_Color );
|
|
m_GraphLabels[i]->SetBgColor( Color( 0, 0, 0, 255 ) );
|
|
m_GraphLabels[i]->SetPaintBackgroundEnabled( false );
|
|
m_GraphLabels[i]->SetFont( pScheme->GetFont( "BudgetLabel", IsProportional() ) );
|
|
if ( m_bDedicated )
|
|
{
|
|
m_GraphLabels[i]->SetBgColor( pScheme->GetColor( "ControlBG", Color( 0, 0, 0, 255 ) ) );
|
|
}
|
|
}
|
|
|
|
for( i = 0; i < m_TimeLabels.Count(); i++ )
|
|
{
|
|
int red, green, blue, alpha;
|
|
red = green = blue = alpha = 255;
|
|
m_TimeLabels[i]->SetFgColor( Color( red, green, blue, alpha ) );
|
|
m_TimeLabels[i]->SetBgColor( Color( 0, 0, 0, 255 ) );
|
|
m_TimeLabels[i]->SetPaintBackgroundEnabled( false );
|
|
m_TimeLabels[i]->SetFont( pScheme->GetFont( "BudgetLabel", IsProportional() ) );
|
|
if ( m_bDedicated )
|
|
{
|
|
m_TimeLabels[i]->SetBgColor( pScheme->GetColor( "ControlBG", Color( 0, 0, 0, 255 ) ) );
|
|
}
|
|
}
|
|
|
|
for( i = 0; i < m_HistoryLabels.Count(); i++ )
|
|
{
|
|
int red, green, blue, alpha;
|
|
red = green = blue = alpha = 255;
|
|
m_HistoryLabels[i]->SetFgColor( Color( red, green, blue, alpha ) );
|
|
m_HistoryLabels[i]->SetBgColor( Color( 0, 0, 0, 255 ) );
|
|
m_HistoryLabels[i]->SetPaintBackgroundEnabled( false );
|
|
m_HistoryLabels[i]->SetFont( pScheme->GetFont( "BudgetLabel", IsProportional() ) );
|
|
if ( m_bDedicated )
|
|
{
|
|
m_HistoryLabels[i]->SetBgColor( pScheme->GetColor( "ControlBG", Color( 0, 0, 0, 255 ) ) );
|
|
}
|
|
}
|
|
|
|
m_hFont = pScheme->GetFont( "DefaultFixed" );
|
|
|
|
if ( m_bDedicated )
|
|
{
|
|
SetBgColor( pScheme->GetColor( "ControlBG", Color( 0, 0, 0, 255 ) ) );
|
|
}
|
|
SetPaintBackgroundEnabled( true );
|
|
}
|
|
|
|
void CBaseBudgetPanel::PaintBackground()
|
|
{
|
|
if ( m_bDedicated )
|
|
{
|
|
m_pBudgetBarGraphPanel->SetBgColor( GetBgColor() );
|
|
}
|
|
else
|
|
{
|
|
SetBgColor( Color( 0, 0, 0, m_ConfigData.m_flBackgroundAlpha ) );
|
|
}
|
|
BaseClass::PaintBackground();
|
|
}
|
|
|
|
void CBaseBudgetPanel::Paint()
|
|
{
|
|
m_pBudgetHistoryPanel->SetData( &m_BudgetGroupTimes[0].m_Time[0], GetNumCachedBudgetGroups(), BUDGET_HISTORY_COUNT, m_BudgetHistoryOffset );
|
|
BaseClass::Paint();
|
|
}
|
|
|
|
void CBaseBudgetPanel::MarkForFullRepaint()
|
|
{
|
|
Repaint();
|
|
m_pBudgetHistoryPanel->Repaint();
|
|
m_pBudgetBarGraphPanel->Repaint();
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CBaseBudgetPanel::GetGraphLabelScreenSpaceTopAndBottom( int id, int &top, int &bottom )
|
|
{
|
|
int x = 0;
|
|
int y = 0;
|
|
m_GraphLabels[id]->LocalToScreen( x, y );
|
|
top = y;
|
|
bottom = top + m_GraphLabels[id]->GetTall();
|
|
}
|
|
|