Counter Strike : Global Offensive Source Code
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

//=========== (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 );
}