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.
105 lines
2.6 KiB
105 lines
2.6 KiB
//========= 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 );
|
|
|