148 lines
3.1 KiB
C++
148 lines
3.1 KiB
C++
//========= Copyright © 1996-2008, Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Material proxy to get the cycle from a CBaseAnimateing derived entity.
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================//
|
|
|
|
#include "cbase.h"
|
|
// identifier was truncated to '255' characters in the debug information
|
|
//#pragma warning(disable: 4786)
|
|
|
|
#include "proxyentity.h"
|
|
#include "materialsystem/imaterialvar.h"
|
|
#include "imaterialproxydict.h"
|
|
|
|
// NOTE: This has to be the last file included!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
|
|
class CCycleMaterialProxy: public CEntityMaterialProxy
|
|
{
|
|
public:
|
|
CCycleMaterialProxy()
|
|
{
|
|
m_pMaterial = NULL;
|
|
m_pResult = NULL;
|
|
m_bEaseIn = false;
|
|
m_bEaseOut = false;
|
|
m_fStart = 0.0f;
|
|
m_fEnd = 1.0f;
|
|
}
|
|
virtual ~CCycleMaterialProxy()
|
|
{
|
|
}
|
|
virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues )
|
|
{
|
|
m_pMaterial = pMaterial;
|
|
|
|
const char *pResult = pKeyValues->GetString( "resultVar", NULL );
|
|
if ( !pResult )
|
|
return false;
|
|
|
|
bool found;
|
|
m_pResult = m_pMaterial->FindVar( pResult, &found );
|
|
if ( !found )
|
|
{
|
|
m_pResult = NULL;
|
|
return false;
|
|
}
|
|
|
|
if ( !Q_stricmp( pResult, "$alpha" ) )
|
|
{
|
|
pMaterial->SetMaterialVarFlag( MATERIAL_VAR_ALPHA_MODIFIED_BY_PROXY, true );
|
|
}
|
|
|
|
pResult = pKeyValues->GetString( "easein", NULL );
|
|
if( pResult && Q_atoi( pResult ) != 0 )
|
|
{
|
|
m_bEaseIn = true;
|
|
}
|
|
|
|
pResult = pKeyValues->GetString( "easeout", NULL );
|
|
if( pResult && Q_atoi( pResult ) != 0 )
|
|
{
|
|
m_bEaseOut = true;
|
|
}
|
|
|
|
pResult = pKeyValues->GetString( "start", NULL );
|
|
if( pResult )
|
|
{
|
|
m_fStart = Q_atof( pResult );
|
|
}
|
|
|
|
pResult = pKeyValues->GetString( "end", NULL );
|
|
if( pResult )
|
|
{
|
|
m_fEnd = Q_atof( pResult );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
virtual void OnBind( C_BaseEntity *pC_BaseEntity )
|
|
{
|
|
C_BaseAnimating *pBaseAnimating = pC_BaseEntity ? pC_BaseEntity->GetBaseAnimating() : NULL;
|
|
if ( pBaseAnimating )
|
|
{
|
|
float fCycle = pBaseAnimating->GetCycle();
|
|
float f = RemapValClamped( fCycle, m_fStart, m_fEnd, 0.0f, 1.0f );
|
|
if ( m_bEaseIn && m_bEaseOut )
|
|
{
|
|
f = SimpleSpline( f );
|
|
}
|
|
else if ( m_bEaseIn )
|
|
{
|
|
f = sin( M_PI * f * 0.5f );
|
|
}
|
|
else if ( m_bEaseOut )
|
|
{
|
|
f = 1.0f - sin( M_PI * f * 0.5f + 0.5f * M_PI );
|
|
}
|
|
|
|
MaterialVarType_t resultType;
|
|
int vecSize;
|
|
ComputeResultType( resultType, vecSize );
|
|
|
|
switch( resultType )
|
|
{
|
|
case MATERIAL_VAR_TYPE_VECTOR:
|
|
{
|
|
Vector4D vec( f, f, f, f );
|
|
m_pResult->SetVecValue( vec.Base(), vecSize );
|
|
}
|
|
break;
|
|
|
|
case MATERIAL_VAR_TYPE_FLOAT:
|
|
case MATERIAL_VAR_TYPE_INT:
|
|
default:
|
|
m_pResult->SetFloatValue( f );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
virtual IMaterial *GetMaterial()
|
|
{
|
|
return m_pMaterial;
|
|
}
|
|
|
|
void ComputeResultType( MaterialVarType_t& resultType, int& vecSize )
|
|
{
|
|
vecSize = 1;
|
|
resultType = m_pResult->GetType();
|
|
if (resultType == MATERIAL_VAR_TYPE_VECTOR)
|
|
{
|
|
vecSize = m_pResult->VectorSize();
|
|
}
|
|
}
|
|
|
|
protected:
|
|
IMaterial *m_pMaterial;
|
|
IMaterialVar *m_pResult;
|
|
bool m_bEaseIn;
|
|
bool m_bEaseOut;
|
|
float m_fStart;
|
|
float m_fEnd;
|
|
};
|
|
|
|
EXPOSE_MATERIAL_PROXY( CCycleMaterialProxy, Cycle );
|