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.
169 lines
4.0 KiB
169 lines
4.0 KiB
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================//
|
|
#include "cbase.h"
|
|
#include "mathlib/vmatrix.h"
|
|
#include "functionproxy.h"
|
|
#include "materialsystem/imaterialvar.h"
|
|
#include <keyvalues.h>
|
|
#include "materialsystem/imaterial.h"
|
|
|
|
#include "imaterialproxydict.h"
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
class C_BaseEntity;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Texture transform proxy
|
|
//-----------------------------------------------------------------------------
|
|
class CTextureTransformProxy : public CResultProxy
|
|
{
|
|
public:
|
|
bool Init( IMaterial *pMaterial, KeyValues *pKeyValues );
|
|
void OnBind( void *pC_BaseEntity );
|
|
|
|
private:
|
|
IMaterialVar *m_pCenterVar;
|
|
IMaterialVar *m_pScaleVar;
|
|
IMaterialVar *m_pRotateVar;
|
|
IMaterialVar *m_pTranslateVar;
|
|
};
|
|
|
|
bool CTextureTransformProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
|
|
{
|
|
// All are optional...
|
|
m_pCenterVar = NULL;
|
|
m_pScaleVar = NULL;
|
|
m_pRotateVar = NULL;
|
|
m_pTranslateVar = NULL;
|
|
|
|
bool bFoundVar;
|
|
char const* pVarName = pKeyValues->GetString( "centerVar" );
|
|
if( pVarName && pVarName[0] )
|
|
{
|
|
m_pCenterVar = pMaterial->FindVar( pVarName, &bFoundVar, false );
|
|
}
|
|
|
|
pVarName = pKeyValues->GetString( "scaleVar" );
|
|
if( pVarName && pVarName[0] )
|
|
{
|
|
m_pScaleVar = pMaterial->FindVar( pVarName, &bFoundVar, false );
|
|
}
|
|
|
|
pVarName = pKeyValues->GetString( "rotateVar" );
|
|
if( pVarName && pVarName[0] )
|
|
{
|
|
m_pRotateVar = pMaterial->FindVar( pVarName, &bFoundVar, false );
|
|
}
|
|
|
|
pVarName = pKeyValues->GetString( "translateVar" );
|
|
if( pVarName && pVarName[0] )
|
|
{
|
|
m_pTranslateVar = pMaterial->FindVar( pVarName, &bFoundVar, false );
|
|
}
|
|
|
|
return CResultProxy::Init( pMaterial, pKeyValues );
|
|
}
|
|
|
|
void CTextureTransformProxy::OnBind( void *pC_BaseEntity )
|
|
{
|
|
Vector2D center( 0.5, 0.5 );
|
|
Vector2D translation( 0, 0 );
|
|
|
|
VMatrix mat, temp;
|
|
|
|
if (m_pCenterVar)
|
|
{
|
|
m_pCenterVar->GetVecValue( center.Base(), 2 );
|
|
}
|
|
MatrixBuildTranslation( mat, -center.x, -center.y, 0.0f );
|
|
|
|
if (m_pScaleVar)
|
|
{
|
|
Vector2D scale;
|
|
m_pScaleVar->GetVecValue( scale.Base(), 2 );
|
|
MatrixBuildScale( temp, scale.x, scale.y, 1.0f );
|
|
MatrixMultiply( temp, mat, mat );
|
|
}
|
|
|
|
if (m_pRotateVar)
|
|
{
|
|
float angle = m_pRotateVar->GetFloatValue( );
|
|
MatrixBuildRotateZ( temp, angle );
|
|
MatrixMultiply( temp, mat, mat );
|
|
}
|
|
MatrixBuildTranslation( temp, center.x, center.y, 0.0f );
|
|
MatrixMultiply( temp, mat, mat );
|
|
|
|
if (m_pTranslateVar)
|
|
{
|
|
m_pTranslateVar->GetVecValue( translation.Base(), 2 );
|
|
MatrixBuildTranslation( temp, translation.x, translation.y, 0.0f );
|
|
MatrixMultiply( temp, mat, mat );
|
|
}
|
|
|
|
m_pResult->SetMatrixValue( mat );
|
|
}
|
|
|
|
|
|
|
|
EXPOSE_MATERIAL_PROXY( CTextureTransformProxy, TextureTransform );
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Rotation proxy
|
|
//-----------------------------------------------------------------------------
|
|
class CMatrixRotateProxy : public CResultProxy
|
|
{
|
|
public:
|
|
bool Init( IMaterial *pMaterial, KeyValues *pKeyValues );
|
|
void OnBind( void *pC_BaseEntity );
|
|
|
|
private:
|
|
CFloatInput m_Angle;
|
|
IMaterialVar *m_pAxisVar;
|
|
};
|
|
|
|
bool CMatrixRotateProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
|
|
{
|
|
// All are optional...
|
|
m_pAxisVar = NULL;
|
|
|
|
bool bFoundVar;
|
|
char const* pVarName = pKeyValues->GetString( "axisVar" );
|
|
if( pVarName && pVarName[0] )
|
|
{
|
|
m_pAxisVar = pMaterial->FindVar( pVarName, &bFoundVar, false );
|
|
}
|
|
|
|
if (!m_Angle.Init( pMaterial, pKeyValues, "angle", 0 ))
|
|
return false;
|
|
|
|
return CResultProxy::Init( pMaterial, pKeyValues );
|
|
}
|
|
|
|
void CMatrixRotateProxy::OnBind( void *pC_BaseEntity )
|
|
{
|
|
VMatrix mat;
|
|
Vector axis( 0, 0, 1 );
|
|
if (m_pAxisVar)
|
|
{
|
|
m_pAxisVar->GetVecValue( axis.Base(), 3 );
|
|
if (VectorNormalize( axis ) < 1e-3)
|
|
{
|
|
axis.Init( 0, 0, 1 );
|
|
}
|
|
}
|
|
|
|
MatrixBuildRotationAboutAxis( mat, axis, m_Angle.GetFloat() );
|
|
m_pResult->SetMatrixValue( mat );
|
|
}
|
|
|
|
|
|
|
|
EXPOSE_MATERIAL_PROXY( CMatrixRotateProxy, MatrixRotate );
|
|
|