diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/xbox/makexvcd | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'utils/xbox/makexvcd')
| -rw-r--r-- | utils/xbox/makexvcd/cbase.h | 19 | ||||
| -rw-r--r-- | utils/xbox/makexvcd/makexvcd.cpp | 933 | ||||
| -rw-r--r-- | utils/xbox/makexvcd/makexvcd.vcproj | 497 |
3 files changed, 1449 insertions, 0 deletions
diff --git a/utils/xbox/makexvcd/cbase.h b/utils/xbox/makexvcd/cbase.h new file mode 100644 index 0000000..d374bb7 --- /dev/null +++ b/utils/xbox/makexvcd/cbase.h @@ -0,0 +1,19 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + +#ifndef CBASE_H +#define CBASE_H +#ifdef _WIN32 +#pragma once +#endif + +#include "basetypes.h" + +// This is just a dummy file to make this tool compile +#include "ai_activity.h" +#include "UtlVector.h" + +#endif // CBASE_H diff --git a/utils/xbox/makexvcd/makexvcd.cpp b/utils/xbox/makexvcd/makexvcd.cpp new file mode 100644 index 0000000..fcb1459 --- /dev/null +++ b/utils/xbox/makexvcd/makexvcd.cpp @@ -0,0 +1,933 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: vcd_sound_check.cpp : Defines the entry point for the console application. +// +//=============================================================================// +#include <stdio.h> +#include <windows.h> +#include "tier0/dbg.h" +#include "tier1/utldict.h" +#include "filesystem.h" +#include "FileSystem_Tools.h" +#include "tier1/KeyValues.h" +#include "cmdlib.h" +#include "scriplib.h" +#include "vstdlib/random.h" +#include "choreoscene.h" +#include "choreoevent.h" +#include "iscenetokenprocessor.h" +#include "tier1/utlbuffer.h" +#include "tier1/checksum_crc.h" +#include "pacifier.h" +#include "SceneCache.h" +#include "SoundEmitterSystem/isoundemittersystembase.h" +#include "ModelSoundsCache.h" +#include "Datacache/imdlcache.h" +#include "datacache/idatacache.h" +#include "studio.h" +#include "appframework/appframework.h" +#include "tier0/icommandline.h" +#include "istudiorender.h" +#include "materialsystem/imaterialsystem.h" +#include "vphysics_interface.h" +#include "icvar.h" +#include "vstdlib/cvar.h" +#include "eventlist.h" + +// #define TESTING 1 + + +bool uselogfile = false; +bool modelsoundscache = false; +bool scenecache = false; +bool virtualmodel = false; +bool buildxcds = false; + +struct AnalysisData +{ + CUtlSymbolTable symbols; +}; + +static AnalysisData g_Analysis; + +static char g_szCurrentGameDir[ 512 ]; + +IFileSystem *filesystem = NULL; +IMDLCache *g_pMDLCache = NULL; +ISoundEmitterSystemBase *soundemitterbase = NULL; + +static CUniformRandomStream g_Random; +IUniformRandomStream *random = &g_Random; + +static bool spewed = false; + +static CUtlCachedFileData< CSceneCache > g_SceneCache( "scene.cache", SCENECACHE_VERSION, 0, UTL_CACHED_FILE_USE_FILESIZE ); +static CUtlCachedFileData< CModelSoundsCache > g_ModelSoundsCache( "modelsounds.cache", MODELSOUNDSCACHE_VERSION, 0, UTL_CACHED_FILE_USE_FILESIZE ); + +//----------------------------------------------------------------------------- +// FIXME: This trashy glue code is really not acceptable. Figure out a way of making it unnecessary. +//----------------------------------------------------------------------------- +const studiohdr_t *studiohdr_t::FindModel( void **cache, char const *pModelName ) const +{ + MDLHandle_t handle = g_pMDLCache->FindMDL( pModelName ); + *cache = (void*)handle; + return g_pMDLCache->GetStudioHdr( handle ); +} + +virtualmodel_t *studiohdr_t::GetVirtualModel( void ) const +{ + return g_pMDLCache->GetVirtualModel( (MDLHandle_t)virtualModel ); +} + +byte *studiohdr_t::GetAnimBlock( int i ) const +{ + return g_pMDLCache->GetAnimBlock( (MDLHandle_t)virtualModel, i ); +} + +int studiohdr_t::GetAutoplayList( unsigned short **pOut ) const +{ + return g_pMDLCache->GetAutoplayList( (MDLHandle_t)virtualModel, pOut ); +} + +const studiohdr_t *virtualgroup_t::GetStudioHdr( void ) const +{ + return g_pMDLCache->GetStudioHdr( (MDLHandle_t)cache ); +} + + +//----------------------------------------------------------------------------- +// Purpose: Helper for parsing scene data file +//----------------------------------------------------------------------------- +class CSceneTokenProcessor : public ISceneTokenProcessor +{ +public: + const char *CurrentToken( void ); + bool GetToken( bool crossline ); + bool TokenAvailable( void ); + void Error( const char *fmt, ... ); +}; + +//----------------------------------------------------------------------------- +// Purpose: +// Output : const char +//----------------------------------------------------------------------------- +const char *CSceneTokenProcessor::CurrentToken( void ) +{ + return token; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : crossline - +// Output : Returns true on success, false on failure. +//----------------------------------------------------------------------------- +bool CSceneTokenProcessor::GetToken( bool crossline ) +{ + return ::GetToken( crossline ) ? true : false; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Output : Returns true on success, false on failure. +//----------------------------------------------------------------------------- +bool CSceneTokenProcessor::TokenAvailable( void ) +{ + return ::TokenAvailable() ? true : false; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *fmt - +// ... - +//----------------------------------------------------------------------------- +void CSceneTokenProcessor::Error( const char *fmt, ... ) +{ + char string[ 2048 ]; + va_list argptr; + va_start( argptr, fmt ); + Q_vsnprintf( string, sizeof(string), fmt, argptr ); + va_end( argptr ); + + Warning( "%s", string ); + Assert(0); +} + +static CSceneTokenProcessor g_TokenProcessor; + +SpewRetval_t SpewFunc( SpewType_t type, char const *pMsg ) +{ + spewed = true; + + printf( "%s", pMsg ); + OutputDebugString( pMsg ); + + if ( type == SPEW_ERROR ) + { + printf( "\n" ); + OutputDebugString( "\n" ); + } + + return SPEW_CONTINUE; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : depth - +// *fmt - +// ... - +//----------------------------------------------------------------------------- +void vprint( int depth, const char *fmt, ... ) +{ + char string[ 8192 ]; + va_list va; + va_start( va, fmt ); + vsprintf( string, fmt, va ); + va_end( va ); + + FILE *fp = NULL; + + if ( uselogfile ) + { + fp = fopen( "log.txt", "ab" ); + } + + while ( depth-- > 0 ) + { + printf( " " ); + OutputDebugString( " " ); + if ( fp ) + { + fprintf( fp, " " ); + } + } + + ::printf( "%s", string ); + OutputDebugString( string ); + + if ( fp ) + { + char *p = string; + while ( *p ) + { + if ( *p == '\n' ) + { + fputc( '\r', fp ); + } + fputc( *p, fp ); + p++; + } + fclose( fp ); + } +} + +void logprint( char const *logfile, const char *fmt, ... ) +{ + char string[ 8192 ]; + va_list va; + va_start( va, fmt ); + vsprintf( string, fmt, va ); + va_end( va ); + + FILE *fp = NULL; + static bool first = true; + if ( first ) + { + first = false; + fp = fopen( logfile, "wb" ); + } + else + { + fp = fopen( logfile, "ab" ); + } + if ( fp ) + { + char *p = string; + while ( *p ) + { + if ( *p == '\n' ) + { + fputc( '\r', fp ); + } + fputc( *p, fp ); + p++; + } + fclose( fp ); + } +} + + +void Con_Printf( const char *fmt, ... ) +{ + va_list args; + static char output[1024]; + + va_start( args, fmt ); + vprintf( fmt, args ); + vsprintf( output, fmt, args ); + + vprint( 0, output ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void printusage( void ) +{ + vprint( 0, "usage: makexvcd [options] -game gamedir\n\ + \t-v = verbose output\n\ + \t-m = rebuild modelsounds.cache\n\ + \t-x = rebuild .xcd files\n\ + \t-s = rebuild scene.cache\n\ + \t-z = rebuild virtualmodel.cache (xbox only)\n\ + \t-l = log to file log.txt\n\ + \ne.g.: makexvcd -s -m -game episodic\n" ); + + // Exit app + exit( 1 ); +} + +void BuildFileList_R( CUtlVector< CUtlSymbol >& files, char const *dir, char const *extension ) +{ + WIN32_FIND_DATA wfd; + + char directory[ 256 ]; + char filename[ 256 ]; + HANDLE ff; + + Q_snprintf( directory, sizeof( directory ), "%s\\*.*", dir ); + +#if defined( TESTING ) + if ( files.Count() > 100 ) + return; +#endif + + if ( ( ff = FindFirstFile( directory, &wfd ) ) == INVALID_HANDLE_VALUE ) + return; + + int extlen = strlen( extension ); + + do + { +#if defined( TESTING ) + if ( files.Count() > 100 ) + return; +#endif + if ( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) + { + + if ( wfd.cFileName[ 0 ] == '.' ) + continue; + + // Recurse down directory + Q_snprintf( filename, sizeof( filename ), "%s\\%s", dir, wfd.cFileName ); + BuildFileList_R( files, filename, extension ); + } + else + { + int len = strlen( wfd.cFileName ); + if ( len > extlen ) + { + if ( !stricmp( &wfd.cFileName[ len - extlen ], extension ) ) + { + char filename[ MAX_PATH ]; + Q_snprintf( filename, sizeof( filename ), "%s\\%s", dir, wfd.cFileName ); + _strlwr( filename ); + + Q_FixSlashes( filename ); + + CUtlSymbol sym = g_Analysis.symbols.AddString( filename ); + files.AddToTail( sym ); + + if ( !( files.Count() % 3000 ) ) + { + vprint( 0, "...found %i .%s files\n", files.Count(), extension ); + } + } + } + } + } while ( FindNextFile( ff, &wfd ) ); +} + +void BuildFileList( char const *basedir, CUtlVector< CUtlSymbol >& files, char const *rootdir, char const *extension ) +{ + files.RemoveAll(); + char root[ 512 ]; + Q_snprintf( root, sizeof( root ), "%s\\%s", basedir, rootdir ); + BuildFileList_R( files, root, extension ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CheckLogFile( void ) +{ + if ( uselogfile ) + { + _unlink( "log.txt" ); + vprint( 0, " Outputting to log.txt\n" ); + } +} + +void PrintHeader() +{ + vprint( 0, "Valve Software - CompileVCD.exe (%s)\n", __DATE__ ); + vprint( 0, "--- Binary .vcd compiler ---\n" ); +} + +//----------------------------------------------------------------------------- +// Purpose: For each .wav file in the list, see if any vcd file in the list references it +// First build an index of .wav to .vcd mappings, then search wav list and print results +// Input : vcdfiles - +// wavfiles - +//----------------------------------------------------------------------------- + +struct VCDList +{ + VCDList() + { + } + + VCDList( const VCDList& src ) + { + int c = src.vcds.Count(); + for ( int i = 0 ; i < c; i++ ) + { + vcds.AddToTail( src.vcds[ i ] ); + } + } + + VCDList& operator =( const VCDList& src ) + { + if ( this == &src ) + return *this; + + int c = src.vcds.Count(); + for ( int i = 0 ; i < c; i++ ) + { + vcds.AddToTail( src.vcds[ i ] ); + } + + return *this; + } + + CUtlVector< CUtlSymbol > vcds; +}; + +void AppendDisposition( CUtlVector< CUtlSymbol >& disposition, char const *fmt, ... ) +{ + char string[ 2048 ]; + va_list argptr; + va_start( argptr, fmt ); + _vsnprintf( string, sizeof( string ), fmt, argptr ); + va_end( argptr ); + + CUtlSymbol sym; + sym = string; + disposition.AddToTail( sym ); +} + +CChoreoScene *BlockingLoadScene( char const *vcdname ) +{ + // Load the .vcd + char scenefile[ MAX_PATH ]; + Q_snprintf( scenefile, sizeof( scenefile ), "%s\\%s", g_szCurrentGameDir, vcdname ); + + LoadScriptFile( scenefile ); + + CChoreoScene *scene = ChoreoLoadScene( scenefile, NULL, &g_TokenProcessor, Con_Printf ); + return scene; +} + +void ProcessVCD( char const *vcdname, CUtlVector< CUtlSymbol >& disposition ) +{ + if ( verbose ) + { + vprint( 0, "Processing '%s'\n", vcdname ); + } + + bool rebuild = false; + + FileHandle_t fh = filesystem->Open( vcdname, "rb", "GAME" ); + if ( fh == FILESYSTEM_INVALID_HANDLE ) + { + Error( "Couldn't open '%s' for reading.", vcdname ); + return; + } + + size_t bufSize = filesystem->Size( fh ); + char *buffer = new char[ bufSize + 1 ]; + filesystem->Read( buffer, bufSize, fh ); + filesystem->Close( fh ); + buffer[ bufSize ] = 0; + + CRC32_t crc; + CRC32_Init( &crc ); + CRC32_ProcessBuffer( &crc, buffer, bufSize ); + CRC32_Final( &crc ); + + delete[] buffer; + + // Now load the file as a binary if it exists... + char binfile[ 512 ]; + Q_strncpy( binfile, vcdname, sizeof( binfile ) ); + Q_SetExtension( binfile, ".xcd", sizeof( binfile ) ); + + if ( buildxcds ) + { + fh = filesystem->Open( binfile, "rb", "GAME" ); + if ( fh == FILESYSTEM_INVALID_HANDLE ) + { + AppendDisposition( disposition, "Built '%s'\n", binfile ); + rebuild = true; + } + else + { + // Read the first bit of data and check + char crcdata[ 12 ]; + filesystem->Read( crcdata, sizeof( crcdata ), fh ); + filesystem->Close( fh ); + + CUtlBuffer buf; + buf.Put( crcdata, sizeof( crcdata ) ); + + CRC32_t fileCRC = 0; + if ( !CChoreoScene::GetCRCFromBuffer( buf, (unsigned int &)fileCRC ) ) + { + AppendDisposition( disposition, "Rebuilt '%s' due to version change\n", binfile ); + rebuild = true; + } + else + { + if ( fileCRC != crc ) + { + AppendDisposition( disposition, "Rebuilt '%s' due to crc change\n", binfile ); + rebuild = true; + } + } + } + } + + // Validate the scene cache + g_SceneCache.RebuildItem( vcdname + strlen( g_szCurrentGameDir ) + 1 ); + + if ( !rebuild ) + return; + + // Remove current binary + if ( filesystem->FileExists( binfile, "GAME" ) ) + { + _unlink( binfile ); + } + + // Load the .vcd + LoadScriptFile( (char *)vcdname ); + + CChoreoScene *scene = ChoreoLoadScene( vcdname, NULL, &g_TokenProcessor, Con_Printf ); + if ( scene ) + { + scene->SaveBinary( binfile, NULL, crc ); + + delete scene; + } +} + +void CompileVCDs( CUtlVector< CUtlSymbol >& vcds ) +{ + CUtlVector< CUtlSymbol > disposition; + + StartPacifier( "CompileVCDs" ); + int i; + int c = vcds.Count(); + for ( i = 0 ; i < c; ++i ) + { + UpdatePacifier( (float)i / (float)c ); + ProcessVCD( g_Analysis.symbols.String( vcds[ i ] ), disposition ); + } + EndPacifier(); + + if ( verbose ) + { + c = disposition.Count(); + for ( i = 0; i < c; ++i ) + { + Warning( "%s", disposition[ i ].String() ); + } + } +} + +static CUtlMap< CStudioHdr *, MDLHandle_t > g_ModelMap( 0, 0, DefLessFunc( CStudioHdr * ) ); + +CStudioHdr *ModelSoundsCache_LoadModel( char const *filename ) +{ + MDLHandle_t handle = g_pMDLCache->FindMDL( filename ); + + CStudioHdr *studioHdr = new CStudioHdr( g_pMDLCache->GetStudioHdr( handle ), g_pMDLCache ); + + g_ModelMap.Insert( studioHdr, handle ); + + if ( studioHdr->IsValid() ) + return studioHdr; + return NULL; +} + +void ModelSoundsCache_FinishModel( CStudioHdr *hdr ) +{ + int idx = g_ModelMap.Find( hdr ); + if ( idx != g_ModelMap.InvalidIndex() ) + { + g_pMDLCache->Release( g_ModelMap[ idx ] ); + g_ModelMap.RemoveAt( idx ); + } + delete hdr; +} + +void ModelSoundsCache_PrecacheScriptSound( const char *soundname ) +{ +} + +void ProcessMDL( char const *mdlname, CUtlVector< CUtlSymbol >& disposition ) +{ + if ( verbose ) + { + vprint( 0, "Processing '%s'\n", mdlname ); + } + + if ( Q_stristr( mdlname, "ghostanim" ) ) + { + int n =3 ; + } + // Validate the model sounds cache + g_ModelSoundsCache.RebuildItem( mdlname + strlen( g_szCurrentGameDir ) + 1 ); +} + +void CompileMDLs( CUtlVector< CUtlSymbol >& mdls ) +{ + CUtlVector< CUtlSymbol > disposition; + + StartPacifier( "CompileMDLs" ); + int i; + int c = mdls.Count(); + for ( i = 0 ; i < c; ++i ) + { + UpdatePacifier( (float)i / (float)c ); + ProcessMDL( g_Analysis.symbols.String( mdls[ i ] ), disposition ); + } + EndPacifier(); + + c = disposition.Count(); + for ( i = 0; i < c; ++i ) + { + Warning( "%s", disposition[ i ].String() ); + } +} + + +//----------------------------------------------------------------------------- +// The application object +//----------------------------------------------------------------------------- +class CMakeCachesApp : public CSteamAppSystemGroup +{ +public: + // Methods of IApplication + virtual bool Create(); + virtual bool PreInit(); + virtual int Main(); + virtual void PostShutdown(); + virtual void Destroy(); + +private: + // Sets up the search paths + bool SetupSearchPaths(); +}; + +bool CMakeCachesApp::Create() +{ + SpewOutputFunc( SpewFunc ); + SpewActivate( "makexvcd", 2 ); + + // Add in the cvar factory + AppModule_t cvarModule = LoadModule( VStdLib_GetICVarFactory() ); + AddSystem( cvarModule, VENGINE_CVAR_INTERFACE_VERSION ); + + AppSystemInfo_t appSystems[] = + { + { "materialsystem.dll", MATERIAL_SYSTEM_INTERFACE_VERSION }, + { "studiorender.dll", STUDIO_RENDER_INTERFACE_VERSION }, + { "vphysics.dll", VPHYSICS_INTERFACE_VERSION }, + { "datacache.dll", DATACACHE_INTERFACE_VERSION }, + { "datacache.dll", MDLCACHE_INTERFACE_VERSION }, + { "datacache.dll", STUDIO_DATA_CACHE_INTERFACE_VERSION }, + { "soundemittersystem.dll", SOUNDEMITTERSYSTEM_INTERFACE_VERSION }, + + { "", "" } // Required to terminate the list + }; + + if ( !AddSystems( appSystems ) ) + return false; + + g_pFileSystem = filesystem = (IFileSystem*)FindSystem( FILESYSTEM_INTERFACE_VERSION ); + g_pMDLCache = (IMDLCache*)FindSystem( MDLCACHE_INTERFACE_VERSION ); + soundemitterbase = (ISoundEmitterSystemBase*)FindSystem(SOUNDEMITTERSYSTEM_INTERFACE_VERSION); + g_pMaterialSystem = (IMaterialSystem*)FindSystem( MATERIAL_SYSTEM_INTERFACE_VERSION ); + + if ( !soundemitterbase || !g_pMDLCache || !filesystem || !g_pMaterialSystem ) + { + Error("Unable to load required library interface!\n"); + } + + g_pMaterialSystem->SetShaderAPI( "shaderapiempty.dll" ); + + return true; +} + +void CMakeCachesApp::Destroy() +{ + g_pFileSystem = filesystem = NULL; + soundemitterbase = NULL; + g_pMDLCache = NULL; +} + +//----------------------------------------------------------------------------- +// Sets up the game path +//----------------------------------------------------------------------------- +bool CMakeCachesApp::SetupSearchPaths() +{ + CFSSteamSetupInfo steamInfo; + steamInfo.m_pDirectoryName = NULL; + steamInfo.m_bOnlyUseDirectoryName = false; + steamInfo.m_bToolsMode = true; + steamInfo.m_bSetSteamDLLPath = true; + steamInfo.m_bSteam = filesystem->IsSteam(); + if ( FileSystem_SetupSteamEnvironment( steamInfo ) != FS_OK ) + return false; + + CFSMountContentInfo fsInfo; + fsInfo.m_pFileSystem = filesystem; + fsInfo.m_bToolsMode = true; + fsInfo.m_pDirectoryName = steamInfo.m_GameInfoPath; + + if ( FileSystem_MountContent( fsInfo ) != FS_OK ) + return false; + + // Finally, load the search paths for the "GAME" path. + CFSSearchPathsInit searchPathsInit; + searchPathsInit.m_pDirectoryName = steamInfo.m_GameInfoPath; + searchPathsInit.m_pFileSystem = fsInfo.m_pFileSystem; + if ( FileSystem_LoadSearchPaths( searchPathsInit ) != FS_OK ) + return false; + + char platform[MAX_PATH]; + Q_strncpy( platform, steamInfo.m_GameInfoPath, MAX_PATH ); + Q_StripTrailingSlash( platform ); + Q_strncat( platform, "/../platform", MAX_PATH, MAX_PATH ); + + fsInfo.m_pFileSystem->AddSearchPath( platform, "PLATFORM" ); + + // Set gamedir. + Q_MakeAbsolutePath( gamedir, sizeof( gamedir ), steamInfo.m_GameInfoPath ); + Q_AppendSlash( gamedir, sizeof( gamedir ) ); + + return true; +} + + +//----------------------------------------------------------------------------- +// Init, shutdown +//----------------------------------------------------------------------------- +bool CMakeCachesApp::PreInit( ) +{ + MathLib_Init( 2.2f, 2.2f, 0.0f, 2.0f, false, false, false, false ); + filesystem->SetWarningFunc( Warning ); + + // Add paths... + if ( !SetupSearchPaths() ) + return false; + + return true; +} + +void CMakeCachesApp::PostShutdown() +{ +} + +//----------------------------------------------------------------------------- +// main application +//----------------------------------------------------------------------------- +int CMakeCachesApp::Main() +{ + for ( int i=1 ; i<CommandLine()->ParmCount() ; i++) + { + if ( CommandLine()->GetParm( i )[ 0 ] == '-' ) + { + switch( CommandLine()->GetParm( i )[ 1 ] ) + { + case 'l': + uselogfile = true; + break; + case 'v': + verbose = true; + break; + case 'g': // -game + ++i; + break; + case 'm': + modelsoundscache = true; + break; + case 's': + scenecache = true; + break; + case 'x': + buildxcds = true; + break; + case 'z': + virtualmodel = true; + break; + default: + printusage(); + break; + } + } + } + + if ( CommandLine()->ParmCount() < 2 || ( i != CommandLine()->ParmCount() ) ) + { + PrintHeader(); + printusage(); + } + + CheckLogFile(); + + PrintHeader(); + + vprint( 0, " Compiling binary .vcd files to .xvcd ...\n" ); + + char vcddir[ 256 ]; + char modelsdir[ 256 ]; + Q_snprintf( vcddir, sizeof( vcddir ), "scenes", CommandLine()->GetParm( i - 1 ) ); + Q_snprintf( modelsdir, sizeof( modelsdir ), "models", CommandLine()->GetParm( i - 1 ) ); + if ( !strstr( vcddir, "scenes" ) ) + { + vprint( 0, ".vcd dir %s looks invalid (format: u:/game/hl2/scenes)\n", vcddir ); + return 0; + } + if ( !strstr( modelsdir, "models" ) ) + { + vprint( 0, ".mdl dir %s looks invalid (format: u:/game/hl2/models)\n", modelsdir ); + return 0; + } + + char binaries[MAX_PATH]; + Q_strncpy( binaries, gamedir, MAX_PATH ); + Q_StripTrailingSlash( binaries ); + Q_strncat( binaries, "/../bin", MAX_PATH, MAX_PATH ); + + filesystem->AddSearchPath( binaries, "EXECUTABLE_PATH"); + + soundemitterbase->ModInit(); + + // Delete the scene cache file + if ( scenecache ) filesystem->RemoveFile( "scene.cache", "MOD" ); + if ( modelsoundscache ) filesystem->RemoveFile( "modelsounds.cache", "MOD" ); + if ( virtualmodel ) filesystem->RemoveFile( "virtualmodel.cache", "MOD" ); + + CUtlSymbolTable pathStrings; + CUtlVector< CUtlSymbol > searchList; + char searchPaths[ 512 ]; + filesystem->GetSearchPath( "GAME", true, searchPaths, sizeof( searchPaths ) ); + + // We want to walk them in reverse order so newer files are "overrides" for older ones, so we add them to a list in reverse order + for ( char *path = strtok( searchPaths, ";" ); path; path = strtok( NULL, ";" ) ) + { + char dir[ 512 ]; + Q_strncpy( dir, path, sizeof( dir ) ); + Q_FixSlashes( dir ); + Q_strlower( dir ); + Q_StripTrailingSlash( dir ); + + CUtlSymbol sym = pathStrings.AddString( dir ); + // Push them on head so we can walk them in reverse order + searchList.AddToHead( sym ); + } + + if ( scenecache ) + { + g_SceneCache.Init(); + } + if ( modelsoundscache ) + { + g_ModelSoundsCache.Init(); + + g_pMDLCache->InitPreloadData( true ); + } + + EventList_RegisterSharedEvents(); + + for ( int sp = 0; sp < searchList.Count(); ++sp ) + { + char const *basedir = pathStrings.String( searchList[ sp ] ); + Q_strncpy( g_szCurrentGameDir, basedir, sizeof( g_szCurrentGameDir ) ); + + vprint( 0, "Processing gamedir %s\n", basedir ); + + if ( scenecache ) + { + vprint( 1, "Building list of .vcd files\n" ); + CUtlVector< CUtlSymbol > vcdfiles; + BuildFileList( basedir, vcdfiles, vcddir, ".vcd" ); + vprint( 1, "found %i .vcd files\n", vcdfiles.Count() ); + + CompileVCDs( vcdfiles ); + } + + if ( modelsoundscache ) + { + vprint( 1, "Building list of .mdl files\n" ); + CUtlVector< CUtlSymbol > mdlfiles; + BuildFileList( basedir, mdlfiles, modelsdir, ".mdl" ); + vprint( 1, "found %i .mdl files\n", mdlfiles.Count() ); + + CompileMDLs( mdlfiles ); + } + } + + if ( scenecache ) + { + if ( g_SceneCache.IsDirty() ) + { + g_SceneCache.Save(); + } + g_SceneCache.Shutdown(); + } + + if ( modelsoundscache ) + { + if ( g_ModelSoundsCache.IsDirty() ) + { + g_ModelSoundsCache.Save(); + } + g_ModelSoundsCache.Shutdown(); + + g_pMDLCache->ShutdownPreloadData(); + } + + soundemitterbase->ModShutdown(); + + return 0; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : argc - +// argv[] - +// Output : int +//----------------------------------------------------------------------------- +int main( int argc, char* argv[] ) +{ + CommandLine()->CreateCmdLine( argc, argv ); + + CMakeCachesApp sceneManagerApp; + CSteamApplication steamApplication( &sceneManagerApp ); + int nRetVal = steamApplication.Run(); + + return nRetVal; +}
\ No newline at end of file diff --git a/utils/xbox/makexvcd/makexvcd.vcproj b/utils/xbox/makexvcd/makexvcd.vcproj new file mode 100644 index 0000000..c90784c --- /dev/null +++ b/utils/xbox/makexvcd/makexvcd.vcproj @@ -0,0 +1,497 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="7.10" + Name="makexvcd" + ProjectGUID="{36C1181C-9B10-48CB-956A-059A284C9F8B}" + RootNamespace="makexvcd" + Keyword="Win32Proj"> + <Platforms> + <Platform + Name="Win32"/> + </Platforms> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="Debug" + ConfigurationType="1" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="../../../public;../../../public/tier1;../../common;../../../game_shared;./" + PreprocessorDefinitions="MAKEXVCD" + MinimalRebuild="TRUE" + BasicRuntimeChecks="3" + RuntimeLibrary="5" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="TRUE" + DebugInformationFormat="4"/> + <Tool + Name="VCCustomBuildTool" + CommandLine="if exist ..\..\..\..\game\bin\"$(TargetName)".exe attrib -r ..\..\..\..\game\bin\"$(TargetName)".exe +if exist "$(TargetPath)" copy "$(TargetPath)" ..\..\..\..\game\bin +" + Outputs="..\..\..\..\game\bin\$(TargetName).exe"/> + <Tool + Name="VCLinkerTool" + OutputFile="$(OutDir)/makexvcd.exe" + LinkIncremental="2" + IgnoreDefaultLibraryNames="LIBCMT,LIBCMTD" + GenerateDebugInformation="TRUE" + ProgramDatabaseFile="$(OutDir)/makexvcd.pdb" + SubSystem="1" + TargetMachine="1"/> + <Tool + Name="VCMIDLTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCResourceCompilerTool"/> + <Tool + Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> + <Tool + Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="Release" + ConfigurationType="1" + CharacterSet="2"> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="../../../public;../../../public/tier1;../../common;../../../game_shared;./" + PreprocessorDefinitions="MAKEXVCD" + RuntimeLibrary="4" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="TRUE" + DebugInformationFormat="3"/> + <Tool + Name="VCCustomBuildTool" + CommandLine="if exist ..\..\..\..\game\bin\"$(TargetName)".exe attrib -r ..\..\..\..\game\bin\"$(TargetName)".exe +if exist "$(TargetPath)" copy "$(TargetPath)" ..\..\..\..\game\bin +" + Outputs="..\..\..\..\game\bin\$(TargetName).exe"/> + <Tool + Name="VCLinkerTool" + OutputFile="$(OutDir)/makexvcd.exe" + LinkIncremental="1" + IgnoreDefaultLibraryNames="LIBCMT,LIBCMTD" + GenerateDebugInformation="TRUE" + SubSystem="1" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1"/> + <Tool + Name="VCMIDLTool"/> + <Tool + Name="VCPostBuildEventTool"/> + <Tool + Name="VCPreBuildEventTool"/> + <Tool + Name="VCPreLinkEventTool"/> + <Tool + Name="VCResourceCompilerTool"/> + <Tool + Name="VCWebServiceProxyGeneratorTool"/> + <Tool + Name="VCXMLDataGeneratorTool"/> + <Tool + Name="VCWebDeploymentTool"/> + <Tool + Name="VCManagedWrapperGeneratorTool"/> + <Tool + Name="VCAuxiliaryManagedWrapperGeneratorTool"/> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> + <File + RelativePath=".\makexvcd.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> + <File + RelativePath=".\cbase.h"> + </File> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"> + </Filter> + <Filter + Name="Shared Code" + Filter=""> + <File + RelativePath="..\..\..\game_shared\activitylist.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + </File> + <File + RelativePath="..\..\..\game_shared\activitylist.h"> + </File> + <File + RelativePath="..\..\..\game_shared\animation.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + </File> + <File + RelativePath="..\..\..\game_shared\animation.h"> + </File> + <File + RelativePath="..\..\..\public\tier1\checksum_crc.h"> + </File> + <File + RelativePath="..\..\..\game_shared\choreoactor.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + </File> + <File + RelativePath="..\..\..\game_shared\choreoactor.h"> + </File> + <File + RelativePath="..\..\..\game_shared\choreochannel.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + </File> + <File + RelativePath="..\..\..\game_shared\choreochannel.h"> + </File> + <File + RelativePath="..\..\..\game_shared\choreoevent.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + </File> + <File + RelativePath="..\..\..\game_shared\choreoevent.h"> + </File> + <File + RelativePath="..\..\..\game_shared\choreoscene.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + </File> + <File + RelativePath="..\..\..\game_shared\choreoscene.h"> + </File> + <File + RelativePath="..\..\common\cmdlib.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + </File> + <File + RelativePath="..\..\common\cmdlib.h"> + </File> + <File + RelativePath="..\..\..\game_shared\eventlist.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + </File> + <File + RelativePath="..\..\..\game_shared\eventlist.h"> + </File> + <File + RelativePath="..\..\..\public\filesystem_helpers.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + </File> + <File + RelativePath="..\..\..\public\filesystem_helpers.h"> + </File> + <File + RelativePath="..\..\..\public\filesystem_init.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + </File> + <File + RelativePath="..\..\..\public\filesystem_init.h"> + </File> + <File + RelativePath="..\..\common\filesystem_tools.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + </File> + <File + RelativePath="..\..\common\filesystem_tools.h"> + </File> + <File + RelativePath="..\..\..\public\interpolatortypes.cpp"> + </File> + <File + RelativePath="..\..\..\public\interpolatortypes.h"> + </File> + <File + RelativePath="..\..\..\public\mathlib\mathlib.h"> + </File> + <File + RelativePath="..\..\..\game_shared\ModelSoundsCache.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + </File> + <File + RelativePath="..\..\..\game_shared\ModelSoundsCache.h"> + </File> + <File + RelativePath="..\..\common\pacifier.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + </File> + <File + RelativePath="..\..\common\pacifier.h"> + </File> + <File + RelativePath="..\..\..\game_shared\SceneCache.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + </File> + <File + RelativePath="..\..\..\game_shared\SceneCache.h"> + </File> + <File + RelativePath="..\..\common\scriplib.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + </File> + <File + RelativePath="..\..\common\scriplib.h"> + </File> + <File + RelativePath="..\..\..\public\stringregistry.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + </File> + <File + RelativePath="..\..\..\public\stringregistry.h"> + </File> + <File + RelativePath="..\..\..\public\studio.cpp"> + <FileConfiguration + Name="Debug|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + <FileConfiguration + Name="Release|Win32"> + <Tool + Name="VCCLCompilerTool" + UsePrecompiledHeader="0"/> + </FileConfiguration> + </File> + </Filter> + <File + RelativePath="..\..\..\lib\public\appframework.lib"> + </File> + <File + RelativePath="..\..\..\lib\public\mathlib.lib"> + </File> + <File + RelativePath="..\..\..\lib\public\tier0.lib"> + </File> + <File + RelativePath="..\..\..\lib\public\tier1.lib"> + </File> + <File + RelativePath="..\..\..\lib\public\tier2.lib"> + </File> + <File + RelativePath="..\..\..\lib\public\vstdlib.lib"> + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> |