//----------------------------------------------------------------------------- // Purpose: // Input : *path - // *dest - // destSize - // Output : void V_ExtractFileExtension //----------------------------------------------------------------------------- void V_ExtractFileExtension(const char *path, char *dest, int destSize) { *dest = 0; const char *extension = V_GetFileExtension( path ); if (extension) V_strncpy(dest, extension, destSize); }
CefRefPtr<CefResourceHandler> LocalSchemeHandlerFactory::Create(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, const CefString& scheme_name, CefRefPtr<CefRequest> request) { CefRefPtr<CefResourceHandler> pResourceHandler = NULL; CefURLParts parts; CefParseURL(request->GetURL(), parts); if( CefString(&parts.path).size() < 2 ) { return NULL; } char path[MAX_PATH]; V_strncpy( path, CefString(&parts.path).ToString().c_str() + 1, sizeof(path) ); V_FixupPathName( path, sizeof( path ), path ); if( filesystem->IsDirectory( path ) ) { V_AppendSlash( path, sizeof( path ) ); V_strcat( path, "index.html", sizeof(path) ); } if( filesystem->FileExists( path, NULL ) ) { const char *pExtension = V_GetFileExtension( path ); if( cef_scheme_debug_local_handler.GetBool() ) { Msg( "Local scheme request => Path: %s, Extension: %s, Mime Type: %s, modified path: %s, exists: %d, resource type: %d\n", CefString(&parts.path).ToString().c_str(), pExtension, CefGetMimeType(pExtension).ToString().c_str(), path, filesystem->FileExists( path ), request->GetResourceType() ); } CUtlBuffer buf( 0, filesystem->Size( path, NULL ) ); if( filesystem->ReadFile( path, NULL, buf ) ) { CefRefPtr<CefStreamReader> stream = CefStreamReader::CreateForData( buf.Base(), buf.TellPut() ); if( stream != NULL ) { pResourceHandler = new CefStreamResourceHandler( CefGetMimeType(pExtension), stream ); } } } return pResourceHandler; }
static bool F_CanProcessAssetFile( const char* filePath ) { const char* ext = V_GetFileExtension( filePath ); if( nil == ext ) { mxWarnf("File '%s' is without extension.\n",filePath); return false; } // check if this is a resource catalog if( mxStrEquAnsi( ext, ASSET_DB_FILE_EXTENSION_WITHOUT_DOT ) ) { return false; } // check if the file contains asset build options if( mxStrEquAnsi( ext, ASSET_BUILD_CONFIG_FILE_EXTENSION_WITHOUT_DOT ) ) { DEVOUT("Process Assets: Skipping build configuration script '%s'\n",filePath); return false; } return true; }
int RunVBSP( int argc, char **argv ) { int i; double start, end; char path[1024]; CommandLine()->CreateCmdLine( argc, argv ); MathLib_Init( 2.2f, 2.2f, 0.0f, OVERBRIGHT, false, false, false, false ); InstallSpewFunction(); SpewActivate( "developer", 1 ); CmdLib_InitFileSystem( argv[ argc-1 ] ); Q_StripExtension( ExpandArg( argv[ argc-1 ] ), source, sizeof( source ) ); Q_FileBase( source, mapbase, sizeof( mapbase ) ); strlwr( mapbase ); LoadCmdLineFromFile( argc, argv, mapbase, "vbsp" ); Msg( "Valve Software - vbsp.exe (%s)\n", __DATE__ ); for (i=1 ; i<argc ; i++) { if (!stricmp(argv[i],"-threads")) { numthreads = atoi (argv[i+1]); i++; } else if (!Q_stricmp(argv[i],"-glview")) { glview = true; } else if ( !Q_stricmp(argv[i], "-v") || !Q_stricmp(argv[i], "-verbose") ) { Msg("verbose = true\n"); verbose = true; } else if (!Q_stricmp(argv[i], "-noweld")) { Msg ("noweld = true\n"); noweld = true; } else if (!Q_stricmp(argv[i], "-nocsg")) { Msg ("nocsg = true\n"); nocsg = true; } else if (!Q_stricmp(argv[i], "-noshare")) { Msg ("noshare = true\n"); noshare = true; } else if (!Q_stricmp(argv[i], "-notjunc")) { Msg ("notjunc = true\n"); notjunc = true; } else if (!Q_stricmp(argv[i], "-nowater")) { Msg ("nowater = true\n"); nowater = true; } else if (!Q_stricmp(argv[i], "-noopt")) { Msg ("noopt = true\n"); noopt = true; } else if (!Q_stricmp(argv[i], "-noprune")) { Msg ("noprune = true\n"); noprune = true; } else if (!Q_stricmp(argv[i], "-nomerge")) { Msg ("nomerge = true\n"); nomerge = true; } else if (!Q_stricmp(argv[i], "-nomergewater")) { Msg ("nomergewater = true\n"); nomergewater = true; } else if (!Q_stricmp(argv[i], "-nosubdiv")) { Msg ("nosubdiv = true\n"); nosubdiv = true; } else if (!Q_stricmp(argv[i], "-nodetail")) { Msg ("nodetail = true\n"); nodetail = true; } else if (!Q_stricmp(argv[i], "-fulldetail")) { Msg ("fulldetail = true\n"); fulldetail = true; } else if (!Q_stricmp(argv[i], "-onlyents")) { Msg ("onlyents = true\n"); onlyents = true; } else if (!Q_stricmp(argv[i], "-onlyprops")) { Msg ("onlyprops = true\n"); onlyprops = true; } else if (!Q_stricmp(argv[i], "-micro")) { microvolume = atof(argv[i+1]); Msg ("microvolume = %f\n", microvolume); i++; } else if (!Q_stricmp(argv[i], "-leaktest")) { Msg ("leaktest = true\n"); leaktest = true; } else if (!Q_stricmp(argv[i], "-verboseentities")) { Msg ("verboseentities = true\n"); verboseentities = true; } else if (!Q_stricmp(argv[i], "-snapaxial")) { Msg ("snap axial = true\n"); g_snapAxialPlanes = true; } #if 0 else if (!Q_stricmp(argv[i], "-maxlightmapdim")) { g_maxLightmapDimension = atof(argv[i+1]); Msg ("g_maxLightmapDimension = %f\n", g_maxLightmapDimension); i++; } #endif else if (!Q_stricmp(argv[i], "-block")) { block_xl = block_xh = atoi(argv[i+1]); block_yl = block_yh = atoi(argv[i+2]); Msg ("block: %i,%i\n", block_xl, block_yl); i+=2; } else if (!Q_stricmp(argv[i], "-blocks")) { block_xl = atoi(argv[i+1]); block_yl = atoi(argv[i+2]); block_xh = atoi(argv[i+3]); block_yh = atoi(argv[i+4]); Msg ("blocks: %i,%i to %i,%i\n", block_xl, block_yl, block_xh, block_yh); i+=4; } else if ( !Q_stricmp( argv[i], "-dumpcollide" ) ) { Msg("Dumping collision models to collideXXX.txt\n" ); dumpcollide = true; } else if ( !Q_stricmp( argv[i], "-dumpstaticprop" ) ) { Msg("Dumping static props to staticpropXXX.txt\n" ); g_DumpStaticProps = true; } else if ( !Q_stricmp( argv[i], "-forceskyvis" ) ) { Msg("Enabled vis in 3d skybox\n" ); g_bSkyVis = true; } else if (!Q_stricmp (argv[i],"-tmpout")) { strcpy (outbase, "/tmp"); } #if 0 else if( !Q_stricmp( argv[i], "-defaultluxelsize" ) ) { g_defaultLuxelSize = atof( argv[i+1] ); i++; } #endif else if( !Q_stricmp( argv[i], "-luxelscale" ) ) { g_luxelScale = atof( argv[i+1] ); i++; } else if( !strcmp( argv[i], "-minluxelscale" ) ) { g_minLuxelScale = atof( argv[i+1] ); if (g_minLuxelScale < 1) g_minLuxelScale = 1; i++; } else if( !Q_stricmp( argv[i], "-dxlevel" ) ) { g_nDXLevel = atoi( argv[i+1] ); Msg( "DXLevel = %d\n", g_nDXLevel ); i++; } else if( !Q_stricmp( argv[i], "-bumpall" ) ) { g_BumpAll = true; } else if( !Q_stricmp( argv[i], "-low" ) ) { g_bLowPriority = true; } else if( !Q_stricmp( argv[i], "-lightifmissing" ) ) { g_bLightIfMissing = true; } else if ( !Q_stricmp( argv[i], CMDLINEOPTION_NOVCONFIG ) ) { } else if ( !Q_stricmp( argv[i], "-allowdebug" ) || !Q_stricmp( argv[i], "-steam" ) ) { // nothing to do here, but don't bail on this option } else if ( !Q_stricmp( argv[i], "-vproject" ) || !Q_stricmp( argv[i], "-game" ) ) { ++i; } else if ( !Q_stricmp( argv[i], "-keepstalezip" ) ) { g_bKeepStaleZip = true; } else if ( !Q_stricmp( argv[i], "-xbox" ) ) { // enable mandatory xbox extensions g_NodrawTriggers = true; g_DisableWaterLighting = true; } else if ( !Q_stricmp( argv[i], "-allowdetailcracks")) { g_bAllowDetailCracks = true; } else if ( !Q_stricmp( argv[i], "-novirtualmesh")) { g_bNoVirtualMesh = true; } else if ( !Q_stricmp( argv[i], "-replacematerials" ) ) { g_ReplaceMaterials = true; } else if ( !Q_stricmp(argv[i], "-nodrawtriggers") ) { g_NodrawTriggers = true; } else if ( !Q_stricmp( argv[i], "-FullMinidumps" ) ) { EnableFullMinidumps( true ); } else if (argv[i][0] == '-') { Warning("VBSP: Unknown option \"%s\"\n\n", argv[i]); i = 100000; // force it to print the usage break; } else break; } if (i != argc - 1) { PrintCommandLine( argc, argv ); Warning( "usage : vbsp [options...] mapfile\n" "example: vbsp -onlyents c:\\hl2\\hl2\\maps\\test\n" "\n" "Common options (use -v to see all options):\n" "\n" " -v (or -verbose): Turn on verbose output (also shows more command\n" " line options).\n" "\n" " -onlyents : This option causes vbsp only import the entities from the .vmf\n" " file. -onlyents won't reimport brush models.\n" " -onlyprops : Only update the static props and detail props.\n" " -glview : Writes .gl files in the current directory that can be viewed\n" " with glview.exe. If you use -tmpout, it will write the files\n" " into the \\tmp folder.\n" " -nodetail : Get rid of all detail geometry. The geometry left over is\n" " what affects visibility.\n" " -nowater : Get rid of water brushes.\n" " -low : Run as an idle-priority process.\n" "\n" " -vproject <directory> : Override the VPROJECT environment variable.\n" " -game <directory> : Same as -vproject.\n" "\n" ); if ( verbose ) { Warning( "Other options :\n" " -novconfig : Don't bring up graphical UI on vproject errors.\n" " -threads : Control the number of threads vbsp uses (defaults to the # of\n" " processors on your machine).\n" " -verboseentities: If -v is on, this disables verbose output for submodels.\n" " -noweld : Don't join face vertices together.\n" " -nocsg : Don't chop out intersecting brush areas.\n" " -noshare : Emit unique face edges instead of sharing them.\n" " -notjunc : Don't fixup t-junctions.\n" " -noopt : By default, vbsp removes the 'outer shell' of the map, which\n" " are all the faces you can't see because you can never get\n" " outside the map. -noopt disables this behaviour.\n" " -noprune : Don't prune neighboring solid nodes.\n" " -nomerge : Don't merge together chopped faces on nodes.\n" " -nomergewater: Don't merge together chopped faces on water.\n" " -nosubdiv : Don't subdivide faces for lightmapping.\n" " -micro <#> : vbsp will warn when brushes are output with a volume less\n" " than this number (default: 1.0).\n" " -fulldetail : Mark all detail geometry as normal geometry (so all detail\n" " geometry will affect visibility).\n" " -leaktest : Stop processing the map if a leak is detected. Whether or not\n" " this flag is set, a leak file will be written out at\n" " <vmf filename>.lin, and it can be imported into Hammer.\n" " -bumpall : Force all surfaces to be bump mapped.\n" " -snapaxial : Snap axial planes to integer coordinates.\n" " -block # # : Control the grid size mins that vbsp chops the level on.\n" " -blocks # # # # : Enter the mins and maxs for the grid size vbsp uses.\n" " -dumpstaticprops: Dump static props to staticprop*.txt\n" " -dumpcollide : Write files with collision info.\n" " -forceskyvis : Enable vis calculations in 3d skybox leaves\n" " -luxelscale # : Scale all lightmaps by this amount (default: 1.0).\n" " -minluxelscale #: No luxel scale will be lower than this amount (default: 1.0).\n" " -lightifmissing : Force lightmaps to be generated for all surfaces even if\n" " they don't need lightmaps.\n" " -keepstalezip : Keep the BSP's zip files intact but regenerate everything\n" " else.\n" " -virtualdispphysics : Use virtual (not precomputed) displacement collision models\n" " -xbox : Enable mandatory xbox options\n" " -x360 : Generate Xbox360 version of vsp\n" " -nox360 : Disable generation Xbox360 version of vsp (default)\n" " -replacematerials : Substitute materials according to materialsub.txt in content\\maps\n" " -FullMinidumps : Write large minidumps on crash.\n" ); } DeleteCmdLine( argc, argv ); CmdLib_Cleanup(); CmdLib_Exit( 1 ); } start = Plat_FloatTime(); // Run in the background? if( g_bLowPriority ) { SetLowPriority(); } if( ( g_nDXLevel != 0 ) && ( g_nDXLevel < 80 ) ) { g_BumpAll = false; } if( g_luxelScale == 1.0f ) { if ( g_nDXLevel == 70 ) { g_luxelScale = 4.0f; } } ThreadSetDefault (); numthreads = 1; // multiple threads aren't helping... // Setup the logfile. char logFile[512]; _snprintf( logFile, sizeof(logFile), "%s.log", source ); SetSpewFunctionLogFile( logFile ); LoadPhysicsDLL(); LoadSurfaceProperties(); #if 0 Msg( "qdir: %s This is the the path of the initial source file \n", qdir ); Msg( "gamedir: %s This is the base engine + mod-specific game dir (e.g. d:/tf2/mytfmod/) \n", gamedir ); Msg( "basegamedir: %s This is the base engine + base game directory (e.g. e:/hl2/hl2/, or d:/tf2/tf2/ )\n", basegamedir ); #endif sprintf( materialPath, "%smaterials", gamedir ); InitMaterialSystem( materialPath, CmdLib_GetFileSystemFactory() ); Msg( "materialPath: %s\n", materialPath ); // delete portal and line files sprintf (path, "%s.prt", source); remove (path); sprintf (path, "%s.lin", source); remove (path); strcpy (name, ExpandArg (argv[i])); const char *pszExtension = V_GetFileExtension( name ); if ( !pszExtension ) { V_SetExtension( name, ".vmm", sizeof( name ) ); if ( !FileExists( name ) ) { V_SetExtension( name, ".vmf", sizeof( name ) ); } } char platformBSPFileName[1024]; GetPlatformMapPath( source, platformBSPFileName, g_nDXLevel, 1024 ); // if we're combining materials, load the script file if ( g_ReplaceMaterials ) { LoadMaterialReplacementKeys( gamedir, mapbase ); } // // if onlyents, just grab the entites and resave // if (onlyents) { LoadBSPFile (platformBSPFileName); num_entities = 0; // Clear out the cubemap samples since they will be reparsed even with -onlyents g_nCubemapSamples = 0; // Mark as stale since the lighting could be screwed with new ents. AddBufferToPak( GetPakFile(), "stale.txt", "stale", strlen( "stale" ) + 1, false ); LoadMapFile (name); SetModelNumbers (); SetLightStyles (); // NOTE: If we ever precompute lighting for static props in // vrad, EmitStaticProps should be removed here // Emit static props found in the .vmf file EmitStaticProps(); // NOTE: Don't deal with detail props here, it blows away lighting // Recompute the skybox ComputeBoundsNoSkybox(); // Make sure that we have a water lod control eneity if we have water in the map. EnsurePresenceOfWaterLODControlEntity(); // Make sure the func_occluders have the appropriate data set FixupOnlyEntsOccluderEntities(); // Doing this here because stuff abov may filter out entities UnparseEntities (); WriteBSPFile (platformBSPFileName); } else if (onlyprops) { // In the only props case, deal with static + detail props only LoadBSPFile (platformBSPFileName); LoadMapFile(name); SetModelNumbers(); SetLightStyles(); // Emit static props found in the .vmf file EmitStaticProps(); // Place detail props found in .vmf and based on material properties LoadEmitDetailObjectDictionary( gamedir ); EmitDetailObjects(); WriteBSPFile (platformBSPFileName); } else { // // start from scratch // // Load just the file system from the bsp if( g_bKeepStaleZip && FileExists( platformBSPFileName ) ) { LoadBSPFile_FileSystemOnly (platformBSPFileName); // Mark as stale since the lighting could be screwed with new ents. AddBufferToPak( GetPakFile(), "stale.txt", "stale", strlen( "stale" ) + 1, false ); } LoadMapFile (name); WorldVertexTransitionFixup(); if( ( g_nDXLevel == 0 ) || ( g_nDXLevel >= 70 ) ) { Cubemap_FixupBrushSidesMaterials(); Cubemap_AttachDefaultCubemapToSpecularSides(); Cubemap_AddUnreferencedCubemaps(); } SetModelNumbers (); SetLightStyles (); LoadEmitDetailObjectDictionary( gamedir ); ProcessModels (); } end = Plat_FloatTime(); char str[512]; GetHourMinuteSecondsString( (int)( end - start ), str, sizeof( str ) ); Msg( "%s elapsed\n", str ); DeleteCmdLine( argc, argv ); ReleasePakFileLumps(); DeleteMaterialReplacementKeys(); ShutdownMaterialSystem(); CmdLib_Cleanup(); return 0; }
//----------------------------------------------------------------------------- // Generate a tree containing files from a reslist. Returns TRUE if successful. //----------------------------------------------------------------------------- bool LoadReslist( const char *pReslistName, CUtlRBTree< CUtlString, int > *pTree ) { CUtlBuffer buffer; if ( !scriptlib->ReadFileToBuffer( pReslistName, buffer, true ) ) { return false; } char szBasename[MAX_PATH]; V_FileBase( pReslistName, szBasename, sizeof( szBasename ) ); characterset_t breakSet; CharacterSetBuild( &breakSet, "" ); // parse reslist char szToken[MAX_PATH]; char szBspName[MAX_PATH]; szBspName[0] = '\0'; for ( ;; ) { int nTokenSize = buffer.ParseToken( &breakSet, szToken, sizeof( szToken ) ); if ( nTokenSize <= 0 ) { break; } // reslists are pc built, filenames can be sloppy V_strlower( szToken ); V_FixSlashes( szToken ); V_RemoveDotSlashes( szToken ); // can safely cull filetypes that are ignored by queued loader at runtime bool bKeep = false; const char *pExt = V_GetFileExtension( szToken ); if ( !pExt ) { // unknown continue; } else if ( !V_stricmp( pExt, "vmt" ) || !V_stricmp( pExt, "vhv" ) || !V_stricmp( pExt, "mdl" ) || !V_stricmp( pExt, "raw" ) || !V_stricmp( pExt, "wav" ) ) { bKeep = true; } else if ( !V_stricmp( pExt, "mp3" ) ) { // change to .wav V_SetExtension( szToken, ".wav", sizeof( szToken ) ); bKeep = true; } else if ( !V_stricmp( pExt, "bsp" ) ) { // reslists erroneously have multiple bsps if ( !V_stristr( szToken, szBasename ) ) { // wrong one, cull it continue; } else { // right one, save it strcpy( szBspName, szToken ); bKeep = true; } } if ( bKeep ) { FindOrAddFileToResourceList( szToken, pTree ); } } if ( !szBspName[0] ) { // reslist is not bsp derived, nothing more to do return true; } CUtlVector< CUtlString > bspList; bool bOK = GetDependants_BSP( szBspName, &bspList ); if ( !bOK ) { return false; } // add all the bsp dependants to the resource list for ( int i=0; i<bspList.Count(); i++ ) { FindOrAddFileToResourceList( bspList[i].String(), pTree ); } // iterate all the models in the resource list, get all their dependents CUtlVector< CUtlString > modelList; for ( int i = pTree->FirstInorder(); i != pTree->InvalidIndex(); i = pTree->NextInorder( i ) ) { const char *pExt = V_GetFileExtension( pTree->Element( i ).String() ); if ( !pExt || V_stricmp( pExt, "mdl" ) ) { continue; } if ( !GetDependants_MDL( pTree->Element( i ).String(), &modelList ) ) { return false; } } // add all the model dependents to the resource list for ( int i=0; i<modelList.Count(); i++ ) { FindOrAddFileToResourceList( modelList[i].String(), pTree ); } // check for optional commentary, include wav dependencies char szCommentaryName[MAX_PATH]; V_ComposeFileName( g_szGamePath, szBspName, szCommentaryName, sizeof( szCommentaryName ) ); V_StripExtension( szCommentaryName, szCommentaryName, sizeof( szCommentaryName ) ); V_strncat( szCommentaryName, "_commentary.txt", sizeof( szCommentaryName ) ); CUtlBuffer commentaryBuffer; if ( ReadFileToBuffer( szCommentaryName, commentaryBuffer, true, true ) ) { // any single token may be quite large to due to text char szCommentaryToken[8192]; for ( ;; ) { int nTokenSize = commentaryBuffer.ParseToken( &breakSet, szCommentaryToken, sizeof( szCommentaryToken ) ); if ( nTokenSize < 0 ) { break; } if ( nTokenSize > 0 && !V_stricmp( szCommentaryToken, "commentaryfile" ) ) { // get the commentary file nTokenSize = commentaryBuffer.ParseToken( &breakSet, szCommentaryToken, sizeof( szCommentaryToken ) ); if ( nTokenSize > 0 ) { // skip past sound chars char *pName = szCommentaryToken; while ( *pName && IsSoundChar( *pName ) ) { pName++; } char szWavFile[MAX_PATH]; V_snprintf( szWavFile, sizeof( szWavFile ), "sound/%s", pName ); FindOrAddFileToResourceList( szWavFile, pTree ); } } } } // check for optional blacklist char szBlacklist[MAX_PATH]; V_ComposeFileName( g_szGamePath, "reslistfixes_xbox.xsc", szBlacklist, sizeof( szBlacklist ) ); CUtlBuffer blacklistBuffer; if ( ReadFileToBuffer( szBlacklist, blacklistBuffer, true, true ) ) { for ( ;; ) { int nTokenSize = blacklistBuffer.ParseToken( &breakSet, szToken, sizeof( szToken ) ); if ( nTokenSize <= 0 ) { break; } bool bAdd; if ( !V_stricmp( szToken, "-" ) ) { bAdd = false; } else if ( !V_stricmp( szToken, "+" ) ) { bAdd = true; } else { // bad syntax, skip line Msg( "Bad Syntax, expecting '+' or '-' as first token in reslist fixup file '%s'.\n", szBlacklist ); continue; } // get entry nTokenSize = blacklistBuffer.ParseToken( &breakSet, szToken, sizeof( szToken ) ); if ( nTokenSize <= 0 ) { break; } if ( bAdd ) { FindOrAddFileToResourceList( szToken, pTree ); } else { RemoveFileFromResourceList( szToken, pTree ); } } } return true; }
void CSun::Activate() { BaseClass::Activate(); // Find our target. if ( m_bUseAngles ) { SetupLightNormalFromProps( GetAbsAngles(), m_flYaw, m_flPitch, m_vDirection.GetForModify() ); m_vDirection = -m_vDirection.Get(); } else { CBaseEntity *pEnt = gEntList.FindEntityByName( 0, m_target ); if( pEnt ) { Vector vDirection = GetAbsOrigin() - pEnt->GetAbsOrigin(); VectorNormalize( vDirection ); m_vDirection = vDirection; } } // Default behavior if ( m_nOverlaySize == -1 ) { m_nOverlaySize = m_nSize; } // Cache off our image indices if ( m_strMaterial == NULL_STRING ) { m_strMaterial = AllocPooledString( "sprites/light_glow02_add_noz.vmt" ); } else { const char *pExtension = V_GetFileExtension( STRING( m_strMaterial ) ); if ( !pExtension ) { char szFixedString[MAX_PATH]; V_strncpy( szFixedString, STRING( m_strMaterial ), sizeof( szFixedString ) ); V_strncat( szFixedString, ".vmt", sizeof( szFixedString ) ); m_strMaterial = AllocPooledString( szFixedString ); } } if ( m_strOverlayMaterial == NULL_STRING ) { m_strOverlayMaterial = AllocPooledString( "sprites/light_glow02_add_noz.vmt" ); } else { const char *pExtension = V_GetFileExtension( STRING( m_strOverlayMaterial ) ); if ( !pExtension ) { char szFixedString[MAX_PATH]; V_strncpy( szFixedString, STRING( m_strOverlayMaterial ), sizeof( szFixedString ) ); V_strncat( szFixedString, ".vmt", sizeof( szFixedString ) ); m_strOverlayMaterial = AllocPooledString( szFixedString ); } } m_nMaterial = PrecacheModel( STRING( m_strMaterial ) ); m_nOverlayMaterial = PrecacheModel( STRING( m_strOverlayMaterial ) ); }
HMODULE Sys_LoadLibrary( const char *pLibraryName, Sys_Flags flags ) { char str[ 1024 ]; // Note: DLL_EXT_STRING can be "_srv.so" or "_360.dll". So be careful // when using the V_*Extension* routines... const char *pDllStringExtension = V_GetFileExtension( DLL_EXT_STRING ); const char *pModuleExtension = pDllStringExtension ? ( pDllStringExtension - 1 ) : DLL_EXT_STRING; Q_strncpy( str, pLibraryName, sizeof(str) ); if ( IsX360() ) { // old, probably busted, behavior for xbox if ( !Q_stristr( str, pModuleExtension ) ) { V_SetExtension( str, pModuleExtension, sizeof(str) ); } } else { // always force the final extension to be .dll V_SetExtension( str, pModuleExtension, sizeof(str) ); } Q_FixSlashes( str ); #ifdef _WIN32 ThreadedLoadLibraryFunc_t threadFunc = GetThreadedLoadLibraryFunc(); if ( !threadFunc ) return InternalLoadLibrary( str, flags ); // We shouldn't be passing noload while threaded. Assert( !( flags & SYS_NOLOAD ) ); ThreadedLoadLibaryContext_t context; context.m_pLibraryName = str; context.m_hLibrary = 0; ThreadHandle_t h = CreateSimpleThread( ThreadedLoadLibraryFunc, &context ); #ifdef _X360 ThreadSetAffinity( h, XBOX_PROCESSOR_3 ); #endif unsigned int nTimeout = 0; while( ThreadWaitForObject( h, true, nTimeout ) == TW_TIMEOUT ) { nTimeout = threadFunc(); } ReleaseThreadHandle( h ); return context.m_hLibrary; #elif POSIX int dlopen_mode = RTLD_NOW; if ( flags & SYS_NOLOAD ) dlopen_mode |= RTLD_NOLOAD; HMODULE ret = ( HMODULE )dlopen( str, dlopen_mode ); if ( !ret && !( flags & SYS_NOLOAD ) ) { const char *pError = dlerror(); if ( pError && ( strstr( pError, "No such file" ) == 0 ) && ( strstr( pError, "image not found" ) == 0 ) ) { Msg( " failed to dlopen %s error=%s\n", str, pError ); } } return ret; #endif }