|
|
//========= Copyright � 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "materialsystem/imaterialproxy.h"
#include "materialsystem/imaterial.h"
#include "materialsystem/imaterialvar.h"
#include <keyvalues.h>
#include "mathlib/vmatrix.h"
#include "functionproxy.h"
#include "imaterialproxydict.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
// $textureScrollVar
// $textureScrollRate
// $textureScrollAngle
class CTextureScrollMaterialProxy : public IMaterialProxy { public: CTextureScrollMaterialProxy(); virtual ~CTextureScrollMaterialProxy(); virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues ); virtual void OnBind( void *pC_BaseEntity ); virtual void Release( void ) { delete this; } virtual IMaterial *GetMaterial();
private: IMaterialVar *m_pTextureScrollVar; CFloatInput m_TextureScrollRate; CFloatInput m_TextureScrollAngle; CFloatInput m_TextureScale; };
CTextureScrollMaterialProxy::CTextureScrollMaterialProxy() { m_pTextureScrollVar = NULL; }
CTextureScrollMaterialProxy::~CTextureScrollMaterialProxy() { }
bool CTextureScrollMaterialProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues ) { char const* pScrollVarName = pKeyValues->GetString( "textureScrollVar" ); if( !pScrollVarName ) return false;
bool foundVar; m_pTextureScrollVar = pMaterial->FindVar( pScrollVarName, &foundVar, false ); if( !foundVar ) return false;
m_TextureScrollRate.Init( pMaterial, pKeyValues, "textureScrollRate", 1.0f ); m_TextureScrollAngle.Init( pMaterial, pKeyValues, "textureScrollAngle", 0.0f ); m_TextureScale.Init( pMaterial, pKeyValues, "textureScale", 1.0f );
return true; }
void CTextureScrollMaterialProxy::OnBind( void *pC_BaseEntity ) { if( !m_pTextureScrollVar ) { return; }
float rate, angle, scale;
// set default values if these variables don't exist.
rate = m_TextureScrollRate.GetFloat(); angle = m_TextureScrollAngle.GetFloat(); scale = m_TextureScale.GetFloat();
float sOffset, tOffset; sOffset = gpGlobals->curtime * cos( angle * ( M_PI / 180.0f ) ) * rate; tOffset = gpGlobals->curtime * sin( angle * ( M_PI / 180.0f ) ) * rate;
// make sure that we are positive
if( sOffset < 0.0f ) { sOffset += 1.0f + -( int )sOffset; } if( tOffset < 0.0f ) { tOffset += 1.0f + -( int )tOffset; } // make sure that we are in a [0,1] range
sOffset = sOffset - ( int )sOffset; tOffset = tOffset - ( int )tOffset; if (m_pTextureScrollVar->GetType() == MATERIAL_VAR_TYPE_MATRIX) { VMatrix mat( scale, 0.0f, 0.0f, sOffset, 0.0f, scale, 0.0f, tOffset, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f ); m_pTextureScrollVar->SetMatrixValue( mat ); } else { m_pTextureScrollVar->SetVecValue( sOffset, tOffset, 0.0f ); } }
IMaterial *CTextureScrollMaterialProxy::GetMaterial() { return m_pTextureScrollVar->GetOwningMaterial(); }
EXPOSE_MATERIAL_PROXY( CTextureScrollMaterialProxy, TextureScroll );
|