//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: Engine system for loading and managing tools // //============================================================================= #include "quakedef.h" #include "tier0/icommandline.h" #include "toolframework/itooldictionary.h" #include "toolframework/itoolsystem.h" #include "toolframework/itoolframework.h" #include "toolframework/iclientenginetools.h" #include "toolframework/iserverenginetools.h" #include "tier1/KeyValues.h" #include "tier1/utlvector.h" #include "tier1/tier1.h" #include "filesystem_engine.h" class IToolSystem; extern CreateInterfaceFn g_AppSystemFactory; typedef bool (*FnQuitHandler)( void *pvUserData ); void EngineTool_InstallQuitHandler( void *pvUserData, FnQuitHandler func ); //----------------------------------------------------------------------------- // Purpose: -tools loads framework //----------------------------------------------------------------------------- class CToolFrameworkInternal : public IToolFrameworkInternal { public: // Here's where the app systems get to learn about each other virtual bool Connect( CreateInterfaceFn factory ); virtual void Disconnect(); // Here's where systems can access other interfaces implemented by this object // Returns NULL if it doesn't implement the requested interface virtual void *QueryInterface( const char *pInterfaceName ); // Init, shutdown virtual InitReturnVal_t Init(); virtual void Shutdown(); virtual bool CanQuit(); public: // Level init, shutdown virtual void ClientLevelInitPreEntityAllTools(); // entities are created / spawned / precached here virtual void ClientLevelInitPostEntityAllTools(); virtual void ClientLevelShutdownPreEntityAllTools(); // Entities are deleted / released here... virtual void ClientLevelShutdownPostEntityAllTools(); virtual void ClientPreRenderAllTools(); virtual void ClientPostRenderAllTools(); virtual bool IsThirdPersonCamera(); virtual bool IsToolRecording(); // Level init, shutdown virtual void ServerLevelInitPreEntityAllTools(); // entities are created / spawned / precached here virtual void ServerLevelInitPostEntityAllTools(); virtual void ServerLevelShutdownPreEntityAllTools(); // Entities are deleted / released here... virtual void ServerLevelShutdownPostEntityAllTools(); // end of level shutdown // Called each frame before entities think virtual void ServerFrameUpdatePreEntityThinkAllTools(); // called after entities think virtual void ServerFrameUpdatePostEntityThinkAllTools(); virtual void ServerPreClientUpdateAllTools(); const char* GetEntityData( const char *pActualEntityData ); virtual void ServerPreSetupVisibilityAllTools(); virtual bool PostInit(); virtual bool ServerInit( CreateInterfaceFn serverFactory ); virtual bool ClientInit( CreateInterfaceFn clientFactory ); virtual void ServerShutdown(); virtual void ClientShutdown(); virtual void Think( bool finalTick ); virtual void PostToolMessage( HTOOLHANDLE hEntity, KeyValues *msg ); virtual void AdjustEngineViewport( int& x, int& y, int& width, int& height ); virtual bool SetupEngineView( Vector &origin, QAngle &angles, float &fov ); virtual bool SetupAudioState( AudioState_t &audioState ); virtual int GetToolCount(); virtual const char* GetToolName( int index ); virtual void SwitchToTool( int index ); virtual IToolSystem* SwitchToTool( const char* pToolName ); virtual bool IsTopmostTool( const IToolSystem *sys ); virtual const IToolSystem *GetToolSystem( int index ) const; virtual IToolSystem *GetTopmostTool(); virtual void PostMessage( KeyValues *msg ); virtual bool GetSoundSpatialization( int iUserData, int guid, SpatializationInfo_t& info ); virtual void HostRunFrameBegin(); virtual void HostRunFrameEnd(); virtual void RenderFrameBegin(); virtual void RenderFrameEnd(); virtual void VGui_PreRenderAllTools( int paintMode ); virtual void VGui_PostRenderAllTools( int paintMode ); virtual void VGui_PreSimulateAllTools(); virtual void VGui_PostSimulateAllTools(); // Are we using tools? virtual bool InToolMode(); // Should the game be allowed to render the world? virtual bool ShouldGameRenderView(); virtual IMaterialProxy *LookupProxy( const char *proxyName ); private: void LoadTools(); void LoadToolsFromLibrary( const char *dllname ); void InvokeMethod( ToolSystemFunc_t f ); void InvokeMethodInt( ToolSystemFunc_Int_t f, int arg ); void ShutdownTools(); // Purpose: Shuts down all modules void ShutdownModules(); // Purpose: Shuts down all tool dictionaries void ShutdownToolDictionaries(); CUtlVector< IToolSystem * > m_ToolSystems; CUtlVector< IToolDictionary * > m_Dictionaries; CUtlVector< CSysModule * > m_Modules; int m_nActiveToolIndex; bool m_bInToolMode; }; static CToolFrameworkInternal g_ToolFrameworkInternal; IToolFrameworkInternal *toolframework = &g_ToolFrameworkInternal; //----------------------------------------------------------------------------- // Purpose: Used to invoke a method of all added Game systems in order // Input : f - function to execute //----------------------------------------------------------------------------- void CToolFrameworkInternal::InvokeMethod( ToolSystemFunc_t f ) { int toolCount = m_ToolSystems.Count(); for ( int i = 0; i < toolCount; ++i ) { IToolSystem *sys = m_ToolSystems[i]; (sys->*f)(); } } //----------------------------------------------------------------------------- // Purpose: Used to invoke a method of all added Game systems in order // Input : f - function to execute //----------------------------------------------------------------------------- void CToolFrameworkInternal::InvokeMethodInt( ToolSystemFunc_Int_t f, int arg ) { int toolCount = m_ToolSystems.Count(); for ( int i = 0; i < toolCount; ++i ) { IToolSystem *sys = m_ToolSystems[i]; (sys->*f)( arg ); } } //----------------------------------------------------------------------------- // Purpose: Here's where the app systems get to learn about each other // Input : factory - // Output : Returns true on success, false on failure. //----------------------------------------------------------------------------- bool CToolFrameworkInternal::Connect( CreateInterfaceFn factory ) { return true; } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CToolFrameworkInternal::Disconnect() { } //----------------------------------------------------------------------------- // Purpose: Here's where systems can access other interfaces implemented by this object // Returns NULL if it doesn't implement the requested interface // Input : *pInterfaceName - //----------------------------------------------------------------------------- void *CToolFrameworkInternal::QueryInterface( const char *pInterfaceName ) { return NULL; } //----------------------------------------------------------------------------- // Purpose: // Input : *pvUserData - // Output : static bool //----------------------------------------------------------------------------- static bool CToolFrameworkInternal_QuitHandler( void *pvUserData ) { CToolFrameworkInternal *tfm = reinterpret_cast< CToolFrameworkInternal * >( pvUserData ); if ( tfm ) { return tfm->CanQuit(); } return true; } //----------------------------------------------------------------------------- // Purpose: Init, shutdown // Input : - // Output : InitReturnVal_t //----------------------------------------------------------------------------- InitReturnVal_t CToolFrameworkInternal::Init() { m_bInToolMode = false; m_nActiveToolIndex = -1; // Disabled in REL for now #if 1 #ifndef SWDS EngineTool_InstallQuitHandler( this, CToolFrameworkInternal_QuitHandler ); // FIXME: Eventually this should be -edit if ( CommandLine()->FindParm( "-tools" ) ) { LoadTools(); } #endif #endif return INIT_OK; } //----------------------------------------------------------------------------- // Purpose: Called at end of Host_Init //----------------------------------------------------------------------------- bool CToolFrameworkInternal::PostInit() { bool bRetVal = true; int toolCount = m_ToolSystems.Count(); for ( int i = 0; i < toolCount; ++i ) { IToolSystem *system = m_ToolSystems[ i ]; // FIXME: Should this really get access to a list if factories bool success = system->Init( ); if ( !success ) { bRetVal = false; } } // Activate first tool if we didn't encounter an error if ( bRetVal ) { SwitchToTool( 0 ); } return bRetVal; } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CToolFrameworkInternal::Shutdown() { // Shut down all tools ShutdownTools(); } //----------------------------------------------------------------------------- // Purpose: // Input : finalTick - //----------------------------------------------------------------------------- void CToolFrameworkInternal::Think( bool finalTick ) { int toolCount = m_ToolSystems.Count(); for ( int i = 0; i < toolCount; ++i ) { IToolSystem *system = m_ToolSystems[ i ]; system->Think( finalTick ); } } //----------------------------------------------------------------------------- // Purpose: // Input : serverFactory - // Output : Returns true on success, false on failure. //----------------------------------------------------------------------------- bool CToolFrameworkInternal::ServerInit( CreateInterfaceFn serverFactory ) { bool retval = true; int toolCount = m_ToolSystems.Count(); for ( int i = 0; i < toolCount; ++i ) { IToolSystem *system = m_ToolSystems[ i ]; // FIXME: Should this really get access to a list if factories bool success = system->ServerInit( serverFactory ); if ( !success ) { retval = false; } } return retval; } //----------------------------------------------------------------------------- // Purpose: // Input : clientFactory - // Output : Returns true on success, false on failure. //----------------------------------------------------------------------------- bool CToolFrameworkInternal::ClientInit( CreateInterfaceFn clientFactory ) { bool retval = true; int toolCount = m_ToolSystems.Count(); for ( int i = 0; i < toolCount; ++i ) { IToolSystem *system = m_ToolSystems[ i ]; // FIXME: Should this really get access to a list if factories bool success = system->ClientInit( clientFactory ); if ( !success ) { retval = false; } } return retval; } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CToolFrameworkInternal::ServerShutdown() { // Reverse order int toolCount = m_ToolSystems.Count(); for ( int i = toolCount - 1; i >= 0; --i ) { IToolSystem *system = m_ToolSystems[ i ]; system->ServerShutdown(); } } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CToolFrameworkInternal::ClientShutdown() { // Reverse order int toolCount = m_ToolSystems.Count(); for ( int i = toolCount - 1; i >= 0; --i ) { IToolSystem *system = m_ToolSystems[ i ]; system->ClientShutdown(); } } //----------------------------------------------------------------------------- // Purpose: // Input : - // Output : Returns true on success, false on failure. //----------------------------------------------------------------------------- bool CToolFrameworkInternal::CanQuit() { int toolCount = m_ToolSystems.Count(); for ( int i = 0; i < toolCount; ++i ) { IToolSystem *system = m_ToolSystems[ i ]; bool canquit = system->CanQuit(); if ( !canquit ) { return false; } } return true; } //----------------------------------------------------------------------------- // Purpose: Shuts down all modules //----------------------------------------------------------------------------- void CToolFrameworkInternal::ShutdownModules() { // Shutdown dictionaries int i; for ( i = m_Modules.Count(); --i >= 0; ) { Sys_UnloadModule( m_Modules[i] ); } m_Modules.RemoveAll(); } //----------------------------------------------------------------------------- // Purpose: Shuts down all tool dictionaries //----------------------------------------------------------------------------- void CToolFrameworkInternal::ShutdownToolDictionaries() { // Shutdown dictionaries int i; for ( i = m_Dictionaries.Count(); --i >= 0; ) { m_Dictionaries[i]->Shutdown(); } for ( i = m_Dictionaries.Count(); --i >= 0; ) { m_Dictionaries[i]->Disconnect(); } m_Dictionaries.RemoveAll(); } //----------------------------------------------------------------------------- // Purpose: Shuts down all tools // Input : - //----------------------------------------------------------------------------- void CToolFrameworkInternal::ShutdownTools() { // Deactivate tool SwitchToTool( -1 ); // Reverse order int i; int toolCount = m_ToolSystems.Count(); for ( i = toolCount - 1; i >= 0; --i ) { IToolSystem *system = m_ToolSystems[ i ]; system->Shutdown(); } m_ToolSystems.RemoveAll(); ShutdownToolDictionaries(); ShutdownModules(); } //----------------------------------------------------------------------------- // Purpose: Adds tool from specified library // Input : *dllname - //----------------------------------------------------------------------------- void CToolFrameworkInternal::LoadToolsFromLibrary( const char *dllname ) { CSysModule *module = Sys_LoadModule( dllname ); if ( !module ) { Warning( "CToolFrameworkInternal::LoadToolsFromLibrary: Unable to load '%s'\n", dllname ); return; } CreateInterfaceFn factory = Sys_GetFactory( module ); if ( !factory ) { Sys_UnloadModule( module ); Warning( "CToolFrameworkInternal::LoadToolsFromLibrary: Dll '%s' has no factory\n", dllname ); return; } IToolDictionary *dictionary = ( IToolDictionary * )factory( VTOOLDICTIONARY_INTERFACE_VERSION, NULL ); if ( !dictionary ) { Sys_UnloadModule( module ); Warning( "CToolFrameworkInternal::LoadToolsFromLibrary: Dll '%s' doesn't support '%s'\n", dllname, VTOOLDICTIONARY_INTERFACE_VERSION ); return; } if ( !dictionary->Connect( g_AppSystemFactory ) ) { Sys_UnloadModule( module ); Warning( "CToolFrameworkInternal::LoadToolsFromLibrary: Dll '%s' connection phase failed.\n", dllname ); return; } if ( dictionary->Init( ) != INIT_OK ) { Sys_UnloadModule( module ); Warning( "CToolFrameworkInternal::LoadToolsFromLibrary: Dll '%s' initialization phase failed.\n", dllname ); return; } dictionary->CreateTools(); int toolCount = dictionary->GetToolCount(); for ( int i = 0; i < toolCount; ++i ) { IToolSystem *tool = dictionary->GetTool( i ); if ( tool ) { Msg( "Loaded tool '%s'\n", tool->GetToolName() ); m_ToolSystems.AddToTail( tool ); } } m_Dictionaries.AddToTail( dictionary ); m_Modules.AddToTail( module ); } //----------------------------------------------------------------------------- // Are we using tools? //----------------------------------------------------------------------------- bool CToolFrameworkInternal::InToolMode() { return m_bInToolMode; } //----------------------------------------------------------------------------- // Should the game be allowed to render the world? //----------------------------------------------------------------------------- bool CToolFrameworkInternal::ShouldGameRenderView() { if ( m_nActiveToolIndex >= 0 ) { IToolSystem *tool = m_ToolSystems[ m_nActiveToolIndex ]; Assert( tool ); return tool->ShouldGameRenderView( ); } return true; } IMaterialProxy *CToolFrameworkInternal::LookupProxy( const char *proxyName ) { int toolCount = GetToolCount(); for ( int i = 0; i < toolCount; ++i ) { IToolSystem *tool = m_ToolSystems[ i ]; Assert( tool ); IMaterialProxy *matProxy = tool->LookupProxy( proxyName ); if ( matProxy ) { return matProxy; } } return NULL; } //----------------------------------------------------------------------------- // Purpose: FIXME: Should scan a KeyValues file // Input : - //----------------------------------------------------------------------------- void CToolFrameworkInternal::LoadTools() { m_bInToolMode = true; // Load rootdir/bin/enginetools.txt KeyValues *kv = new KeyValues( "enginetools" ); Assert( kv ); // We don't ship enginetools.txt to Steam public, so we'll need to load sdkenginetools.txt if enginetools.txt isn't present bool bLoadSDKFile = !g_pFileSystem->FileExists( "enginetools.txt", "EXECUTABLE_PATH" ); if ( kv && kv->LoadFromFile( g_pFileSystem, bLoadSDKFile ? "sdkenginetools.txt" : "enginetools.txt", "EXECUTABLE_PATH" ) ) { for ( KeyValues *tool = kv->GetFirstSubKey(); tool != NULL; tool = tool->GetNextKey() ) { if ( !Q_stricmp( tool->GetName(), "library" ) ) { // CHECK both bin/tools and gamedir/bin/tools LoadToolsFromLibrary( tool->GetString() ); } } kv->deleteThis(); } } //----------------------------------------------------------------------------- // Purpose: Level init, shutdown // Input : - //----------------------------------------------------------------------------- void CToolFrameworkInternal::ClientLevelInitPreEntityAllTools() { InvokeMethod( &IToolSystem::ClientLevelInitPreEntity ); } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CToolFrameworkInternal::ClientLevelInitPostEntityAllTools() { InvokeMethod( &IToolSystem::ClientLevelInitPostEntity ); } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CToolFrameworkInternal::ClientLevelShutdownPreEntityAllTools() { InvokeMethod( &IToolSystem::ClientLevelShutdownPreEntity ); } //----------------------------------------------------------------------------- // Purpose: Entities are deleted / released here... //----------------------------------------------------------------------------- void CToolFrameworkInternal::ClientLevelShutdownPostEntityAllTools() { InvokeMethod( &IToolSystem::ClientLevelShutdownPostEntity ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CToolFrameworkInternal::ClientPreRenderAllTools() { InvokeMethod( &IToolSystem::ClientPreRender ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool CToolFrameworkInternal::IsThirdPersonCamera() { if ( m_nActiveToolIndex >= 0 ) { IToolSystem *tool = m_ToolSystems[ m_nActiveToolIndex ]; Assert( tool ); return tool->IsThirdPersonCamera( ); } return false; } // is the current tool recording? bool CToolFrameworkInternal::IsToolRecording() { if ( m_nActiveToolIndex >= 0 ) { IToolSystem *tool = m_ToolSystems[ m_nActiveToolIndex ]; Assert( tool ); return tool->IsToolRecording( ); } return false; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CToolFrameworkInternal::ClientPostRenderAllTools() { InvokeMethod( &IToolSystem::ClientPostRender ); } //----------------------------------------------------------------------------- // Purpose: Level init, shutdown //----------------------------------------------------------------------------- void CToolFrameworkInternal::ServerLevelInitPreEntityAllTools() { InvokeMethod( &IToolSystem::ServerLevelInitPreEntity ); } //----------------------------------------------------------------------------- // Purpose: entities are created / spawned / precached here // Input : - //----------------------------------------------------------------------------- void CToolFrameworkInternal::ServerLevelInitPostEntityAllTools() { InvokeMethod( &IToolSystem::ServerLevelInitPostEntity ); } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CToolFrameworkInternal::ServerLevelShutdownPreEntityAllTools() { InvokeMethod( &IToolSystem::ServerLevelShutdownPreEntity ); } //----------------------------------------------------------------------------- // Purpose: Entities are deleted / released here... // Input : - //----------------------------------------------------------------------------- void CToolFrameworkInternal::ServerLevelShutdownPostEntityAllTools() { InvokeMethod( &IToolSystem::ServerLevelShutdownPostEntity ); } //----------------------------------------------------------------------------- // Purpose: Called each frame before entities think // Input : - //----------------------------------------------------------------------------- void CToolFrameworkInternal::ServerFrameUpdatePreEntityThinkAllTools() { InvokeMethod( &IToolSystem::ServerFrameUpdatePreEntityThink ); } //----------------------------------------------------------------------------- // Purpose: Called after entities think // Input : - //----------------------------------------------------------------------------- void CToolFrameworkInternal::ServerFrameUpdatePostEntityThinkAllTools() { InvokeMethod( &IToolSystem::ServerFrameUpdatePostEntityThink ); } //----------------------------------------------------------------------------- // Purpose: Called before client networking occurs on the server // Input : - //----------------------------------------------------------------------------- void CToolFrameworkInternal::ServerPreClientUpdateAllTools() { InvokeMethod( &IToolSystem::ServerPreClientUpdate ); } //----------------------------------------------------------------------------- // The server uses this to call into the tools to get the actual // entities to spawn on startup //----------------------------------------------------------------------------- const char* CToolFrameworkInternal::GetEntityData( const char *pActualEntityData ) { if ( m_nActiveToolIndex >= 0 ) { IToolSystem *tool = m_ToolSystems[ m_nActiveToolIndex ]; Assert( tool ); return tool->GetEntityData( pActualEntityData ); } return pActualEntityData; } void CToolFrameworkInternal::ServerPreSetupVisibilityAllTools() { InvokeMethod( &IToolSystem::ServerPreSetupVisibility ); } //----------------------------------------------------------------------------- // Purpose: Post a message to tools // Input : hEntity - // *msg - //----------------------------------------------------------------------------- void CToolFrameworkInternal::PostToolMessage( HTOOLHANDLE hEntity, KeyValues *msg ) { // FIXME: Only message topmost tool? int toolCount = m_ToolSystems.Count(); for ( int i = 0; i < toolCount; ++i ) { IToolSystem *tool = m_ToolSystems[ i ]; Assert( tool ); tool->PostMessage( hEntity, msg ); } } //----------------------------------------------------------------------------- // Purpose: Only active tool gets to adjust viewport // Input : x - // y - // width - // height - //----------------------------------------------------------------------------- void CToolFrameworkInternal::AdjustEngineViewport( int& x, int& y, int& width, int& height ) { if ( m_nActiveToolIndex >= 0 ) { IToolSystem *tool = m_ToolSystems[ m_nActiveToolIndex ]; Assert( tool ); tool->AdjustEngineViewport( x, y, width, height ); } } //----------------------------------------------------------------------------- // Purpose: Only active tool gets to set the camera/view //----------------------------------------------------------------------------- bool CToolFrameworkInternal::SetupEngineView( Vector &origin, QAngle &angles, float &fov ) { if ( m_nActiveToolIndex < 0 ) return false; IToolSystem *tool = m_ToolSystems[ m_nActiveToolIndex ]; Assert( tool ); return tool->SetupEngineView( origin, angles, fov ); } //----------------------------------------------------------------------------- // Purpose: Only active tool gets to set the microphone //----------------------------------------------------------------------------- bool CToolFrameworkInternal::SetupAudioState( AudioState_t &audioState ) { if ( m_nActiveToolIndex < 0 ) return false; IToolSystem *tool = m_ToolSystems[ m_nActiveToolIndex ]; Assert( tool ); return tool->SetupAudioState( audioState ); } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CToolFrameworkInternal::VGui_PreRenderAllTools( int paintMode ) { InvokeMethodInt( &IToolSystem::VGui_PreRender, paintMode ); } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CToolFrameworkInternal::VGui_PostRenderAllTools( int paintMode ) { InvokeMethodInt( &IToolSystem::VGui_PostRender, paintMode ); } void CToolFrameworkInternal::VGui_PreSimulateAllTools() { InvokeMethod( &IToolSystem::VGui_PreSimulate ); } void CToolFrameworkInternal::VGui_PostSimulateAllTools() { InvokeMethod( &IToolSystem::VGui_PostSimulate ); } //----------------------------------------------------------------------------- // Purpose: // Input : - // Output : int //----------------------------------------------------------------------------- int CToolFrameworkInternal::GetToolCount() { return m_ToolSystems.Count(); } //----------------------------------------------------------------------------- // Purpose: // Input : index - // Output : const char //----------------------------------------------------------------------------- const char *CToolFrameworkInternal::GetToolName( int index ) { if ( index < 0 || index >= m_ToolSystems.Count() ) { return ""; } IToolSystem *sys = m_ToolSystems[ index ]; if ( sys ) { return sys->GetToolName(); } return ""; } //----------------------------------------------------------------------------- // Purpose: // Input : index - //----------------------------------------------------------------------------- void CToolFrameworkInternal::SwitchToTool( int index ) { if ( ( m_ToolSystems.Count() < 1 ) || ( index >= m_ToolSystems.Count() ) ) return; if ( index != m_nActiveToolIndex ) { if ( m_nActiveToolIndex >= 0 ) { IToolSystem *pOldTool = m_ToolSystems[ m_nActiveToolIndex ]; pOldTool->OnToolDeactivate(); } m_nActiveToolIndex = index; if ( m_nActiveToolIndex >= 0 ) { IToolSystem *pNewTool = m_ToolSystems[ m_nActiveToolIndex ]; pNewTool->OnToolActivate(); } } } //----------------------------------------------------------------------------- // Switches to a named tool //----------------------------------------------------------------------------- IToolSystem *CToolFrameworkInternal::SwitchToTool( const char* pToolName ) { int nCount = GetToolCount(); for ( int i = 0; i < nCount; ++i ) { if ( !Q_stricmp( pToolName, GetToolName(i) ) ) { SwitchToTool( i ); return m_ToolSystems[i]; } } return NULL; } //----------------------------------------------------------------------------- // Purpose: // Input : *sys - // Output : Returns true on success, false on failure. //----------------------------------------------------------------------------- bool CToolFrameworkInternal::IsTopmostTool( const IToolSystem *sys ) { if ( m_ToolSystems.Count() <= 0 || ( m_nActiveToolIndex < 0 ) ) return false; return ( m_ToolSystems[ m_nActiveToolIndex ] == sys ); } IToolSystem *CToolFrameworkInternal::GetTopmostTool() { return m_nActiveToolIndex >= 0 ? m_ToolSystems[ m_nActiveToolIndex ] : NULL; } //----------------------------------------------------------------------------- // returns a tool system by index //----------------------------------------------------------------------------- const IToolSystem *CToolFrameworkInternal::GetToolSystem( int index ) const { if ( ( index < 0 ) || ( index >= m_ToolSystems.Count() ) ) return NULL; return m_ToolSystems[index]; } void CToolFrameworkInternal::PostMessage( KeyValues *msg ) { if ( m_nActiveToolIndex >= 0 ) { IToolSystem *tool = m_ToolSystems[ m_nActiveToolIndex ]; Assert( tool ); tool->PostMessage( 0, msg ); } } bool CToolFrameworkInternal::GetSoundSpatialization( int iUserData, int guid, SpatializationInfo_t& info ) { if ( m_nActiveToolIndex >= 0 ) { IToolSystem *tool = m_ToolSystems[ m_nActiveToolIndex ]; Assert( tool ); return tool->GetSoundSpatialization( iUserData, guid, info ); } return true; } void CToolFrameworkInternal::HostRunFrameBegin() { InvokeMethod( &IToolSystem::HostRunFrameBegin ); } void CToolFrameworkInternal::HostRunFrameEnd() { InvokeMethod( &IToolSystem::HostRunFrameEnd ); } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CToolFrameworkInternal::RenderFrameBegin() { InvokeMethod( &IToolSystem::RenderFrameBegin ); } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CToolFrameworkInternal::RenderFrameEnd() { InvokeMethod( &IToolSystem::RenderFrameEnd ); } // Exposed because it's an IAppSystem EXPOSE_SINGLE_INTERFACE_GLOBALVAR( CToolFrameworkInternal, IToolFrameworkInternal, VTOOLFRAMEWORK_INTERFACE_VERSION, g_ToolFrameworkInternal ); //----------------------------------------------------------------------------- // Purpose: exposed from engine to client .dll //----------------------------------------------------------------------------- class CClientEngineTools : public IClientEngineTools { public: virtual void LevelInitPreEntityAllTools(); virtual void LevelInitPostEntityAllTools(); virtual void LevelShutdownPreEntityAllTools(); virtual void LevelShutdownPostEntityAllTools(); virtual void PreRenderAllTools(); virtual void PostRenderAllTools(); virtual void PostToolMessage( HTOOLHANDLE hEntity, KeyValues *msg ); virtual void AdjustEngineViewport( int& x, int& y, int& width, int& height ); virtual bool SetupEngineView( Vector &origin, QAngle &angles, float &fov ); virtual bool SetupAudioState( AudioState_t &audioState ); virtual void VGui_PreRenderAllTools( int paintMode ); virtual void VGui_PostRenderAllTools( int paintMode ); virtual bool IsThirdPersonCamera( ); virtual bool InToolMode(); }; EXPOSE_SINGLE_INTERFACE( CClientEngineTools, IClientEngineTools, VCLIENTENGINETOOLS_INTERFACE_VERSION ); //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CClientEngineTools::LevelInitPreEntityAllTools() { g_ToolFrameworkInternal.ClientLevelInitPreEntityAllTools(); } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CClientEngineTools::LevelInitPostEntityAllTools() { g_ToolFrameworkInternal.ClientLevelInitPostEntityAllTools(); } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CClientEngineTools::LevelShutdownPreEntityAllTools() { g_ToolFrameworkInternal.ClientLevelShutdownPreEntityAllTools(); } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CClientEngineTools::LevelShutdownPostEntityAllTools() { g_ToolFrameworkInternal.ClientLevelShutdownPostEntityAllTools(); } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CClientEngineTools::PreRenderAllTools() { g_ToolFrameworkInternal.ClientPreRenderAllTools(); } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CClientEngineTools::PostRenderAllTools() { g_ToolFrameworkInternal.ClientPostRenderAllTools(); } //----------------------------------------------------------------------------- // Purpose: // Input : hEntity - // *msg - //----------------------------------------------------------------------------- void CClientEngineTools::PostToolMessage( HTOOLHANDLE hEntity, KeyValues *msg ) { g_ToolFrameworkInternal.PostToolMessage( hEntity, msg ); } //----------------------------------------------------------------------------- // Purpose: // Input : x - // y - // width - // height - //----------------------------------------------------------------------------- void CClientEngineTools::AdjustEngineViewport( int& x, int& y, int& width, int& height ) { g_ToolFrameworkInternal.AdjustEngineViewport( x, y, width, height ); } bool CClientEngineTools::SetupEngineView( Vector &origin, QAngle &angles, float &fov ) { return g_ToolFrameworkInternal.SetupEngineView( origin, angles, fov ); } bool CClientEngineTools::SetupAudioState( AudioState_t &audioState ) { return g_ToolFrameworkInternal.SetupAudioState( audioState ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CClientEngineTools::VGui_PreRenderAllTools( int paintMode ) { g_ToolFrameworkInternal.VGui_PreRenderAllTools( paintMode ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CClientEngineTools::VGui_PostRenderAllTools( int paintMode ) { g_ToolFrameworkInternal.VGui_PostRenderAllTools( paintMode ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool CClientEngineTools::IsThirdPersonCamera( ) { return g_ToolFrameworkInternal.IsThirdPersonCamera( ); } bool CClientEngineTools::InToolMode() { return g_ToolFrameworkInternal.InToolMode(); } //----------------------------------------------------------------------------- // Purpose: Exposed to server.dll //----------------------------------------------------------------------------- class CServerEngineTools : public IServerEngineTools { public: // Inherited from IServerEngineTools virtual void LevelInitPreEntityAllTools(); virtual void LevelInitPostEntityAllTools(); virtual void LevelShutdownPreEntityAllTools(); virtual void LevelShutdownPostEntityAllTools(); virtual void FrameUpdatePreEntityThinkAllTools(); virtual void FrameUpdatePostEntityThinkAllTools(); virtual void PreClientUpdateAllTools(); virtual void PreSetupVisibilityAllTools(); virtual const char* GetEntityData( const char *pActualEntityData ); virtual bool InToolMode(); }; EXPOSE_SINGLE_INTERFACE( CServerEngineTools, IServerEngineTools, VSERVERENGINETOOLS_INTERFACE_VERSION ); //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CServerEngineTools::LevelInitPreEntityAllTools() { g_ToolFrameworkInternal.ServerLevelInitPreEntityAllTools(); } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CServerEngineTools::LevelInitPostEntityAllTools() { g_ToolFrameworkInternal.ServerLevelInitPostEntityAllTools(); } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CServerEngineTools::LevelShutdownPreEntityAllTools() { g_ToolFrameworkInternal.ServerLevelShutdownPreEntityAllTools(); } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CServerEngineTools::LevelShutdownPostEntityAllTools() { g_ToolFrameworkInternal.ServerLevelShutdownPostEntityAllTools(); } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CServerEngineTools::FrameUpdatePreEntityThinkAllTools() { g_ToolFrameworkInternal.ServerFrameUpdatePreEntityThinkAllTools(); } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CServerEngineTools::FrameUpdatePostEntityThinkAllTools() { g_ToolFrameworkInternal.ServerFrameUpdatePostEntityThinkAllTools(); } //----------------------------------------------------------------------------- // Purpose: // Input : - //----------------------------------------------------------------------------- void CServerEngineTools::PreClientUpdateAllTools() { g_ToolFrameworkInternal.ServerPreClientUpdateAllTools(); } //----------------------------------------------------------------------------- // The server uses this to call into the tools to get the actual // entities to spawn on startup //----------------------------------------------------------------------------- const char* CServerEngineTools::GetEntityData( const char *pActualEntityData ) { return g_ToolFrameworkInternal.GetEntityData( pActualEntityData ); } void CServerEngineTools::PreSetupVisibilityAllTools() { return g_ToolFrameworkInternal.ServerPreSetupVisibilityAllTools(); } bool CServerEngineTools::InToolMode() { return g_ToolFrameworkInternal.InToolMode(); }