Counter Strike : Global Offensive Source Code
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.
 
 
 
 
 
 

89 lines
2.8 KiB

//========= Copyright © Valve Corporation, All rights reserved. ============//
//
// Purpose: Provide interface to custom materials for entities that use them
//
//=============================================================================//
#pragma once
#include "refcount.h"
#include "materialsystem/icustommaterial.h"
class IMaterial;
class CCustomMaterialOwner;
class CCompositeTexture;
// classes that want to have a custom material should derive from this
class CCustomMaterialOwner
{
public:
virtual ~CCustomMaterialOwner() { ClearCustomMaterials( true ); }
ICustomMaterial *GetCustomMaterial( int nIndex = 0 ) const; // returns NULL if the index is out of range
virtual void SetCustomMaterial( ICustomMaterial* pCustomMaterial, int nIndex = 0 ); // either replaces and existing material (releasing the old one), or adds one to the vector
bool IsCustomMaterialValid( int nIndex = 0 ) const;
int GetCustomMaterialCount() const { return m_ppCustomMaterials.Count(); }
void ClearCustomMaterials( bool bPurge = false );
virtual void OnCustomMaterialsUpdated() {}
virtual void DuplicateCustomMaterialsToOther( CCustomMaterialOwner *pOther ) const;
private:
// Pointers to custom materials owned by the mat system for this entity. Index
// in this vector corresponds to the model material index to override with the custom material.
CUtlVector< ICustomMaterial* > m_ppCustomMaterials;
};
inline ICustomMaterial *CCustomMaterialOwner::GetCustomMaterial( int nIndex ) const
{
return ( m_ppCustomMaterials.Count() > nIndex ) ? m_ppCustomMaterials[ nIndex ] : NULL;
}
inline void CCustomMaterialOwner::SetCustomMaterial( ICustomMaterial* pCustomMaterial, int nIndex )
{
while ( m_ppCustomMaterials.Count() <= nIndex )
{
m_ppCustomMaterials.AddToTail( NULL );
}
pCustomMaterial->AddRef();
if ( m_ppCustomMaterials[ nIndex ] )
m_ppCustomMaterials[ nIndex ]->Release();
m_ppCustomMaterials[ nIndex ] = pCustomMaterial;
}
inline bool CCustomMaterialOwner::IsCustomMaterialValid( int nIndex ) const
{
return ( m_ppCustomMaterials.Count() > nIndex && m_ppCustomMaterials[ nIndex ] != NULL ) ? m_ppCustomMaterials[ nIndex ]->IsValid() : false;
}
inline void CCustomMaterialOwner::ClearCustomMaterials( bool bPurge )
{
for ( int i = 0; i < m_ppCustomMaterials.Count(); i++ )
{
if ( m_ppCustomMaterials[ i ] != NULL )
{
m_ppCustomMaterials[ i ]->Release();
m_ppCustomMaterials[ i ] = NULL;
}
}
if ( bPurge )
{
m_ppCustomMaterials.Purge();
}
else
{
m_ppCustomMaterials.RemoveAll();
}
}
inline void CCustomMaterialOwner::DuplicateCustomMaterialsToOther( CCustomMaterialOwner *pOther ) const
{
pOther->ClearCustomMaterials();
for ( int i = 0; i < CCustomMaterialOwner::m_ppCustomMaterials.Count(); i++ )
{
if ( m_ppCustomMaterials[ i ] == NULL )
continue;
pOther->SetCustomMaterial( m_ppCustomMaterials[ i ], i );
}
}