//====== Copyright © 1996-2005, Valve Corporation, All rights reserved. =====// // // Purpose: // //===========================================================================// #include "cbase.h" #include "toolframework_client.h" #include "igamesystem.h" #include "tier1/keyvalues.h" #include "toolframework/iclientenginetools.h" #include "client_factorylist.h" #include "iviewrender.h" #include "materialsystem/IMaterialVar.h" // NOTE: This has to be the last file included! #include "tier0/memdbgon.h" extern IViewRender *view; class CToolFrameworkClient : public CBaseGameSystemPerFrame { public: // Methods of IGameSystem virtual bool Init(); virtual void LevelInitPreEntity(); virtual void LevelInitPostEntity(); virtual void LevelShutdownPreEntity(); virtual void LevelShutdownPostEntity(); virtual void PreRender(); virtual void PostRender(); public: // Other public methods void PostToolMessage( HTOOLHANDLE hEntity, KeyValues *msg ); void AdjustEngineViewport( int& x, int& y, int& width, int& height ); bool SetupEngineView( Vector &origin, QAngle &angles, float &fov ); bool SetupAudioState( AudioState_t &audioState ); bool IsThirdPersonCamera(); IClientEngineTools *m_pTools; }; //----------------------------------------------------------------------------- // Singleton //----------------------------------------------------------------------------- static CToolFrameworkClient g_ToolFrameworkClient; #ifndef NO_TOOLFRAMEWORK bool ToolsEnabled() { return g_ToolFrameworkClient.m_pTools && g_ToolFrameworkClient.m_pTools->InToolMode(); } #endif IGameSystem *ToolFrameworkClientSystem() { return &g_ToolFrameworkClient; } bool CToolFrameworkClient::Init() { factorylist_t list; FactoryList_Retrieve( list ); m_pTools = ( IClientEngineTools * )list.appSystemFactory( VCLIENTENGINETOOLS_INTERFACE_VERSION, NULL ); return ( m_pTools != NULL ); } void CToolFrameworkClient::LevelInitPreEntity() { if ( m_pTools ) { m_pTools->LevelInitPreEntityAllTools(); } } void CToolFrameworkClient::LevelInitPostEntity() { if ( m_pTools ) { m_pTools->LevelInitPostEntityAllTools(); } } void CToolFrameworkClient::LevelShutdownPreEntity() { if ( m_pTools ) { m_pTools->LevelShutdownPreEntityAllTools(); } } void CToolFrameworkClient::LevelShutdownPostEntity() { if ( m_pTools ) { m_pTools->LevelShutdownPostEntityAllTools(); } } void CToolFrameworkClient::PreRender() { if ( m_pTools ) { m_pTools->PreRenderAllTools(); } } void CToolFrameworkClient::PostRender() { if ( m_pTools ) { m_pTools->PostRenderAllTools(); } } //----------------------------------------------------------------------------- // Should we render with a 3rd person camera? //----------------------------------------------------------------------------- bool CToolFrameworkClient::IsThirdPersonCamera() { if ( !m_pTools ) return false; return m_pTools->IsThirdPersonCamera( ); } bool ToolFramework_IsThirdPersonCamera( ) { return g_ToolFrameworkClient.IsThirdPersonCamera( ); } //----------------------------------------------------------------------------- // Posts a message to all tools //----------------------------------------------------------------------------- void CToolFrameworkClient::PostToolMessage( HTOOLHANDLE hEntity, KeyValues *msg ) { if ( m_pTools ) { m_pTools->PostToolMessage( hEntity, msg ); } } void ToolFramework_PostToolMessage( HTOOLHANDLE hEntity, KeyValues *msg ) { g_ToolFrameworkClient.PostToolMessage( hEntity, msg ); } //----------------------------------------------------------------------------- // View manipulation //----------------------------------------------------------------------------- void CToolFrameworkClient::AdjustEngineViewport( int& x, int& y, int& width, int& height ) { if ( m_pTools ) { m_pTools->AdjustEngineViewport( x, y, width, height ); } } void ToolFramework_AdjustEngineViewport( int& x, int& y, int& width, int& height ) { g_ToolFrameworkClient.AdjustEngineViewport( x, y, width, height ); } //----------------------------------------------------------------------------- // View manipulation //----------------------------------------------------------------------------- bool CToolFrameworkClient::SetupEngineView( Vector &origin, QAngle &angles, float &fov ) { if ( !m_pTools ) return false; return m_pTools->SetupEngineView( origin, angles, fov ); } bool ToolFramework_SetupEngineView( Vector &origin, QAngle &angles, float &fov ) { return g_ToolFrameworkClient.SetupEngineView( origin, angles, fov ); } //----------------------------------------------------------------------------- // microphone manipulation //----------------------------------------------------------------------------- bool CToolFrameworkClient::SetupAudioState( AudioState_t &audioState ) { if ( !m_pTools ) return false; return m_pTools->SetupAudioState( audioState ); } bool ToolFramework_SetupAudioState( AudioState_t &audioState ) { return g_ToolFrameworkClient.SetupAudioState( audioState ); } //----------------------------------------------------------------------------- // Helper class to indicate ownership of effects //----------------------------------------------------------------------------- CRecordEffectOwner::CRecordEffectOwner( C_BaseEntity *pEntity, bool bIsViewModel ) { m_bToolsEnabled = ToolsEnabled() && clienttools->IsInRecordingMode(); if ( m_bToolsEnabled ) { KeyValues *msg = new KeyValues( "EffectsOwner" ); msg->SetInt( "viewModel", bIsViewModel ); ToolFramework_PostToolMessage( pEntity ? pEntity->GetToolHandle() : HTOOLHANDLE_INVALID, msg ); msg->deleteThis(); } } CRecordEffectOwner::~CRecordEffectOwner() { if ( m_bToolsEnabled ) { KeyValues *msg = new KeyValues( "EffectsOwner" ); ToolFramework_PostToolMessage( HTOOLHANDLE_INVALID, msg ); msg->deleteThis(); } }