diff options
Diffstat (limited to 'engine/perfuipanel.cpp')
| -rw-r--r-- | engine/perfuipanel.cpp | 713 |
1 files changed, 713 insertions, 0 deletions
diff --git a/engine/perfuipanel.cpp b/engine/perfuipanel.cpp new file mode 100644 index 0000000..cf987bf --- /dev/null +++ b/engine/perfuipanel.cpp @@ -0,0 +1,713 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//===========================================================================// + +#include "client_pch.h" + +#include <vgui_controls/Frame.h> +#include <vgui/ISystem.h> +#include <vgui/ISurface.h> +#include <vgui_controls/BuildGroup.h> +#include <vgui_controls/Tooltip.h> +#include <vgui_controls/TextImage.h> +#include <vgui_controls/CheckButton.h> +#include <vgui_controls/Label.h> +#include <vgui_controls/PropertySheet.h> +#include <vgui_controls/FileOpenDialog.h> +#include <vgui_controls/ProgressBar.h> +#include <vgui_controls/Slider.h> +#include <vgui_controls/ComboBox.h> +#include <vgui_controls/Controls.h> +#include <vgui_controls/TextEntry.h> +#include <vgui/IInput.h> +#include "engineperftools.h" +#include "vgui_baseui_interface.h" +#include "ivideomode.h" +#include "gl_cvars.h" + +#include "utlsymbol.h" +#include "utldict.h" +#include "filesystem.h" +#include "filesystem_engine.h" +#include "icliententitylist.h" +#include "icliententity.h" +#include "ModelInfo.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +using namespace vgui; +extern ConVar r_staticpropinfo; +extern ConVar r_DrawPortals; +extern ConVar r_visocclusion; +extern ConVar r_occlusion; +extern ConVar r_occluderminarea; +extern ConVar r_occludeemaxarea; +extern ConVar mat_wireframe; +extern ConVar sv_cheats; + +// If you add a tool, add it to the string list and instance the panel in the constructor below +enum PerformanceTool_t +{ + PERF_TOOL_NONE = 0, + PERF_TOOL_PROP_FADES, + PERF_TOOL_AREA_PORTALS, + PERF_TOOL_OCCLUSION, + + PERF_TOOL_COUNT, + + DEFAULT_PERF_TOOL = PERF_TOOL_NONE, +}; + +static const char *s_pPerfToolNames[PERF_TOOL_COUNT] = +{ + "No Tool Active", + "Prop Fade Distance Tool", + "Area Portal Tool", + "Occlusion Tool", +}; + + +//----------------------------------------------------------------------------- +// Base class for all perf tool panels +//----------------------------------------------------------------------------- +class CPerfUIChildPanel : public vgui::EditablePanel +{ + DECLARE_CLASS_SIMPLE( CPerfUIChildPanel, vgui::EditablePanel ); + +public: + CPerfUIChildPanel( vgui::Panel *parent, const char *pName ) : BaseClass( parent, pName ) + { + SetVisible( false ); + } + virtual void Activate() {} + virtual void Deactivate() {} +}; + + +//----------------------------------------------------------------------------- +// +// The prop fade distance helper tool +// +//----------------------------------------------------------------------------- +class CPropFadeUIPanel : public CPerfUIChildPanel +{ + DECLARE_CLASS_SIMPLE( CPropFadeUIPanel, CPerfUIChildPanel ); + +public: + CPropFadeUIPanel( vgui::Panel *parent ); + ~CPropFadeUIPanel() {} + void Activate(); + void Deactivate(); + +protected: + enum + { + VISUALIZE_NONE = 0, + VISUALIZE_FADE_DISTANCE, + VISUALIZE_FADE_SCREEN_WIDTH, + + VISUALIZE_TYPE_COUNT + }; + + void OnVisualizationSelected(); + MESSAGE_FUNC_PARAMS( OnTextChanged, "TextChanged", data ); + + vgui::ComboBox *m_pVisualization; + vgui::TextEntry *m_pMinScreenArea; + vgui::TextEntry *m_pMaxScreenArea; + + static const char *s_pFadeVisualizeLabel[VISUALIZE_TYPE_COUNT]; +}; + +const char *CPropFadeUIPanel::s_pFadeVisualizeLabel[CPropFadeUIPanel::VISUALIZE_TYPE_COUNT] = +{ + "No visualization", + "Show Fade Distance", + "Show Fade Screen Width" +}; + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CPropFadeUIPanel::CPropFadeUIPanel( vgui::Panel *parent ) : BaseClass( parent, "PropFadeUIPanel") +{ + m_pVisualization = new ComboBox(this, "VisualizeMode", VISUALIZE_TYPE_COUNT, false); + int i; + for ( i = 0; i < ARRAYSIZE(s_pFadeVisualizeLabel); i++ ) + { + m_pVisualization->AddItem( s_pFadeVisualizeLabel[i], NULL ); + } + m_pVisualization->AddActionSignalTarget( this ); + m_pVisualization->ActivateItem( 0 ); + + m_pMinScreenArea = new vgui::TextEntry( this, "MinFadeSize" ); + m_pMaxScreenArea = new vgui::TextEntry( this, "MaxFadeSize" ); + + LoadControlSettings("Resource\\PerfPropFadeUIPanel.res"); +} + + +//----------------------------------------------------------------------------- +// Visualization changed +//----------------------------------------------------------------------------- +void CPropFadeUIPanel::OnTextChanged( KeyValues *data ) +{ + Panel *pPanel = reinterpret_cast<vgui::Panel *>( data->GetPtr("panel") ); + vgui::ComboBox *pBox = dynamic_cast<vgui::ComboBox *>( pPanel ); + + if( pBox == m_pVisualization ) + { + OnVisualizationSelected(); + return; + } + + vgui::TextEntry *pText = dynamic_cast<vgui::TextEntry *>( pPanel ); + if (( pText == m_pMinScreenArea ) || ( pText == m_pMaxScreenArea )) + { + char buf[256]; + float flMinArea, flMaxArea; + + m_pMinScreenArea->GetText( buf, 256 ); + int nReadMin = sscanf( buf, "%f", &flMinArea ); + + m_pMaxScreenArea->GetText( buf, 256 ); + int nReadMax = sscanf( buf, "%f", &flMaxArea ); + + if ( nReadMin && nReadMax ) + { + modelinfoclient->SetLevelScreenFadeRange( flMinArea, flMaxArea ); + } + } +} + + +//----------------------------------------------------------------------------- +// Activate, deactivate: +//----------------------------------------------------------------------------- +void CPropFadeUIPanel::OnVisualizationSelected() +{ + int tool = m_pVisualization->GetActiveItem(); + switch( tool ) + { + case VISUALIZE_NONE: + r_staticpropinfo.SetValue( 0 ); + break; + + case VISUALIZE_FADE_DISTANCE: + r_staticpropinfo.SetValue( 3 ); + break; + + case VISUALIZE_FADE_SCREEN_WIDTH: + r_staticpropinfo.SetValue( 4 ); + break; + } +} + + +//----------------------------------------------------------------------------- +// Activate, deactivate: +//----------------------------------------------------------------------------- +void CPropFadeUIPanel::Activate() +{ + float flMinArea, flMaxArea; + modelinfoclient->GetLevelScreenFadeRange( &flMinArea, &flMaxArea ); + + char buf[256]; + Q_snprintf( buf, 256, "%.2f", flMinArea ); + m_pMinScreenArea->SetText( buf ); + Q_snprintf( buf, 256, "%.2f", flMaxArea ); + m_pMaxScreenArea->SetText( buf ); + + OnVisualizationSelected(); +} + +void CPropFadeUIPanel::Deactivate() +{ + r_staticpropinfo.SetValue( 0 ); +} + + +//----------------------------------------------------------------------------- +// The areaportals helper tool +//----------------------------------------------------------------------------- +class CAreaPortalsUIPanel : public CPerfUIChildPanel +{ + DECLARE_CLASS_SIMPLE( CAreaPortalsUIPanel, CPerfUIChildPanel ); + +public: + CAreaPortalsUIPanel( vgui::Panel *parent ); + ~CAreaPortalsUIPanel() {} + void Activate(); + void Deactivate(); +}; + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CAreaPortalsUIPanel::CAreaPortalsUIPanel( vgui::Panel *parent ) : BaseClass( parent, "AreaPortalUIPanel") +{ +} + + +//----------------------------------------------------------------------------- +// Activate, deactivate: +//----------------------------------------------------------------------------- +void CAreaPortalsUIPanel::Activate() +{ + r_DrawPortals.SetValue( 1 ); + mat_wireframe.SetValue( 3 ); +} + +void CAreaPortalsUIPanel::Deactivate() +{ + r_DrawPortals.SetValue( 0 ); + mat_wireframe.SetValue( 0 ); +} + + +//----------------------------------------------------------------------------- +// The occlusion helper tool +//----------------------------------------------------------------------------- +class COcclusionUIPanel : public CPerfUIChildPanel +{ + DECLARE_CLASS_SIMPLE( COcclusionUIPanel, CPerfUIChildPanel ); + +public: + COcclusionUIPanel( vgui::Panel *parent ); + ~COcclusionUIPanel() {} + void Activate(); + void Deactivate(); + +protected: + MESSAGE_FUNC_PARAMS( OnTextChanged, "TextChanged", data ); + MESSAGE_FUNC_PTR( OnCheckButtonChecked, "CheckButtonChecked", panel ); + +private: + enum + { + VISUALIZE_NONE = 0, + VISUALIZE_ON, + + VISUALIZE_TYPE_COUNT + }; + + void OnVisualizationSelected(); + void OnDeactivateOcclusion(); + + vgui::ComboBox *m_pVisualization; + vgui::TextEntry *m_pMinOccluderArea; + vgui::TextEntry *m_pMaxOccludeeArea; + vgui::CheckButton *m_pDeactivateOcclusion; + + static const char *s_pOccVisualizeLabel[VISUALIZE_TYPE_COUNT]; +}; + + +const char *COcclusionUIPanel::s_pOccVisualizeLabel[COcclusionUIPanel::VISUALIZE_TYPE_COUNT] = +{ + "No visualization", + "View occluders", +}; + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +COcclusionUIPanel::COcclusionUIPanel( vgui::Panel *parent ) : BaseClass( parent, "AreaPortalUIPanel") +{ + m_pVisualization = new ComboBox(this, "VisualizeMode", VISUALIZE_TYPE_COUNT, false); + int i; + for ( i = 0; i < VISUALIZE_TYPE_COUNT; i++ ) + { + m_pVisualization->AddItem( s_pOccVisualizeLabel[i], NULL ); + } + m_pVisualization->AddActionSignalTarget( this ); + m_pVisualization->ActivateItem( 0 ); + + m_pMinOccluderArea = new vgui::TextEntry( this, "MinOccluderSize" ); + m_pMaxOccludeeArea = new vgui::TextEntry( this, "MaxOccludeeSize" ); + + m_pDeactivateOcclusion = new vgui::CheckButton( this, "DeactivateOcclusion", "" ); + m_pDeactivateOcclusion->AddActionSignalTarget( this ); + + LoadControlSettings("Resource\\PerfOcclusionUIPanel.res"); +} + + +//----------------------------------------------------------------------------- +// Activate, deactivate: +//----------------------------------------------------------------------------- +void COcclusionUIPanel::Activate() +{ + OnVisualizationSelected(); + OnDeactivateOcclusion(); + + char buf[256]; + Q_snprintf( buf, 256, "%.2f", r_occluderminarea.GetFloat() ); + m_pMinOccluderArea->SetText( buf ); + Q_snprintf( buf, 256, "%.2f", r_occludeemaxarea.GetFloat() ); + m_pMaxOccludeeArea->SetText( buf ); +} + +void COcclusionUIPanel::Deactivate() +{ + r_visocclusion.SetValue( 0 ); + mat_wireframe.SetValue( 0 ); +} + + +//----------------------------------------------------------------------------- +// Visualization changed +//----------------------------------------------------------------------------- +void COcclusionUIPanel::OnTextChanged( KeyValues *data ) +{ + Panel *pPanel = reinterpret_cast<vgui::Panel *>( data->GetPtr("panel") ); + vgui::ComboBox *pBox = dynamic_cast<vgui::ComboBox *>( pPanel ); + + if( pBox == m_pVisualization ) + { + OnVisualizationSelected(); + return; + } + + vgui::TextEntry *pText = dynamic_cast<vgui::TextEntry *>( pPanel ); + if (( pText == m_pMinOccluderArea ) || ( pText == m_pMaxOccludeeArea )) + { + char buf[256]; + float flMinArea, flMaxArea; + + m_pMinOccluderArea->GetText( buf, 256 ); + int nReadMin = sscanf( buf, "%f", &flMinArea ); + if ( nReadMin ) + { + r_occluderminarea.SetValue( flMinArea ); + } + + m_pMaxOccludeeArea->GetText( buf, 256 ); + int nReadMax = sscanf( buf, "%f", &flMaxArea ); + if ( nReadMax ) + { + r_occludeemaxarea.SetValue( flMaxArea ); + } + } +} + + +//----------------------------------------------------------------------------- +// Activate, deactivate: +//----------------------------------------------------------------------------- +void COcclusionUIPanel::OnVisualizationSelected() +{ + int tool = m_pVisualization->GetActiveItem(); + switch( tool ) + { + case VISUALIZE_NONE: + r_visocclusion.SetValue( 0 ); + mat_wireframe.SetValue( 0 ); + break; + + case VISUALIZE_ON: + r_visocclusion.SetValue( 1 ); + mat_wireframe.SetValue( 3 ); + break; + } +} + + +//----------------------------------------------------------------------------- +// Activate, deactivate: +//----------------------------------------------------------------------------- +void COcclusionUIPanel::OnDeactivateOcclusion() +{ + r_occlusion.SetValue( m_pDeactivateOcclusion->IsSelected() ? 0 : 1 ); +} + +void COcclusionUIPanel::OnCheckButtonChecked(Panel *panel) +{ + if ( panel == m_pDeactivateOcclusion ) + { + OnDeactivateOcclusion(); + } +} + + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class CPerfUIPanel : public vgui::Frame +{ + DECLARE_CLASS_SIMPLE( CPerfUIPanel, vgui::Frame ); + +public: + CPerfUIPanel( vgui::Panel *parent ); + ~CPerfUIPanel(); + + // Command issued + virtual void OnCommand(const char *command); + + virtual void Activate(); + + void Init(); + void Shutdown(); + + virtual void OnKeyCodeTyped(KeyCode code); + + virtual void OnTick(); + +protected: + vgui::ComboBox *m_pPerformanceTool; + + MESSAGE_FUNC_PARAMS( OnTextChanged, "TextChanged", data ); + +private: + void PopulateControls(); + void OnPerfToolSelected(); + + PerformanceTool_t m_nPerfTool; + CPerfUIChildPanel *m_pToolPanel[PERF_TOOL_COUNT]; + CPerfUIChildPanel *m_pCurrentToolPanel; +}; + + +//----------------------------------------------------------------------------- +// Purpose: Basic help dialog +//----------------------------------------------------------------------------- +CPerfUIPanel::CPerfUIPanel( vgui::Panel *parent ) : BaseClass( parent, "PerfUIPanel") +{ + SetTitle("Level Performance Tools", true); + + m_pPerformanceTool = new ComboBox(this, "PerformanceTool", 10, false); + + vgui::ivgui()->AddTickSignal( GetVPanel(), 0 ); + + LoadControlSettings("Resource\\PerfUIPanel.res"); + + // Hidden by default + SetVisible( false ); + + SetSizeable( false ); + SetMoveable( true ); + + int w = 250; + int h = 400; + + int x = videomode->GetModeStereoWidth() - w - 10; + int y = ( videomode->GetModeStereoHeight() - h ) / 2 + videomode->GetModeStereoHeight() * 0.2; + SetBounds( x, y, w, h ); + + // Create the child tool panels + m_pToolPanel[PERF_TOOL_NONE] = new CPerfUIChildPanel( this, "PerfNone" ); + m_pToolPanel[PERF_TOOL_PROP_FADES] = new CPropFadeUIPanel( this ); + m_pToolPanel[PERF_TOOL_AREA_PORTALS] = new CAreaPortalsUIPanel( this ); + m_pToolPanel[PERF_TOOL_OCCLUSION] = new COcclusionUIPanel( this ); + + for ( int i = 0; i < PERF_TOOL_COUNT; ++i ) + { + m_pToolPanel[i]->SetBounds( 0, 75, w, h - 75 ); + } + + m_nPerfTool = PERF_TOOL_COUNT; + m_pCurrentToolPanel = NULL; + PopulateControls(); +} + +CPerfUIPanel::~CPerfUIPanel() +{ +} + + +//----------------------------------------------------------------------------- +// Init, shutdown +//----------------------------------------------------------------------------- +void CPerfUIPanel::Init() +{ + // Center the cursor on the panel + int x, y, w, h; + GetBounds( x, y, w, h ); + vgui::input()->SetCursorPos( x + w/2, y + h/2 ); +} + +void CPerfUIPanel::Shutdown() +{ + if ( m_pCurrentToolPanel ) + { + m_pCurrentToolPanel->Deactivate(); + m_pCurrentToolPanel->SetVisible( false ); + } +} + +void CPerfUIPanel::PopulateControls() +{ + m_pPerformanceTool->DeleteAllItems(); + int i; + for ( i = 0; i < PERF_TOOL_COUNT; i++ ) + { + m_pPerformanceTool->AddItem( s_pPerfToolNames[i], NULL ); + } + m_pPerformanceTool->AddActionSignalTarget( this ); + m_pPerformanceTool->ActivateItem( 0 ); +} + +//----------------------------------------------------------------------------- +// Don't allow this to be enabled without cheats turned on. +//----------------------------------------------------------------------------- +void CPerfUIPanel::OnTick() +{ + // Go away if we were on and sv_cheats is now on. + if ( !CanCheat() ) + { + Shutdown(); + } + + BaseClass::OnTick(); +} + +//----------------------------------------------------------------------------- +// A new performance tool was selected +//----------------------------------------------------------------------------- +void CPerfUIPanel::OnTextChanged( KeyValues *data ) +{ + Panel *pPanel = reinterpret_cast<vgui::Panel *>( data->GetPtr("panel") ); + vgui::ComboBox *pBox = dynamic_cast<vgui::ComboBox *>( pPanel ); + + if( pBox == m_pPerformanceTool ) // don't change the text in the config setting combo + { + OnPerfToolSelected(); + } +} + +void CPerfUIPanel::OnPerfToolSelected() +{ + int tool = m_pPerformanceTool->GetActiveItem(); + if ( tool == m_nPerfTool ) + return; + + if ( m_pCurrentToolPanel ) + { + m_pCurrentToolPanel->Deactivate(); + m_pCurrentToolPanel->SetVisible( false ); + } + m_nPerfTool = (PerformanceTool_t)tool; + m_pCurrentToolPanel = m_pToolPanel[tool]; + m_pCurrentToolPanel->SetVisible( true ); + m_pCurrentToolPanel->Activate(); +} + + +//----------------------------------------------------------------------------- +// Purpose: Shows the panel +//----------------------------------------------------------------------------- +void CPerfUIPanel::Activate() +{ + if ( !CanCheat() ) + return; + + Init(); + BaseClass::Activate(); +} + +void CPerfUIPanel::OnCommand( char const *command ) +{ + if ( !Q_strcasecmp( command, "submit" ) ) + { +// OnSubmit(); + } + else if ( !Q_strcasecmp( command, "cancel" ) ) + { +// Close(); + } + else + { + BaseClass::OnCommand( command ); + } +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CPerfUIPanel::OnKeyCodeTyped(KeyCode code) +{ + switch( code ) + { + case KEY_ESCAPE: + Close(); + break; + + default: + BaseClass::OnKeyCodeTyped( code ); + break; + } +} + + +//----------------------------------------------------------------------------- +// Main interface to the performance tools +//----------------------------------------------------------------------------- +static CPerfUIPanel *g_pPerfUI = NULL; + +class CEnginePerfTools : public IEnginePerfTools +{ +public: + virtual void Init( void ); + virtual void Shutdown( void ); + + virtual void InstallPerformanceToolsUI( vgui::Panel *parent ); + virtual bool ShouldPause() const; +}; + +static CEnginePerfTools g_PerfTools; +IEnginePerfTools *perftools = &g_PerfTools; + +void CEnginePerfTools::Init( void ) +{ +} + +void CEnginePerfTools::Shutdown( void ) +{ + if ( g_pPerfUI ) + { + g_pPerfUI->Shutdown(); + } +} + +void CEnginePerfTools::InstallPerformanceToolsUI( vgui::Panel *parent ) +{ + if ( g_pPerfUI ) + return; + + g_pPerfUI = new CPerfUIPanel( parent ); + Assert( g_pPerfUI ); +} + +bool CEnginePerfTools::ShouldPause() const +{ + return false; +} + +void ShowHidePerfUI() +{ + if ( !g_pPerfUI ) + return; + + bool wasvisible = g_pPerfUI->IsVisible(); + + if ( wasvisible ) + { + // hide + g_pPerfUI->Close(); + } + else + { + g_pPerfUI->Activate(); + } +} + + +static ConCommand perfui( "perfui", ShowHidePerfUI, "Show/hide the level performance tools UI.", FCVAR_CHEAT ); |