source-engine/game/client/thermalmaterialproxy.cpp

106 lines
2.6 KiB
C++
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "proxyentity.h"
#include "materialsystem/imaterial.h"
#include "materialsystem/imaterialvar.h"
void HueToRGB( float frac, Vector& color );
// $ThermalVar : name of variable to run Thermal wave on (can either be a color or a float)
// $ThermalPeriod: time that it takes to go through whole Thermal wave in seconds (default: 1.0f)
// $ThermalMax : the max value for the Thermal wave (default: 1.0f )
// $ThermalMin: the min value for the Thermal wave (default: 0.0f )
class CThermalMaterialProxy : public CEntityMaterialProxy
{
public:
CThermalMaterialProxy();
virtual ~CThermalMaterialProxy();
virtual bool Init( IMaterial *pMaterial, KeyValues* pKeyValues );
virtual void OnBind( C_BaseEntity *pEntity );
private:
IMaterialVar *m_ThermalVar;
IMaterialVar *m_ThermalPeriod;
IMaterialVar *m_ThermalMax;
IMaterialVar *m_ThermalMin;
};
CThermalMaterialProxy::CThermalMaterialProxy()
{
m_ThermalVar = NULL;
m_ThermalPeriod = NULL;
m_ThermalMax = NULL;
m_ThermalMin = NULL;
}
CThermalMaterialProxy::~CThermalMaterialProxy()
{
}
bool CThermalMaterialProxy::Init( IMaterial *pMaterial, KeyValues* pKeyValues )
{
bool foundVar;
m_ThermalVar = pMaterial->FindVar( "$color", &foundVar, false );
if( !foundVar )
{
m_ThermalVar = NULL;
return false;
}
m_ThermalPeriod = pMaterial->FindVar( "$ThermalPeriod", &foundVar, false );
if( !foundVar )
{
m_ThermalPeriod = NULL;
}
m_ThermalMax = pMaterial->FindVar( "$ThermalMax", &foundVar, false );
if( !foundVar )
{
m_ThermalMax = NULL;
}
m_ThermalMin = pMaterial->FindVar( "$ThermalMin", &foundVar, false );
if( !foundVar )
{
m_ThermalMin = NULL;
}
return true;
}
void CThermalMaterialProxy::OnBind( C_BaseEntity *pEntity )
{
// FIXME, enable this later
return;
if( !m_ThermalVar )
{
return;
}
float min, max, period, value;
// set default values if these variables don't exist.
min = m_ThermalMin ? m_ThermalMin->GetFloatValue() : 0.0f;
max = m_ThermalMax ? m_ThermalMax->GetFloatValue() : 1.0f;
period = m_ThermalPeriod ? m_ThermalPeriod->GetFloatValue() : 1.0f;
// get a value in [0,1]
value = ( sin( 2.0f * M_PI * gpGlobals->curtime / period ) * 0.5f ) + 0.5f;
// get a value in [min,max]
value = ( max - min ) * value + min;
Vector color;
HueToRGB( 360.f * value, color );
m_ThermalVar->SetVecValue( color[0], color[1], color[2] );
}
EXPOSE_INTERFACE( CThermalMaterialProxy, IMaterialProxy, "Thermal" IMATERIAL_PROXY_INTERFACE_VERSION );