//====== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======= // // Purpose: // //============================================================================= #include "tier1/UtlVector.h" #include "tier1/convar.h" #include "icvar.h" #include "toolframework/itoolsystem.h" #include "toolframework/itooldictionary.h" #include "toolframework/ienginetool.h" #include "toolutils/enginetools_int.h" #include "ienginevgui.h" #include "icvar.h" #include "toolutils/vgui_tools.h" #include "mathlib/mathlib.h" #include "iregistry.h" #include "datamodel/idatamodel.h" #include "filesystem.h" #include "p4lib/ip4.h" #include "engine/ivdebugoverlay.h" #include "tier3/tier3dm.h" #include "datamodel/dmelementfactoryhelper.h" #include "dmserializers/idmserializers.h" #include "engine/ivmodelinfo.h" //----------------------------------------------------------------------------- // Singleton interfaces //----------------------------------------------------------------------------- IEngineTool *enginetools = NULL; IEngineVGui *enginevgui = NULL; IFileSystem *g_pFileSystem = NULL; IVDebugOverlay *debugoverlay = NULL; IVModelInfoClient *modelinfoclient = NULL; //----------------------------------------------------------------------------- // Assumed to be implemented within the specific tool DLL //----------------------------------------------------------------------------- bool ConnectTools( CreateInterfaceFn factory ); void CreateTools( ); void DisconnectTools( ); //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void VGUI_CreateToolRootPanel( void ) { // Just using PANEL_GAMEDLL in HL2 right now } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void VGUI_DestroyToolRootPanel( void ) { } //----------------------------------------------------------------------------- // Global accessors for root tool panels //----------------------------------------------------------------------------- vgui::VPANEL VGui_GetToolRootPanel( void ) { vgui::VPANEL root = enginevgui->GetPanel( PANEL_GAMEDLL ); return root; } vgui::VPANEL VGui_GetRootPanel( void ) { vgui::VPANEL root = enginevgui->GetPanel( PANEL_ROOT ); return root; } //----------------------------------------------------------------------------- // Implementation of IToolDictionary //----------------------------------------------------------------------------- class CToolDictionary : public CTier3DmAppSystem< IToolDictionary > { typedef CTier3DmAppSystem< IToolDictionary > BaseClass; public: CToolDictionary(); // Inherited from IAppSystem virtual bool Connect( CreateInterfaceFn factory ); virtual void Disconnect(); virtual void *QueryInterface( const char *pInterfaceName ); virtual InitReturnVal_t Init(); virtual void Shutdown(); // Inherited from IToolDictionary virtual void CreateTools(); virtual int GetToolCount() const; virtual IToolSystem *GetTool( int index ); public: void RegisterTool( IToolSystem *tool ); private: CUtlVector< IToolSystem * > m_Tools; }; //----------------------------------------------------------------------------- // Singleton interface for tools //----------------------------------------------------------------------------- static CToolDictionary g_ToolDictionary; EXPOSE_SINGLE_INTERFACE_GLOBALVAR( CToolDictionary, IToolDictionary, VTOOLDICTIONARY_INTERFACE_VERSION, g_ToolDictionary ); //----------------------------------------------------------------------------- // Constructor //----------------------------------------------------------------------------- CToolDictionary::CToolDictionary() { } //----------------------------------------------------------------------------- // Inherited from IAppSystem //----------------------------------------------------------------------------- bool CToolDictionary::Connect( CreateInterfaceFn factory ) { if ( !BaseClass::Connect( factory ) ) return false; // FIXME: This interface pointer is taken care of in tier2 + tier1 g_pFileSystem = g_pFullFileSystem; enginevgui = ( IEngineVGui * )factory( VENGINE_VGUI_VERSION, NULL ); enginetools = ( IEngineTool * )factory( VENGINETOOL_INTERFACE_VERSION, NULL ); debugoverlay = ( IVDebugOverlay * )factory( VDEBUG_OVERLAY_INTERFACE_VERSION, NULL ); modelinfoclient = ( IVModelInfoClient *)factory( VMODELINFO_CLIENT_INTERFACE_VERSION, NULL ); if ( !enginevgui || !debugoverlay || !g_pCVar || !enginetools || !g_pFileSystem || ( !p4 && !CommandLine()->FindParm( "-nop4" ) ) || !modelinfoclient ) return false; if ( !VGui_Startup( factory ) ) return false; return ConnectTools( factory ); } void CToolDictionary::Disconnect() { DisconnectTools(); enginevgui = NULL; enginetools = NULL; debugoverlay = NULL; g_pFileSystem = NULL; BaseClass::Disconnect( ); } void *CToolDictionary::QueryInterface( const char *pInterfaceName ) { if ( !V_strcmp( pInterfaceName, VTOOLDICTIONARY_INTERFACE_VERSION ) ) return (IToolDictionary*)this; return NULL; } InitReturnVal_t CToolDictionary::Init() { InitReturnVal_t nRetVal = BaseClass::Init(); if ( nRetVal != INIT_OK ) return nRetVal; MathLib_Init( 2.2f, 2.2f, 0.0f, 2.0f ); // Init registry if ( !registry->Init( "Source\\Tools" ) ) { Warning( "registry->Init failed\n" ); return INIT_FAILED; } // Re-enable this and VGui_Shutdown if we create root tool panels // VGui_PostInit(); return INIT_OK; } void CToolDictionary::Shutdown() { // Re-enable this and VGui_PostInit if we create root tool panels VGui_Shutdown(); registry->Shutdown(); BaseClass::Shutdown(); } //----------------------------------------------------------------------------- // Implementation of IToolDictionary methods //----------------------------------------------------------------------------- void CToolDictionary::CreateTools() { ::CreateTools( ); } int CToolDictionary::GetToolCount() const { return m_Tools.Count(); } IToolSystem *CToolDictionary::GetTool( int index ) { if ( index < 0 || index >= m_Tools.Count() ) { return NULL; } return m_Tools[ index ]; } void CToolDictionary::RegisterTool( IToolSystem *tool ) { m_Tools.AddToTail( tool ); } //----------------------------------------------------------------------------- // Allows tools to install themselves into the dictionary //----------------------------------------------------------------------------- void RegisterTool( IToolSystem *tool ) { g_ToolDictionary.RegisterTool( tool ); }