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.
106 lines
2.6 KiB
106 lines
2.6 KiB
![]()
4 years ago
|
//========= 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 );
|