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.
491 lines
14 KiB
491 lines
14 KiB
//=========== (C) Copyright 1999 Valve, L.L.C. All rights reserved. ===========
|
|
//
|
|
// The copyright to the contents herein is the property of Valve, L.L.C.
|
|
// The contents may be used and/or copied only with the written permission of
|
|
// Valve, L.L.C., or in accordance with the terms and conditions stipulated in
|
|
// the agreement/contract under which the contents have been supplied.
|
|
//
|
|
// $Header: $
|
|
// $NoKeywords: $
|
|
//
|
|
// Material editor
|
|
//=============================================================================
|
|
|
|
#include "vstdlib/cvar.h"
|
|
#include "appframework/vguimatsysapp.h"
|
|
#include "soundsystem/isoundsystem.h"
|
|
#include "nowindows.h"
|
|
#include "FileSystem.h"
|
|
#include "vgui/IVGui.h"
|
|
#include "vgui/ISystem.h"
|
|
//#include "vgui/IScheme.h"
|
|
#include "vgui/ILocalize.h"
|
|
#include "vgui/ISurface.h"
|
|
#include "tier0/dbg.h"
|
|
#include "tier0/icommandline.h"
|
|
#include "materialsystem/MaterialSystem_Config.h"
|
|
#include "VGuiMatSurface/IMatSystemSurface.h"
|
|
#include "vstdlib/iprocessutils.h"
|
|
#include "matsys_controls/matsyscontrols.h"
|
|
#include "datacache/idatacache.h"
|
|
#include "vgui_controls/frame.h"
|
|
#include "materialsystem/IMaterialSystemHardwareConfig.h"
|
|
#include "materialsystem/materialsystemutil.h"
|
|
#include "vgui/keycode.h"
|
|
#include "tier0/vprof.h"
|
|
#include "inputsystem/iinputsystem.h"
|
|
#include "game_controls/igameuisystemmgr.h"
|
|
#include "console_logging.h"
|
|
#include "vscript/ivscript.h"
|
|
#include "materialsystem/imaterialproxyfactory.h"
|
|
#include "tier1/interface.h"
|
|
#include "materialsystem/IMaterialProxy.h"
|
|
#include "materialsystem/imaterial.h"
|
|
#include "materialsystem/imaterialvar.h"
|
|
|
|
LINK_GAME_CONTROLS_LIB();
|
|
|
|
|
|
using namespace vgui;
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Forward declarations
|
|
//-----------------------------------------------------------------------------
|
|
const MaterialSystem_Config_t *g_pMaterialSystemConfig;
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// A material proxy that resets the base texture to use the dynamic texture
|
|
//-----------------------------------------------------------------------------
|
|
class CPerftestGameControlsProxy : public IMaterialProxy
|
|
{
|
|
public:
|
|
CPerftestGameControlsProxy();
|
|
virtual ~CPerftestGameControlsProxy(){};
|
|
virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues );
|
|
virtual void OnBind( void *pProxyData );
|
|
virtual void Release( void ) { delete this; }
|
|
virtual IMaterial *GetMaterial();
|
|
|
|
private:
|
|
IMaterialVar* m_BaseTextureVar;
|
|
};
|
|
|
|
CPerftestGameControlsProxy::CPerftestGameControlsProxy(): m_BaseTextureVar( NULL )
|
|
{
|
|
}
|
|
|
|
bool CPerftestGameControlsProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
|
|
{
|
|
bool bFoundVar;
|
|
m_BaseTextureVar = pMaterial->FindVar( "$basetexture", &bFoundVar, false );
|
|
return bFoundVar;
|
|
}
|
|
|
|
void CPerftestGameControlsProxy::OnBind( void *pProxyData )
|
|
{
|
|
const char *pBaseTextureName = ( const char * )pProxyData;
|
|
ITexture *pTexture = g_pMaterialSystem->FindTexture( pBaseTextureName, TEXTURE_GROUP_OTHER, true );
|
|
m_BaseTextureVar->SetTextureValue( pTexture );
|
|
}
|
|
|
|
IMaterial *CPerftestGameControlsProxy::GetMaterial()
|
|
{
|
|
return m_BaseTextureVar->GetOwningMaterial();
|
|
}
|
|
|
|
static CPerftestGameControlsProxy s_CPerftestGameControlsProxy;
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Factory to create dynamic material. ( Return in this case. )
|
|
//-----------------------------------------------------------------------------
|
|
class CPerftestMaterialProxyFactory : public IMaterialProxyFactory
|
|
{
|
|
public:
|
|
IMaterialProxy *CreateProxy( const char *proxyName );
|
|
void DeleteProxy( IMaterialProxy *pProxy );
|
|
CreateInterfaceFn GetFactory();
|
|
};
|
|
static CPerftestMaterialProxyFactory s_DynamicMaterialProxyFactory;
|
|
|
|
IMaterialProxy *CPerftestMaterialProxyFactory::CreateProxy( const char *proxyName )
|
|
{
|
|
if ( Q_strcmp( proxyName, "GameControlsProxy" ) == NULL )
|
|
{
|
|
return static_cast< IMaterialProxy * >( &s_CPerftestGameControlsProxy );
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void CPerftestMaterialProxyFactory::DeleteProxy( IMaterialProxy *pProxy )
|
|
{
|
|
}
|
|
|
|
CreateInterfaceFn CPerftestMaterialProxyFactory::GetFactory()
|
|
{
|
|
return Sys_GetFactoryThis();
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// The application object
|
|
//-----------------------------------------------------------------------------
|
|
class CVguiPerfTestApp : public CVguiMatSysApp
|
|
{
|
|
typedef CVguiMatSysApp BaseClass;
|
|
|
|
public:
|
|
// Methods of IApplication
|
|
virtual bool Create();
|
|
virtual bool PreInit();
|
|
virtual int Main();
|
|
virtual bool AppUsesReadPixels() { return true; }
|
|
|
|
private:
|
|
bool SetupSearchPaths();
|
|
|
|
virtual const char *GetAppName() { return "VguiPerfTest"; }
|
|
|
|
bool RunPerfTest( CMatRenderContextPtr &pRenderContext, const char *pMenuName );
|
|
void CVguiPerfTestApp::PlayMenuSound( const char *pSoundFileName );
|
|
|
|
};
|
|
|
|
DEFINE_WINDOWED_STEAM_APPLICATION_OBJECT( CVguiPerfTestApp );
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Create all singleton systems
|
|
//-----------------------------------------------------------------------------
|
|
bool CVguiPerfTestApp::Create()
|
|
{
|
|
if ( !BaseClass::Create() )
|
|
return false;
|
|
|
|
AppSystemInfo_t appSystems[] =
|
|
{
|
|
{ "vstdlib.dll", PROCESS_UTILS_INTERFACE_VERSION },
|
|
{ "vstdlib.dll", EVENTSYSTEM_INTERFACE_VERSION }, // input event support
|
|
// { "studiorender.dll", STUDIO_RENDER_INTERFACE_VERSION },
|
|
// { "vphysics.dll", VPHYSICS_INTERFACE_VERSION },
|
|
{ "datacache.dll", DATACACHE_INTERFACE_VERSION }, // needed for sound system.
|
|
// { "datacache.dll", MDLCACHE_INTERFACE_VERSION },
|
|
{ "vscript.dll", VSCRIPT_INTERFACE_VERSION }, // scripting support
|
|
{ "soundsystem.dll", SOUNDSYSTEM_INTERFACE_VERSION }, // sound support
|
|
|
|
{ "", "" } // Required to terminate the list
|
|
};
|
|
|
|
AddSystem( g_pGameUISystemMgr, GAMEUISYSTEMMGR_INTERFACE_VERSION );
|
|
|
|
return AddSystems( appSystems );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Init, shutdown
|
|
//-----------------------------------------------------------------------------
|
|
bool CVguiPerfTestApp::PreInit( )
|
|
{
|
|
MathLib_Init( 2.2f, 2.2f, 0.0f, 2.0f, false, false, false, false );
|
|
|
|
if ( !BaseClass::PreInit() )
|
|
return false;
|
|
|
|
// initialize interfaces
|
|
CreateInterfaceFn appFactory = GetFactory();
|
|
if (!vgui::VGui_InitMatSysInterfacesList( "VguiPerfTest", &appFactory, 1 ))
|
|
return false;
|
|
|
|
if ( !g_pFullFileSystem || !g_pMaterialSystem || !g_pVGui || !g_pVGuiSurface || !g_pMatSystemSurface || !g_pEventSystem )
|
|
{
|
|
Warning( "Perf Test App is missing a required interface!\n" );
|
|
return false;
|
|
}
|
|
|
|
// Add paths...
|
|
if ( !SetupSearchPaths() )
|
|
return false;
|
|
|
|
|
|
materials->SetMaterialProxyFactory( &s_DynamicMaterialProxyFactory );
|
|
|
|
return true;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Sets up the game path
|
|
//-----------------------------------------------------------------------------
|
|
bool CVguiPerfTestApp::SetupSearchPaths()
|
|
{
|
|
if ( !BaseClass::SetupSearchPaths( NULL, false, true ) )
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
// Replace first underscore (if any) with \0 and return
|
|
// This handles special mods like tf_movies, l4d_movies, tf_comics
|
|
// As a result, such mods will use the gpu_level settings etc from the base mod
|
|
void StripModSuffix2( char *pModName )
|
|
{
|
|
int i = 0;
|
|
while ( pModName[i] != '\0' ) // Walk to the end of the string
|
|
{
|
|
if ( pModName[i] == '_') // If we hit an underscore
|
|
{
|
|
pModName[i] = '\0'; // Terminate the string here and bail out
|
|
return;
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// main application
|
|
//-----------------------------------------------------------------------------
|
|
int CVguiPerfTestApp::Main()
|
|
{
|
|
CConsoleLoggingListener consoleLoggingListener;
|
|
LoggingSystem_PushLoggingState();
|
|
LoggingSystem_RegisterLoggingListener( &consoleLoggingListener );
|
|
LoggingSystem_SetChannelSpewLevelByTag( "Console", LS_MESSAGE );
|
|
LoggingSystem_SetChannelSpewLevelByTag( "Developer", LS_ERROR );
|
|
LoggingSystem_SetChannelSpewLevelByTag( "DeveloperVerbose", LS_ERROR );
|
|
|
|
CSimpleLoggingListener simpleLoggingListner( false );
|
|
LoggingSystem_RegisterLoggingListener( &simpleLoggingListner );
|
|
|
|
g_pMaterialSystem->ModInit();
|
|
if (!SetVideoMode())
|
|
return 0;
|
|
|
|
g_pDataCache->SetSize( 64 * 1024 * 1024 );
|
|
|
|
g_pMaterialSystemConfig = &g_pMaterialSystem->GetCurrentConfigForVideoCard();
|
|
|
|
// configuration settings
|
|
vgui::system()->SetUserConfigFile( "VguiPerfTest.vdf", "EXECUTABLE_PATH");
|
|
|
|
// If you load a vgui panel you must load up a scheme.
|
|
|
|
// load scheme
|
|
if (!vgui::scheme()->LoadSchemeFromFile( "resource/BoxRocket.res", "VguiPerfTest" ))
|
|
{
|
|
Assert( 0 );
|
|
}
|
|
|
|
// load the boxrocket localization file
|
|
g_pVGuiLocalize->AddFile( "resource/boxrocket_%language%.txt" );
|
|
|
|
// load the mod localization file
|
|
// Construct the mod name so we can use the mod-specific encrypted config files
|
|
char pModPath[MAX_PATH];
|
|
V_snprintf( pModPath, sizeof(pModPath), "" );
|
|
g_pFullFileSystem->GetSearchPath( "MOD", false, pModPath, sizeof( pModPath ) );
|
|
|
|
char pModName[32];
|
|
V_StripTrailingSlash( pModPath );
|
|
V_FileBase( pModPath, pModName, sizeof( pModName ) );
|
|
StripModSuffix2( pModName );
|
|
|
|
// Language file is a file of the form "resource/nimbus_%language%.txt"
|
|
CUtlString pModLanguageFile;
|
|
pModLanguageFile += "resource/";
|
|
pModLanguageFile += pModName;
|
|
pModLanguageFile += "_%language%.txt";
|
|
|
|
g_pVGuiLocalize->AddFile( pModLanguageFile.Get() );
|
|
|
|
|
|
|
|
// start vgui
|
|
g_pVGui->Start();
|
|
|
|
// add our main window
|
|
//vgui::PHandle hMainPanel;
|
|
|
|
// load the base localization file
|
|
g_pVGuiLocalize->AddFile( "Resource/valve_%language%.txt" );
|
|
g_pFullFileSystem->AddSearchPath( "platform", "PLATFORM" );
|
|
g_pVGuiLocalize->AddFile( "Resource/vgui_%language%.txt");
|
|
|
|
|
|
// run app frame loop
|
|
CMatRenderContextPtr pRenderContext( g_pMaterialSystem );
|
|
const char *pGuiFileName = CommandLine()->ParmValue( "-gui" );
|
|
|
|
bool bReload = true;
|
|
while ( bReload )
|
|
{
|
|
bReload = RunPerfTest( pRenderContext, pGuiFileName );
|
|
}
|
|
|
|
g_pMaterialSystem->ModShutdown();
|
|
|
|
LoggingSystem_PopLoggingState();
|
|
return 1;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// returns true if ui should reload
|
|
//-----------------------------------------------------------------------------
|
|
bool CVguiPerfTestApp::RunPerfTest( CMatRenderContextPtr &pRenderContext, const char *pMenuName )
|
|
{
|
|
g_pGameUISystemMgr->Shutdown();
|
|
g_pGameUISystemMgr->Init();
|
|
g_pMaterialSystem->BeginRenderTargetAllocation();
|
|
g_pGameUISystemMgr->InitRenderTargets();
|
|
g_pMaterialSystem->EndRenderTargetAllocation();
|
|
|
|
if ( !pMenuName )
|
|
{
|
|
pMenuName = "menu_1";
|
|
}
|
|
|
|
g_pGameUISystemMgr->LoadGameUIScreen( KeyValues::AutoDeleteInline(
|
|
new KeyValues( pMenuName ) ) );
|
|
|
|
|
|
g_VProfCurrentProfile.Reset();
|
|
g_VProfCurrentProfile.ResetPeaks();
|
|
g_VProfCurrentProfile.Start();
|
|
|
|
float m_flTotalTime = 0;
|
|
float flStartTime = Plat_FloatTime();
|
|
{
|
|
KeyValues *kvEvent = new KeyValues( "StartPlaying" );
|
|
kvEvent->SetFloat( "time", 0 );
|
|
g_pGameUISystemMgr->SendEventToAllScreens( kvEvent );
|
|
}
|
|
int frameCount = 0;
|
|
bool bReload = false;
|
|
bool bAbleToAdvance = true;
|
|
|
|
vgui::VPANEL root = g_pVGuiSurface->GetEmbeddedPanel();
|
|
g_pVGuiSurface->Invalidate( root );
|
|
|
|
|
|
while ( g_pVGui->IsRunning() )
|
|
{
|
|
AppPumpMessages();
|
|
|
|
|
|
g_pSoundSystem->Update( Plat_FloatTime() );
|
|
|
|
g_pMaterialSystem->BeginFrame( 0 );
|
|
|
|
pRenderContext->ClearColor4ub( 0, 0, 0, 255 );
|
|
//pRenderContext->ClearColor4ub( 76, 88, 68, 255 );
|
|
pRenderContext->ClearBuffers( true, true );
|
|
|
|
// Handle all input to game ui.
|
|
g_pGameUISystemMgr->RunFrame();
|
|
|
|
// Must call run frame for close button to work.
|
|
g_pVGui->RunFrame(); // need to load a default scheme for this to work.
|
|
//g_pVGuiSurface->PaintTraverseEx( root, true );
|
|
|
|
Rect_t viewport;
|
|
pRenderContext->GetViewport( viewport.x, viewport.y, viewport.width, viewport.height );
|
|
|
|
float flCurrentRenderTime = Plat_FloatTime() - flStartTime;
|
|
g_pGameUISystemMgr->Render( viewport, DmeTime_t( flCurrentRenderTime ) );
|
|
|
|
g_pMaterialSystem->EndFrame();
|
|
g_pMaterialSystem->SwapBuffers();
|
|
|
|
g_VProfCurrentProfile.MarkFrame();
|
|
|
|
frameCount++;
|
|
//if ( frameCount >= 5000 )
|
|
// break;
|
|
|
|
if ( g_pInputSystem->IsButtonDown( KEY_ESCAPE ) )
|
|
{
|
|
bReload = true;
|
|
break;
|
|
}
|
|
else if ( g_pInputSystem->IsButtonDown( KEY_PAD_PLUS ) )
|
|
{
|
|
m_flTotalTime = 0;
|
|
{
|
|
KeyValues *kvEvent = new KeyValues( "StartPlaying" );
|
|
kvEvent->SetFloat( "time", m_flTotalTime );
|
|
g_pGameUISystemMgr->SendEventToAllScreens( kvEvent );
|
|
}
|
|
}
|
|
else if ( g_pInputSystem->IsButtonDown( KEY_PAD_MINUS ) )
|
|
{
|
|
KeyValues *kvEvent = new KeyValues( "StopPlaying" );
|
|
g_pGameUISystemMgr->SendEventToAllScreens( kvEvent );
|
|
}
|
|
else if ( g_pInputSystem->IsButtonDown( KEY_PAD_DIVIDE ) )
|
|
{
|
|
KeyValues *kvEvent = new KeyValues( "ShowCursorCoords" );
|
|
g_pGameUISystemMgr->SendEventToAllScreens( kvEvent );
|
|
}
|
|
else if ( g_pInputSystem->IsButtonDown( KEY_PAD_9 ) )
|
|
{
|
|
KeyValues *kvEvent = new KeyValues( "ShowGraphicName" );
|
|
g_pGameUISystemMgr->SendEventToAllScreens( kvEvent );
|
|
}
|
|
else if ( g_pInputSystem->IsButtonDown( KEY_PAD_MULTIPLY ) )
|
|
{
|
|
if ( bAbleToAdvance )
|
|
{
|
|
KeyValues *kvEvent = new KeyValues( "AdvanceState" );
|
|
g_pGameUISystemMgr->SendEventToAllScreens( kvEvent );
|
|
}
|
|
bAbleToAdvance = false;
|
|
}
|
|
else if ( !g_pInputSystem->IsButtonDown( KEY_PAD_MULTIPLY ) )
|
|
{
|
|
bAbleToAdvance = true;
|
|
}
|
|
|
|
}
|
|
|
|
g_VProfCurrentProfile.Stop();
|
|
g_VProfCurrentProfile.OutputReport( VPRT_FULL & ~VPRT_HIERARCHY, NULL );
|
|
|
|
return bReload;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
void CVguiPerfTestApp::PlayMenuSound( const char *pSoundFileName )
|
|
{
|
|
if ( pSoundFileName == NULL || pSoundFileName[ 0 ] == '\0' )
|
|
return;
|
|
|
|
if ( !Q_stristr( pSoundFileName, ".wav" ) )
|
|
return;
|
|
|
|
char filename[ 256 ];
|
|
sprintf( filename, "sound/%s", pSoundFileName );
|
|
CAudioSource *pAudioSource = g_pSoundSystem->FindOrAddSound( filename );
|
|
if ( pAudioSource == NULL )
|
|
return;
|
|
|
|
g_pSoundSystem->PlaySound( pAudioSource, 1.0f, NULL );
|
|
}
|
|
|
|
|
|
|