Team Fortress 2 Source Code as on 22/4/2020
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.

198 lines
5.8 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose: Launcher for hammer, which is sitting in its own DLL
  4. //
  5. //===========================================================================//
  6. #include <windows.h>
  7. #include <eh.h>
  8. #include "appframework/AppFramework.h"
  9. #include "ihammer.h"
  10. #include "tier0/dbg.h"
  11. #include "vstdlib/cvar.h"
  12. #include "filesystem.h"
  13. #include "materialsystem/imaterialsystem.h"
  14. #include "istudiorender.h"
  15. #include "filesystem_init.h"
  16. #include "datacache/idatacache.h"
  17. #include "datacache/imdlcache.h"
  18. #include "vphysics_interface.h"
  19. #include "vgui/ivgui.h"
  20. #include "vgui/ISurface.h"
  21. #include "inputsystem/iinputsystem.h"
  22. #include "tier0/icommandline.h"
  23. #include "p4lib/ip4.h"
  24. //-----------------------------------------------------------------------------
  25. // Global systems
  26. //-----------------------------------------------------------------------------
  27. IHammer *g_pHammer;
  28. IMaterialSystem *g_pMaterialSystem;
  29. IFileSystem *g_pFileSystem;
  30. IDataCache *g_pDataCache;
  31. IInputSystem *g_pInputSystem;
  32. //-----------------------------------------------------------------------------
  33. // The application object
  34. //-----------------------------------------------------------------------------
  35. class CHammerApp : public CAppSystemGroup
  36. {
  37. public:
  38. // Methods of IApplication
  39. virtual bool Create( );
  40. virtual bool PreInit( );
  41. virtual int Main( );
  42. virtual void PostShutdown();
  43. virtual void Destroy();
  44. private:
  45. int MainLoop();
  46. };
  47. //-----------------------------------------------------------------------------
  48. // Define the application object
  49. //-----------------------------------------------------------------------------
  50. CHammerApp g_ApplicationObject;
  51. DEFINE_WINDOWED_APPLICATION_OBJECT_GLOBALVAR( g_ApplicationObject );
  52. //-----------------------------------------------------------------------------
  53. // Create all singleton systems
  54. //-----------------------------------------------------------------------------
  55. bool CHammerApp::Create( )
  56. {
  57. // Save some memory so engine/hammer isn't so painful
  58. CommandLine()->AppendParm( "-disallowhwmorph", NULL );
  59. IAppSystem *pSystem;
  60. // Add in the cvar factory
  61. AppModule_t cvarModule = LoadModule( VStdLib_GetICVarFactory() );
  62. pSystem = AddSystem( cvarModule, CVAR_INTERFACE_VERSION );
  63. if ( !pSystem )
  64. return false;
  65. bool bSteam;
  66. char pFileSystemDLL[MAX_PATH];
  67. if ( FileSystem_GetFileSystemDLLName( pFileSystemDLL, MAX_PATH, bSteam ) != FS_OK )
  68. return false;
  69. AppModule_t fileSystemModule = LoadModule( pFileSystemDLL );
  70. g_pFileSystem = (IFileSystem*)AddSystem( fileSystemModule, FILESYSTEM_INTERFACE_VERSION );
  71. FileSystem_SetBasePaths( g_pFileSystem );
  72. AppSystemInfo_t appSystems[] =
  73. {
  74. { "materialsystem.dll", MATERIAL_SYSTEM_INTERFACE_VERSION },
  75. { "inputsystem.dll", INPUTSYSTEM_INTERFACE_VERSION },
  76. { "studiorender.dll", STUDIO_RENDER_INTERFACE_VERSION },
  77. { "vphysics.dll", VPHYSICS_INTERFACE_VERSION },
  78. { "datacache.dll", DATACACHE_INTERFACE_VERSION },
  79. { "datacache.dll", MDLCACHE_INTERFACE_VERSION },
  80. { "datacache.dll", STUDIO_DATA_CACHE_INTERFACE_VERSION },
  81. { "vguimatsurface.dll", VGUI_SURFACE_INTERFACE_VERSION },
  82. { "vgui2.dll", VGUI_IVGUI_INTERFACE_VERSION },
  83. { "hammer_dll.dll", INTERFACEVERSION_HAMMER },
  84. { "", "" } // Required to terminate the list
  85. };
  86. if ( !AddSystems( appSystems ) )
  87. return false;
  88. // Add Perforce separately since it's possible it isn't there. (SDK)
  89. if ( !CommandLine()->CheckParm( "-nop4" ) )
  90. {
  91. AppModule_t p4Module = LoadModule( "p4lib.dll" );
  92. AddSystem( p4Module, P4_INTERFACE_VERSION );
  93. }
  94. // Connect to interfaces loaded in AddSystems that we need locally
  95. g_pMaterialSystem = (IMaterialSystem*)FindSystem( MATERIAL_SYSTEM_INTERFACE_VERSION );
  96. g_pHammer = (IHammer*)FindSystem( INTERFACEVERSION_HAMMER );
  97. g_pDataCache = (IDataCache*)FindSystem( DATACACHE_INTERFACE_VERSION );
  98. g_pInputSystem = (IInputSystem*)FindSystem( INPUTSYSTEM_INTERFACE_VERSION );
  99. // This has to be done before connection.
  100. g_pMaterialSystem->SetShaderAPI( "shaderapidx9.dll" );
  101. return true;
  102. }
  103. void CHammerApp::Destroy()
  104. {
  105. g_pFileSystem = NULL;
  106. g_pMaterialSystem = NULL;
  107. g_pDataCache = NULL;
  108. g_pHammer = NULL;
  109. g_pInputSystem = NULL;
  110. }
  111. //-----------------------------------------------------------------------------
  112. //-----------------------------------------------------------------------------
  113. SpewRetval_t HammerSpewFunc( SpewType_t type, tchar const *pMsg )
  114. {
  115. if ( type == SPEW_ASSERT )
  116. {
  117. return SPEW_DEBUGGER;
  118. }
  119. else if( type == SPEW_ERROR )
  120. {
  121. MessageBox( NULL, pMsg, "Hammer Error", MB_OK | MB_ICONSTOP );
  122. return SPEW_ABORT;
  123. }
  124. else
  125. {
  126. return SPEW_CONTINUE;
  127. }
  128. }
  129. //-----------------------------------------------------------------------------
  130. // Init, shutdown
  131. //-----------------------------------------------------------------------------
  132. bool CHammerApp::PreInit( )
  133. {
  134. SpewOutputFunc( HammerSpewFunc );
  135. if ( !g_pHammer->InitSessionGameConfig( GetVProjectCmdLineValue() ) )
  136. return false;
  137. //
  138. // Init the game and mod dirs in the file system.
  139. // This needs to happen before calling Init on the material system.
  140. //
  141. CFSSearchPathsInit initInfo;
  142. initInfo.m_pFileSystem = g_pFileSystem;
  143. initInfo.m_pDirectoryName = g_pHammer->GetDefaultModFullPath();
  144. if ( FileSystem_LoadSearchPaths( initInfo ) != FS_OK )
  145. {
  146. Error( "Unable to load search paths!\n" );
  147. }
  148. // Required to run through the editor
  149. g_pMaterialSystem->EnableEditorMaterials();
  150. // needed for VGUI model rendering
  151. g_pMaterialSystem->SetAdapter( 0, MATERIAL_INIT_ALLOCATE_FULLSCREEN_TEXTURE );
  152. return true;
  153. }
  154. void CHammerApp::PostShutdown()
  155. {
  156. }
  157. //-----------------------------------------------------------------------------
  158. // main application
  159. //-----------------------------------------------------------------------------
  160. int CHammerApp::Main( )
  161. {
  162. return g_pHammer->MainLoop();
  163. }