bool GetValueFromMaterial( const char *pMaterialName, const char *pKey, char *pValue, int len ) { char name[512]; sprintf( name, "materials/%s.vmt", GetOriginalMaterialNameForPatchedMaterial( pMaterialName ) ); KeyValues *kv = new KeyValues( "blah" ); // Load the underlying file so that we can check if env_cubemap is in there. if ( !kv->LoadFromFile( g_pFileSystem, name ) ) { // Assert( 0 ); kv->deleteThis(); return NULL; } const char *pTmpValue = kv->GetString( pKey, NULL ); if( pTmpValue ) { Q_strncpy( pValue, pTmpValue, len ); } kv->deleteThis(); if( pTmpValue ) { return true; } else { return false; } }
//----------------------------------------------------------------------------- // A version which allows you to patch multiple key values //----------------------------------------------------------------------------- void CreateMaterialPatch( const char *pOriginalMaterialName, const char *pNewMaterialName, int nKeys, const MaterialPatchInfo_t *pInfo, MaterialPatchType_t nPatchType ) { char pOldVMTFile[ 512 ]; char pNewVMTFile[ 512 ]; AddNewTranslation( pOriginalMaterialName, pNewMaterialName ); Q_snprintf( pOldVMTFile, 512, "materials/%s.vmt", pOriginalMaterialName ); Q_snprintf( pNewVMTFile, 512, "materials/%s.vmt", pNewMaterialName ); // printf( "Creating material patch file %s which points at %s\n", newVMTFile, oldVMTFile ); KeyValues *kv = new KeyValues( "patch" ); if ( !kv ) { Error( "Couldn't allocate KeyValues for %s!!!", pNewMaterialName ); } kv->SetString( "include", pOldVMTFile ); const char *pSectionName = (nPatchType == PATCH_INSERT) ? "insert" : "replace"; KeyValues *section = kv->FindKey( pSectionName, true ); if( nPatchType == PATCH_REPLACE ) { char name[512]; Q_snprintf( name, 512, "materials/%s.vmt", GetOriginalMaterialNameForPatchedMaterial( pOriginalMaterialName ) ); KeyValues *origkv = new KeyValues( "blah" ); if ( !origkv->LoadFromFile( g_pFileSystem, name ) ) { origkv->deleteThis(); Assert( 0 ); return; } CreateMaterialPatchRecursive( origkv, section, nKeys, pInfo ); origkv->deleteThis(); } else { for ( int i = 0; i < nKeys; ++i ) { section->SetString( pInfo[i].m_pKey, pInfo[i].m_pValue ); } } // Write patched .vmt into a memory buffer CUtlBuffer buf( 0, 0, CUtlBuffer::TEXT_BUFFER ); kv->RecursiveSaveToFile( buf, 0 ); // Add to pak file for this .bsp AddBufferToPak( GetPakFile(), pNewVMTFile, (void*)buf.Base(), buf.TellPut(), true ); // Cleanup kv->deleteThis(); }
//----------------------------------------------------------------------------- // Returns true if the material or any of its dependents use an $envmap //----------------------------------------------------------------------------- bool DoesMaterialOrDependentsUseEnvmap( const char *pPatchedMaterialName ) { const char *pOriginalMaterialName = GetOriginalMaterialNameForPatchedMaterial( pPatchedMaterialName ); if( DoesMaterialHaveKey( pOriginalMaterialName, "$envmap" ) ) return true; const char *pDependentMaterial = FindDependentMaterial( pOriginalMaterialName ); if ( !pDependentMaterial ) return false; return DoesMaterialOrDependentsUseEnvmap( pDependentMaterial ); }
//----------------------------------------------------------------------------- // Scan material + all subsections for key/value pair //----------------------------------------------------------------------------- bool DoesMaterialHaveKeyValuePair( const char *pMaterialName, const char *pKeyName, const char *pSearchValue ) { char name[512]; Q_snprintf( name, 512, "materials/%s.vmt", GetOriginalMaterialNameForPatchedMaterial( pMaterialName ) ); KeyValues *kv = new KeyValues( "blah" ); if ( !kv->LoadFromFile( g_pFileSystem, name ) ) { kv->deleteThis(); return NULL; } bool retVal = DoesMaterialHaveKeyValuePair( kv, pKeyName, pSearchValue ); kv->deleteThis(); return retVal; }
//----------------------------------------------------------------------------- // Gets a material value from a material. Ignores all patches //----------------------------------------------------------------------------- bool GetValueFromMaterial( const char *pMaterialName, const char *pKey, char *pValue, int len ) { char name[512]; Q_snprintf( name, 512, "materials/%s.vmt", GetOriginalMaterialNameForPatchedMaterial( pMaterialName ) ); KeyValues *kv = new KeyValues( "blah" ); if ( !kv->LoadFromFile( g_pFileSystem, name ) ) { // Assert( 0 ); kv->deleteThis(); return NULL; } const char *pTmpValue = kv->GetString( pKey, NULL ); if( pTmpValue ) { Q_strncpy( pValue, pTmpValue, len ); } kv->deleteThis(); return ( pTmpValue != NULL ); }
MaterialSystemMaterial_t FindOriginalMaterial( const char *materialName, bool *pFound, bool bComplain ) { MaterialSystemMaterial_t matID; matID = FindMaterial( GetOriginalMaterialNameForPatchedMaterial( materialName ), pFound, bComplain ); return matID; }