diff options
| author | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:31:46 -0800 |
|---|---|---|
| committer | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:46:31 -0800 |
| commit | f56bb35301836e56582a575a75864392a0177875 (patch) | |
| tree | de61ddd39de3e7df52759711950b4c288592f0dc /mp/src/game/client/mathproxy.cpp | |
| parent | Mark some more files as text. (diff) | |
| download | source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.tar.xz source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.zip | |
Fix line endings. WHAMMY.
Diffstat (limited to 'mp/src/game/client/mathproxy.cpp')
| -rw-r--r-- | mp/src/game/client/mathproxy.cpp | 2184 |
1 files changed, 1092 insertions, 1092 deletions
diff --git a/mp/src/game/client/mathproxy.cpp b/mp/src/game/client/mathproxy.cpp index ae81d3c1..2dccb7ca 100644 --- a/mp/src/game/client/mathproxy.cpp +++ b/mp/src/game/client/mathproxy.cpp @@ -1,1093 +1,1093 @@ -//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-// $NoKeywords: $
-//=============================================================================//
-#include "cbase.h"
-#include "sharedInterface.h"
-#include "materialsystem/imaterial.h"
-#include <KeyValues.h>
-#include "materialsystem/imaterialvar.h"
-#include "functionproxy.h"
-#include "toolframework_client.h"
-
-// memdbgon must be the last include file in a .cpp file!!!
-#include "tier0/memdbgon.h"
-
-// forward declarations
-void ToolFramework_RecordMaterialParams( IMaterial *pMaterial );
-
-class C_BaseEntity;
-
-//-----------------------------------------------------------------------------
-// Adds two vars...
-//-----------------------------------------------------------------------------
-
-class CAddProxy : public CFunctionProxy
-{
-public:
- bool Init( IMaterial *pMaterial, KeyValues *pKeyValues );
- void OnBind( void *pC_BaseEntity );
-};
-
-bool CAddProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
-{
- // Requires 2 args..
- bool ok = CFunctionProxy::Init( pMaterial, pKeyValues );
- ok = ok && m_pSrc2;
- return ok;
-}
-
-void CAddProxy::OnBind( void *pC_BaseEntity )
-{
- Assert( m_pSrc1 && m_pSrc2 && m_pResult );
-
- MaterialVarType_t resultType;
- int vecSize;
- ComputeResultType( resultType, vecSize );
-
- switch( resultType )
- {
- case MATERIAL_VAR_TYPE_VECTOR:
- {
- Vector a, b, c;
- m_pSrc1->GetVecValue( a.Base(), vecSize );
- m_pSrc2->GetVecValue( b.Base(), vecSize );
- VectorAdd( a, b, c );
- m_pResult->SetVecValue( c.Base(), vecSize );
- }
- break;
-
- case MATERIAL_VAR_TYPE_FLOAT:
- SetFloatResult( m_pSrc1->GetFloatValue() + m_pSrc2->GetFloatValue() );
- break;
-
- case MATERIAL_VAR_TYPE_INT:
- m_pResult->SetFloatValue( m_pSrc1->GetIntValue() + m_pSrc2->GetIntValue() );
- break;
- }
-
- if ( ToolsEnabled() )
- {
- ToolFramework_RecordMaterialParams( GetMaterial() );
- }
-}
-
-EXPOSE_INTERFACE( CAddProxy, IMaterialProxy, "Add" IMATERIAL_PROXY_INTERFACE_VERSION );
-
-
-//-----------------------------------------------------------------------------
-// Subtracts two vars...
-//-----------------------------------------------------------------------------
-
-class CSubtractProxy : public CFunctionProxy
-{
-public:
- bool Init( IMaterial *pMaterial, KeyValues *pKeyValues );
- void OnBind( void *pC_BaseEntity );
-};
-
-bool CSubtractProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
-{
- // Requires 2 args..
- bool ok = CFunctionProxy::Init( pMaterial, pKeyValues );
- ok = ok && m_pSrc2;
- return ok;
-}
-
-void CSubtractProxy::OnBind( void *pC_BaseEntity )
-{
- Assert( m_pSrc1 && m_pSrc2 && m_pResult );
-
- MaterialVarType_t resultType;
- int vecSize;
- ComputeResultType( resultType, vecSize );
-
- switch( resultType )
- {
- case MATERIAL_VAR_TYPE_VECTOR:
- {
- Vector a, b, c;
- m_pSrc1->GetVecValue( a.Base(), vecSize );
- m_pSrc2->GetVecValue( b.Base(), vecSize );
- VectorSubtract( a, b, c );
- m_pResult->SetVecValue( c.Base(), vecSize );
- }
- break;
-
- case MATERIAL_VAR_TYPE_FLOAT:
- SetFloatResult( m_pSrc1->GetFloatValue() - m_pSrc2->GetFloatValue() );
- break;
-
- case MATERIAL_VAR_TYPE_INT:
- m_pResult->SetFloatValue( m_pSrc1->GetIntValue() - m_pSrc2->GetIntValue() );
- break;
- }
-
- if ( ToolsEnabled() )
- {
- ToolFramework_RecordMaterialParams( GetMaterial() );
- }
-}
-
-EXPOSE_INTERFACE( CSubtractProxy, IMaterialProxy, "Subtract" IMATERIAL_PROXY_INTERFACE_VERSION );
-
-
-//-----------------------------------------------------------------------------
-// Multiplies two vars...
-//-----------------------------------------------------------------------------
-
-class CMultiplyProxy : public CFunctionProxy
-{
-public:
- bool Init( IMaterial *pMaterial, KeyValues *pKeyValues );
- void OnBind( void *pC_BaseEntity );
-};
-
-bool CMultiplyProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
-{
- // Requires 2 args..
- bool ok = CFunctionProxy::Init( pMaterial, pKeyValues );
- ok = ok && m_pSrc2;
- return ok;
-}
-
-void CMultiplyProxy::OnBind( void *pC_BaseEntity )
-{
- Assert( m_pSrc1 && m_pSrc2 && m_pResult );
-
- MaterialVarType_t resultType;
- int vecSize;
- ComputeResultType( resultType, vecSize );
-
- switch( resultType )
- {
- case MATERIAL_VAR_TYPE_VECTOR:
- {
- Vector a, b, c;
- m_pSrc1->GetVecValue( a.Base(), vecSize );
- m_pSrc2->GetVecValue( b.Base(), vecSize );
- VectorMultiply( a, b, c );
- m_pResult->SetVecValue( c.Base(), vecSize );
- }
- break;
-
- case MATERIAL_VAR_TYPE_FLOAT:
- SetFloatResult( m_pSrc1->GetFloatValue() * m_pSrc2->GetFloatValue() );
- break;
-
- case MATERIAL_VAR_TYPE_INT:
- m_pResult->SetFloatValue( m_pSrc1->GetIntValue() * m_pSrc2->GetIntValue() );
- break;
- }
-
- if ( ToolsEnabled() )
- {
- ToolFramework_RecordMaterialParams( GetMaterial() );
- }
-}
-
-
-EXPOSE_INTERFACE( CMultiplyProxy, IMaterialProxy, "Multiply" IMATERIAL_PROXY_INTERFACE_VERSION );
-
-
-//-----------------------------------------------------------------------------
-// divides two vars...
-//-----------------------------------------------------------------------------
-
-class CDivideProxy : public CFunctionProxy
-{
-public:
- bool Init( IMaterial *pMaterial, KeyValues *pKeyValues );
- void OnBind( void *pC_BaseEntity );
-};
-
-bool CDivideProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
-{
- // Requires 2 args..
- bool ok = CFunctionProxy::Init( pMaterial, pKeyValues );
- ok = ok && m_pSrc2;
- return ok;
-}
-
-void CDivideProxy::OnBind( void *pC_BaseEntity )
-{
- Assert( m_pSrc1 && m_pSrc2 && m_pResult );
-
- MaterialVarType_t resultType;
- int vecSize;
- ComputeResultType( resultType, vecSize );
-
- switch( resultType )
- {
- case MATERIAL_VAR_TYPE_VECTOR:
- {
- Vector a, b, c;
- m_pSrc1->GetVecValue( a.Base(), vecSize );
- m_pSrc2->GetVecValue( b.Base(), vecSize );
- VectorDivide( a, b, c );
- m_pResult->SetVecValue( c.Base(), vecSize );
- }
- break;
-
- case MATERIAL_VAR_TYPE_FLOAT:
- if (m_pSrc2->GetFloatValue() != 0)
- {
- SetFloatResult( m_pSrc1->GetFloatValue() / m_pSrc2->GetFloatValue() );
- }
- else
- {
- SetFloatResult( m_pSrc1->GetFloatValue() );
- }
- break;
-
- case MATERIAL_VAR_TYPE_INT:
- if (m_pSrc2->GetIntValue() != 0)
- {
- m_pResult->SetFloatValue( m_pSrc1->GetIntValue() / m_pSrc2->GetIntValue() );
- }
- else
- {
- m_pResult->SetFloatValue( m_pSrc1->GetIntValue() );
- }
- break;
- }
-
- if ( ToolsEnabled() )
- {
- ToolFramework_RecordMaterialParams( GetMaterial() );
- }
-}
-
-EXPOSE_INTERFACE( CDivideProxy, IMaterialProxy, "Divide" IMATERIAL_PROXY_INTERFACE_VERSION );
-
-//-----------------------------------------------------------------------------
-// clamps a var...
-//-----------------------------------------------------------------------------
-
-class CClampProxy : public CFunctionProxy
-{
-public:
- bool Init( IMaterial *pMaterial, KeyValues *pKeyValues );
- void OnBind( void *pC_BaseEntity );
-
-private:
- CFloatInput m_Min;
- CFloatInput m_Max;
-};
-
-bool CClampProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
-{
- if (!CFunctionProxy::Init( pMaterial, pKeyValues ))
- return false;
-
- if (!m_Min.Init( pMaterial, pKeyValues, "min", 0 ))
- return false;
-
- if (!m_Max.Init( pMaterial, pKeyValues, "max", 1 ))
- return false;
-
- return true;
-}
-
-void CClampProxy::OnBind( void *pC_BaseEntity )
-{
- Assert( m_pSrc1 && m_pResult );
-
- MaterialVarType_t resultType;
- int vecSize;
- ComputeResultType( resultType, vecSize );
-
- float flMin = m_Min.GetFloat();
- float flMax = m_Max.GetFloat();
-
- if (flMin > flMax)
- {
- float flTemp = flMin;
- flMin = flMax;
- flMax = flTemp;
- }
-
- switch( resultType )
- {
- case MATERIAL_VAR_TYPE_VECTOR:
- {
- Vector a;
- m_pSrc1->GetVecValue( a.Base(), vecSize );
- for (int i = 0; i < vecSize; ++i)
- {
- if (a[i] < flMin)
- a[i] = flMin;
- else if (a[i] > flMax)
- a[i] = flMax;
- }
- m_pResult->SetVecValue( a.Base(), vecSize );
- }
- break;
-
- case MATERIAL_VAR_TYPE_FLOAT:
- {
- float src = m_pSrc1->GetFloatValue();
- if (src < flMin)
- src = flMin;
- else if (src > flMax)
- src = flMax;
- SetFloatResult( src );
- }
- break;
-
- case MATERIAL_VAR_TYPE_INT:
- {
- int src = m_pSrc1->GetIntValue();
- if (src < flMin)
- src = flMin;
- else if (src > flMax)
- src = flMax;
- m_pResult->SetIntValue( src );
- }
- break;
- }
-
- if ( ToolsEnabled() )
- {
- ToolFramework_RecordMaterialParams( GetMaterial() );
- }
-}
-
-
-EXPOSE_INTERFACE( CClampProxy, IMaterialProxy, "Clamp" IMATERIAL_PROXY_INTERFACE_VERSION );
-
-//-----------------------------------------------------------------------------
-// Creates a sinusoid
-//-----------------------------------------------------------------------------
-
-// sinePeriod: time that it takes to go through whole sine wave in seconds (default: 1.0f)
-// sineMax : the max value for the sine wave (default: 1.0f )
-// sineMin: the min value for the sine wave (default: 0.0f )
-class CSineProxy : public CResultProxy
-{
-public:
- virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues );
- virtual void OnBind( void *pC_BaseEntity );
-
-private:
- CFloatInput m_SinePeriod;
- CFloatInput m_SineMax;
- CFloatInput m_SineMin;
- CFloatInput m_SineTimeOffset;
-};
-
-
-bool CSineProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
-{
- if (!CResultProxy::Init( pMaterial, pKeyValues ))
- return false;
-
- if (!m_SinePeriod.Init( pMaterial, pKeyValues, "sinePeriod", 1.0f ))
- return false;
- if (!m_SineMax.Init( pMaterial, pKeyValues, "sineMax", 1.0f ))
- return false;
- if (!m_SineMin.Init( pMaterial, pKeyValues, "sineMin", 0.0f ))
- return false;
- if (!m_SineTimeOffset.Init( pMaterial, pKeyValues, "timeOffset", 0.0f ))
- return false;
-
- return true;
-}
-
-void CSineProxy::OnBind( void *pC_BaseEntity )
-{
- Assert( m_pResult );
-
- float flValue;
- float flSineTimeOffset = m_SineTimeOffset.GetFloat();
- float flSineMax = m_SineMax.GetFloat();
- float flSineMin = m_SineMin.GetFloat();
- float flSinePeriod = m_SinePeriod.GetFloat();
- if (flSinePeriod == 0)
- flSinePeriod = 1;
-
- // get a value in [0,1]
- flValue = ( sin( 2.0f * M_PI * (gpGlobals->curtime - flSineTimeOffset) / flSinePeriod ) * 0.5f ) + 0.5f;
- // get a value in [min,max]
- flValue = ( flSineMax - flSineMin ) * flValue + flSineMin;
-
- SetFloatResult( flValue );
-
- if ( ToolsEnabled() )
- {
- ToolFramework_RecordMaterialParams( GetMaterial() );
- }
-}
-
-EXPOSE_INTERFACE( CSineProxy, IMaterialProxy, "Sine" IMATERIAL_PROXY_INTERFACE_VERSION );
-
-//-----------------------------------------------------------------------------
-// copies a var...
-//-----------------------------------------------------------------------------
-
-class CEqualsProxy : public CFunctionProxy
-{
-public:
- void OnBind( void *pC_BaseEntity );
-};
-
-
-void CEqualsProxy::OnBind( void *pC_BaseEntity )
-{
- Assert( m_pSrc1 && m_pResult );
-
- MaterialVarType_t resultType;
- int vecSize;
- ComputeResultType( resultType, vecSize );
-
- switch( resultType )
- {
- case MATERIAL_VAR_TYPE_VECTOR:
- {
- Vector a;
- m_pSrc1->GetVecValue( a.Base(), vecSize );
- m_pResult->SetVecValue( a.Base(), vecSize );
- }
- break;
-
- case MATERIAL_VAR_TYPE_FLOAT:
- SetFloatResult( m_pSrc1->GetFloatValue() );
- break;
-
- case MATERIAL_VAR_TYPE_INT:
- m_pResult->SetIntValue( m_pSrc1->GetIntValue() );
- break;
- }
-
- if ( ToolsEnabled() )
- {
- ToolFramework_RecordMaterialParams( GetMaterial() );
- }
-}
-
-
-EXPOSE_INTERFACE( CEqualsProxy, IMaterialProxy, "Equals" IMATERIAL_PROXY_INTERFACE_VERSION );
-
-
-//-----------------------------------------------------------------------------
-// Get the fractional part of a var
-//-----------------------------------------------------------------------------
-
-class CFracProxy : public CFunctionProxy
-{
-public:
- void OnBind( void *pC_BaseEntity );
-};
-
-
-void CFracProxy::OnBind( void *pC_BaseEntity )
-{
- Assert( m_pSrc1 && m_pResult );
-
- MaterialVarType_t resultType;
- int vecSize;
- ComputeResultType( resultType, vecSize );
-
- switch( resultType )
- {
- case MATERIAL_VAR_TYPE_VECTOR:
- {
- Vector a;
- m_pSrc1->GetVecValue( a.Base(), vecSize );
- a[0] -= ( float )( int )a[0];
- a[1] -= ( float )( int )a[1];
- a[2] -= ( float )( int )a[2];
- m_pResult->SetVecValue( a.Base(), vecSize );
- }
- break;
-
- case MATERIAL_VAR_TYPE_FLOAT:
- {
- float a = m_pSrc1->GetFloatValue();
- a -= ( int )a;
- SetFloatResult( a );
- }
- break;
-
- case MATERIAL_VAR_TYPE_INT:
- // don't do anything besides assignment!
- m_pResult->SetIntValue( m_pSrc1->GetIntValue() );
- break;
- }
-
- if ( ToolsEnabled() )
- {
- ToolFramework_RecordMaterialParams( GetMaterial() );
- }
-}
-
-
-EXPOSE_INTERFACE( CFracProxy, IMaterialProxy, "Frac" IMATERIAL_PROXY_INTERFACE_VERSION );
-
-//-----------------------------------------------------------------------------
-// Get the Integer part of a var
-//-----------------------------------------------------------------------------
-
-class CIntProxy : public CFunctionProxy
-{
-public:
- void OnBind( void *pC_BaseEntity );
-};
-
-void CIntProxy::OnBind( void *pC_BaseEntity )
-{
- Assert( m_pSrc1 && m_pResult );
-
- MaterialVarType_t resultType;
- int vecSize;
- ComputeResultType( resultType, vecSize );
-
- switch( resultType )
- {
- case MATERIAL_VAR_TYPE_VECTOR:
- {
- Vector a;
- m_pSrc1->GetVecValue( a.Base(), vecSize );
- a[0] = ( float )( int )a[0];
- a[1] = ( float )( int )a[1];
- a[2] = ( float )( int )a[2];
- m_pResult->SetVecValue( a.Base(), vecSize );
- }
- break;
-
- case MATERIAL_VAR_TYPE_FLOAT:
- {
- float a = m_pSrc1->GetFloatValue();
- a = ( float )( int )a;
- SetFloatResult( a );
- }
- break;
-
- case MATERIAL_VAR_TYPE_INT:
- // don't do anything besides assignment!
- m_pResult->SetIntValue( m_pSrc1->GetIntValue() );
- break;
- }
-
- if ( ToolsEnabled() )
- {
- ToolFramework_RecordMaterialParams( GetMaterial() );
- }
-}
-
-EXPOSE_INTERFACE( CIntProxy, IMaterialProxy, "Int" IMATERIAL_PROXY_INTERFACE_VERSION );
-
-//-----------------------------------------------------------------------------
-// Linear ramp proxy
-//-----------------------------------------------------------------------------
-class CLinearRampProxy : public CResultProxy
-{
-public:
- virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues );
- virtual void OnBind( void *pC_BaseEntity );
-
-private:
- CFloatInput m_Rate;
- CFloatInput m_InitialValue;
-};
-
-
-bool CLinearRampProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
-{
- if (!CResultProxy::Init( pMaterial, pKeyValues ))
- return false;
-
- if (!m_Rate.Init( pMaterial, pKeyValues, "rate", 1 ))
- return false;
-
- if (!m_InitialValue.Init( pMaterial, pKeyValues, "initialValue", 0 ))
- return false;
-
- return true;
-}
-
-void CLinearRampProxy::OnBind( void *pC_BaseEntity )
-{
- Assert( m_pResult );
-
- float flValue;
-
- // get a value in [0,1]
- flValue = m_Rate.GetFloat() * gpGlobals->curtime + m_InitialValue.GetFloat();
- SetFloatResult( flValue );
-
- if ( ToolsEnabled() )
- {
- ToolFramework_RecordMaterialParams( GetMaterial() );
- }
-}
-
-
-
-EXPOSE_INTERFACE( CLinearRampProxy, IMaterialProxy, "LinearRamp" IMATERIAL_PROXY_INTERFACE_VERSION );
-
-
-//-----------------------------------------------------------------------------
-// Uniform noise proxy
-//-----------------------------------------------------------------------------
-class CUniformNoiseProxy : public CResultProxy
-{
-public:
- virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues );
- virtual void OnBind( void *pC_BaseEntity );
-
-private:
- CFloatInput m_flMinVal;
- CFloatInput m_flMaxVal;
-};
-
-
-bool CUniformNoiseProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
-{
- if (!CResultProxy::Init( pMaterial, pKeyValues ))
- return false;
-
- if (!m_flMinVal.Init( pMaterial, pKeyValues, "minVal", 0 ))
- return false;
-
- if (!m_flMaxVal.Init( pMaterial, pKeyValues, "maxVal", 1 ))
- return false;
-
- return true;
-}
-
-void CUniformNoiseProxy::OnBind( void *pC_BaseEntity )
-{
- SetFloatResult( random->RandomFloat( m_flMinVal.GetFloat(), m_flMaxVal.GetFloat() ) );
-
- if ( ToolsEnabled() )
- {
- ToolFramework_RecordMaterialParams( GetMaterial() );
- }
-}
-
-
-EXPOSE_INTERFACE( CUniformNoiseProxy, IMaterialProxy, "UniformNoise" IMATERIAL_PROXY_INTERFACE_VERSION );
-
-
-//-----------------------------------------------------------------------------
-// Gaussian noise proxy
-//-----------------------------------------------------------------------------
-class CGaussianNoiseProxy : public CResultProxy
-{
-public:
- virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues );
- virtual void OnBind( void *pC_BaseEntity );
-
-private:
- CFloatInput m_Mean;
- CFloatInput m_StdDev;
- CFloatInput m_flMinVal;
- CFloatInput m_flMaxVal;
-};
-
-
-bool CGaussianNoiseProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
-{
- if (!CResultProxy::Init( pMaterial, pKeyValues ))
- return false;
-
- if (!m_Mean.Init( pMaterial, pKeyValues, "mean", 0.0f ))
- return false;
-
- if (!m_StdDev.Init( pMaterial, pKeyValues, "halfwidth", 1.0f ))
- return false;
-
- if (!m_flMinVal.Init( pMaterial, pKeyValues, "minVal", -FLT_MAX ))
- return false;
-
- if (!m_flMaxVal.Init( pMaterial, pKeyValues, "maxVal", FLT_MAX ))
- return false;
-
- return true;
-}
-
-void CGaussianNoiseProxy::OnBind( void *pC_BaseEntity )
-{
- float flMean = m_Mean.GetFloat();
- float flStdDev = m_StdDev.GetFloat();
- float flVal = randomgaussian->RandomFloat( flMean, flStdDev );
- float flMaxVal = m_flMaxVal.GetFloat();
- float flMinVal = m_flMinVal.GetFloat();
-
- if (flMinVal > flMaxVal)
- {
- float flTemp = flMinVal;
- flMinVal = flMaxVal;
- flMaxVal = flTemp;
- }
-
- // clamp
- if (flVal < flMinVal)
- flVal = flMinVal;
- else if ( flVal > flMaxVal )
- flVal = flMaxVal;
-
- SetFloatResult( flVal );
-
- if ( ToolsEnabled() )
- {
- ToolFramework_RecordMaterialParams( GetMaterial() );
- }
-}
-
-
-EXPOSE_INTERFACE( CGaussianNoiseProxy, IMaterialProxy, "GaussianNoise" IMATERIAL_PROXY_INTERFACE_VERSION );
-
-
-//-----------------------------------------------------------------------------
-// Exponential proxy
-//-----------------------------------------------------------------------------
-class CExponentialProxy : public CFunctionProxy
-{
-public:
- virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues );
- virtual void OnBind( void *pC_BaseEntity );
-
-private:
- CFloatInput m_Scale;
- CFloatInput m_Offset;
- CFloatInput m_flMinVal;
- CFloatInput m_flMaxVal;
-};
-
-
-bool CExponentialProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
-{
- if (!CFunctionProxy::Init( pMaterial, pKeyValues ))
- return false;
-
- if (!m_Scale.Init( pMaterial, pKeyValues, "scale", 1.0f ))
- return false;
-
- if (!m_Offset.Init( pMaterial, pKeyValues, "offset", 0.0f ))
- return false;
-
- if (!m_flMinVal.Init( pMaterial, pKeyValues, "minVal", -FLT_MAX ))
- return false;
-
- if (!m_flMaxVal.Init( pMaterial, pKeyValues, "maxVal", FLT_MAX ))
- return false;
-
- return true;
-}
-
-void CExponentialProxy::OnBind( void *pC_BaseEntity )
-{
- float flVal = m_Scale.GetFloat() * exp(m_pSrc1->GetFloatValue( ) + m_Offset.GetFloat());
-
- float flMaxVal = m_flMaxVal.GetFloat();
- float flMinVal = m_flMinVal.GetFloat();
-
- if (flMinVal > flMaxVal)
- {
- float flTemp = flMinVal;
- flMinVal = flMaxVal;
- flMaxVal = flTemp;
- }
-
- // clamp
- if (flVal < flMinVal)
- flVal = flMinVal;
- else if ( flVal > flMaxVal )
- flVal = flMaxVal;
-
- SetFloatResult( flVal );
-
- if ( ToolsEnabled() )
- {
- ToolFramework_RecordMaterialParams( GetMaterial() );
- }
-}
-
-
-EXPOSE_INTERFACE( CExponentialProxy, IMaterialProxy, "Exponential" IMATERIAL_PROXY_INTERFACE_VERSION );
-
-
-//-----------------------------------------------------------------------------
-// Absolute value proxy
-//-----------------------------------------------------------------------------
-class CAbsProxy : public CFunctionProxy
-{
-public:
- virtual void OnBind( void *pC_BaseEntity );
-};
-
-
-void CAbsProxy::OnBind( void *pC_BaseEntity )
-{
- SetFloatResult( fabs(m_pSrc1->GetFloatValue( )) );
-
- if ( ToolsEnabled() )
- {
- ToolFramework_RecordMaterialParams( GetMaterial() );
- }
-}
-
-
-EXPOSE_INTERFACE( CAbsProxy, IMaterialProxy, "Abs" IMATERIAL_PROXY_INTERFACE_VERSION );
-
-
-//-----------------------------------------------------------------------------
-// Empty proxy-- used to comment out large proxy blocks
-//-----------------------------------------------------------------------------
-class CEmptyProxy : public IMaterialProxy
-{
-public:
- CEmptyProxy() {}
- virtual ~CEmptyProxy() {}
- virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues ) { return true; }
- virtual void OnBind( void *pC_BaseEntity ) {}
- virtual void Release( void ) { delete this; }
- virtual IMaterial *GetMaterial() { return NULL; }
-};
-
-
-EXPOSE_INTERFACE( CEmptyProxy, IMaterialProxy, "Empty" IMATERIAL_PROXY_INTERFACE_VERSION );
-
-
-//-----------------------------------------------------------------------------
-// Comparison proxy
-//-----------------------------------------------------------------------------
-class CLessOrEqualProxy : public CFunctionProxy
-{
-public:
- bool Init( IMaterial *pMaterial, KeyValues *pKeyValues );
- void OnBind( void *pC_BaseEntity );
-
-private:
- IMaterialVar *m_pLessVar;
- IMaterialVar *m_pGreaterVar;
-};
-
-bool CLessOrEqualProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
-{
- char const* pLessEqualVar = pKeyValues->GetString( "lessEqualVar" );
- if( !pLessEqualVar )
- return false;
-
- bool foundVar;
- m_pLessVar = pMaterial->FindVar( pLessEqualVar, &foundVar, true );
- if( !foundVar )
- return false;
-
- char const* pGreaterVar = pKeyValues->GetString( "greaterVar" );
- if( !pGreaterVar )
- return false;
-
- foundVar;
- m_pGreaterVar = pMaterial->FindVar( pGreaterVar, &foundVar, true );
- if( !foundVar )
- return false;
-
- // Compare 2 args..
- bool ok = CFunctionProxy::Init( pMaterial, pKeyValues );
- ok = ok && m_pSrc2;
- return ok;
-}
-
-void CLessOrEqualProxy::OnBind( void *pC_BaseEntity )
-{
- Assert( m_pSrc1 && m_pSrc2 && m_pLessVar && m_pGreaterVar && m_pResult );
-
- IMaterialVar *pSourceVar;
- if (m_pSrc1->GetFloatValue() <= m_pSrc2->GetFloatValue())
- {
- pSourceVar = m_pLessVar;
- }
- else
- {
- pSourceVar = m_pGreaterVar;
- }
-
- int vecSize = 0;
- MaterialVarType_t resultType = m_pResult->GetType();
- if (resultType == MATERIAL_VAR_TYPE_VECTOR)
- {
- if (m_ResultVecComp >= 0)
- resultType = MATERIAL_VAR_TYPE_FLOAT;
- vecSize = m_pResult->VectorSize();
- }
- else if (resultType == MATERIAL_VAR_TYPE_UNDEFINED)
- {
- resultType = pSourceVar->GetType();
- if (resultType == MATERIAL_VAR_TYPE_VECTOR)
- {
- vecSize = pSourceVar->VectorSize();
- }
- }
-
- switch( resultType )
- {
- case MATERIAL_VAR_TYPE_VECTOR:
- {
- Vector src;
- pSourceVar->GetVecValue( src.Base(), vecSize );
- m_pResult->SetVecValue( src.Base(), vecSize );
- }
- break;
-
- case MATERIAL_VAR_TYPE_FLOAT:
- SetFloatResult( pSourceVar->GetFloatValue() );
- break;
-
- case MATERIAL_VAR_TYPE_INT:
- m_pResult->SetFloatValue( pSourceVar->GetIntValue() );
- break;
- }
-
- if ( ToolsEnabled() )
- {
- ToolFramework_RecordMaterialParams( GetMaterial() );
- }
-}
-
-EXPOSE_INTERFACE( CLessOrEqualProxy, IMaterialProxy, "LessOrEqual" IMATERIAL_PROXY_INTERFACE_VERSION );
-
-//-----------------------------------------------------------------------------
-// WrapMinMax proxy
-//-----------------------------------------------------------------------------
-class CWrapMinMaxProxy : public CFunctionProxy
-{
-public:
- virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues );
- virtual void OnBind( void *pC_BaseEntity );
-
-private:
- CFloatInput m_flMinVal;
- CFloatInput m_flMaxVal;
-};
-
-bool CWrapMinMaxProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
-{
- if (!CFunctionProxy::Init( pMaterial, pKeyValues ))
- return false;
-
- if (!m_flMinVal.Init( pMaterial, pKeyValues, "minVal", 0 ))
- return false;
-
- if (!m_flMaxVal.Init( pMaterial, pKeyValues, "maxVal", 1 ))
- return false;
-
- return true;
-}
-
-void CWrapMinMaxProxy::OnBind( void *pC_BaseEntity )
-{
- Assert( m_pSrc1 && m_pResult );
-
- if ( m_flMaxVal.GetFloat() <= m_flMinVal.GetFloat() ) // Bad input, just return the min
- {
- SetFloatResult( m_flMinVal.GetFloat() );
- }
- else
- {
- float flResult = ( m_pSrc1->GetFloatValue() - m_flMinVal.GetFloat() ) / ( m_flMaxVal.GetFloat() - m_flMinVal.GetFloat() );
-
- if ( flResult >= 0.0f )
- {
- flResult -= ( float )( int )flResult;
- }
- else // Negative
- {
- flResult -= ( float )( ( ( int )flResult ) - 1 );
- }
-
- flResult *= ( m_flMaxVal.GetFloat() - m_flMinVal.GetFloat() );
- flResult += m_flMinVal.GetFloat();
-
- SetFloatResult( flResult );
- }
-
- if ( ToolsEnabled() )
- {
- ToolFramework_RecordMaterialParams( GetMaterial() );
- }
-}
-
-EXPOSE_INTERFACE( CWrapMinMaxProxy, IMaterialProxy, "WrapMinMax" IMATERIAL_PROXY_INTERFACE_VERSION );
-
-
-//-----------------------------------------------------------------------------
-// Selects the first var value if it's non-zero, otherwise goes with the second
-//-----------------------------------------------------------------------------
-
-class CSelectFirstIfNonZeroProxy : public CFunctionProxy
-{
-public:
- bool Init( IMaterial *pMaterial, KeyValues *pKeyValues );
- void OnBind( void *pC_BaseEntity );
-};
-
-bool CSelectFirstIfNonZeroProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
-{
- // Requires 2 args..
- bool ok = CFunctionProxy::Init( pMaterial, pKeyValues );
- ok = ok && m_pSrc2;
- return ok;
-}
-
-void CSelectFirstIfNonZeroProxy::OnBind( void *pC_BaseEntity )
-{
- Assert( m_pSrc1 && m_pSrc2 && m_pResult );
-
- MaterialVarType_t resultType;
- int vecSize;
- ComputeResultType( resultType, vecSize );
-
- switch( resultType )
- {
- case MATERIAL_VAR_TYPE_VECTOR:
- {
- Vector a, b;
- m_pSrc1->GetVecValue( a.Base(), vecSize );
- m_pSrc2->GetVecValue( b.Base(), vecSize );
-
- if ( !a.IsZero() )
- {
- m_pResult->SetVecValue( a.Base(), vecSize );
- }
- else
- {
- m_pResult->SetVecValue( b.Base(), vecSize );
- }
- }
- break;
-
- case MATERIAL_VAR_TYPE_FLOAT:
- if ( m_pSrc1->GetFloatValue() )
- {
- SetFloatResult( m_pSrc1->GetFloatValue() );
- }
- else
- {
- SetFloatResult( m_pSrc2->GetFloatValue() );
- }
- break;
-
- case MATERIAL_VAR_TYPE_INT:
- if ( m_pSrc1->GetIntValue() )
- {
- m_pResult->SetFloatValue( m_pSrc1->GetIntValue() );
- }
- else
- {
- m_pResult->SetFloatValue( m_pSrc2->GetIntValue() );
- }
- break;
- }
-
- if ( ToolsEnabled() )
- {
- ToolFramework_RecordMaterialParams( GetMaterial() );
- }
-}
-
+//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// +#include "cbase.h" +#include "sharedInterface.h" +#include "materialsystem/imaterial.h" +#include <KeyValues.h> +#include "materialsystem/imaterialvar.h" +#include "functionproxy.h" +#include "toolframework_client.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +// forward declarations +void ToolFramework_RecordMaterialParams( IMaterial *pMaterial ); + +class C_BaseEntity; + +//----------------------------------------------------------------------------- +// Adds two vars... +//----------------------------------------------------------------------------- + +class CAddProxy : public CFunctionProxy +{ +public: + bool Init( IMaterial *pMaterial, KeyValues *pKeyValues ); + void OnBind( void *pC_BaseEntity ); +}; + +bool CAddProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues ) +{ + // Requires 2 args.. + bool ok = CFunctionProxy::Init( pMaterial, pKeyValues ); + ok = ok && m_pSrc2; + return ok; +} + +void CAddProxy::OnBind( void *pC_BaseEntity ) +{ + Assert( m_pSrc1 && m_pSrc2 && m_pResult ); + + MaterialVarType_t resultType; + int vecSize; + ComputeResultType( resultType, vecSize ); + + switch( resultType ) + { + case MATERIAL_VAR_TYPE_VECTOR: + { + Vector a, b, c; + m_pSrc1->GetVecValue( a.Base(), vecSize ); + m_pSrc2->GetVecValue( b.Base(), vecSize ); + VectorAdd( a, b, c ); + m_pResult->SetVecValue( c.Base(), vecSize ); + } + break; + + case MATERIAL_VAR_TYPE_FLOAT: + SetFloatResult( m_pSrc1->GetFloatValue() + m_pSrc2->GetFloatValue() ); + break; + + case MATERIAL_VAR_TYPE_INT: + m_pResult->SetFloatValue( m_pSrc1->GetIntValue() + m_pSrc2->GetIntValue() ); + break; + } + + if ( ToolsEnabled() ) + { + ToolFramework_RecordMaterialParams( GetMaterial() ); + } +} + +EXPOSE_INTERFACE( CAddProxy, IMaterialProxy, "Add" IMATERIAL_PROXY_INTERFACE_VERSION ); + + +//----------------------------------------------------------------------------- +// Subtracts two vars... +//----------------------------------------------------------------------------- + +class CSubtractProxy : public CFunctionProxy +{ +public: + bool Init( IMaterial *pMaterial, KeyValues *pKeyValues ); + void OnBind( void *pC_BaseEntity ); +}; + +bool CSubtractProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues ) +{ + // Requires 2 args.. + bool ok = CFunctionProxy::Init( pMaterial, pKeyValues ); + ok = ok && m_pSrc2; + return ok; +} + +void CSubtractProxy::OnBind( void *pC_BaseEntity ) +{ + Assert( m_pSrc1 && m_pSrc2 && m_pResult ); + + MaterialVarType_t resultType; + int vecSize; + ComputeResultType( resultType, vecSize ); + + switch( resultType ) + { + case MATERIAL_VAR_TYPE_VECTOR: + { + Vector a, b, c; + m_pSrc1->GetVecValue( a.Base(), vecSize ); + m_pSrc2->GetVecValue( b.Base(), vecSize ); + VectorSubtract( a, b, c ); + m_pResult->SetVecValue( c.Base(), vecSize ); + } + break; + + case MATERIAL_VAR_TYPE_FLOAT: + SetFloatResult( m_pSrc1->GetFloatValue() - m_pSrc2->GetFloatValue() ); + break; + + case MATERIAL_VAR_TYPE_INT: + m_pResult->SetFloatValue( m_pSrc1->GetIntValue() - m_pSrc2->GetIntValue() ); + break; + } + + if ( ToolsEnabled() ) + { + ToolFramework_RecordMaterialParams( GetMaterial() ); + } +} + +EXPOSE_INTERFACE( CSubtractProxy, IMaterialProxy, "Subtract" IMATERIAL_PROXY_INTERFACE_VERSION ); + + +//----------------------------------------------------------------------------- +// Multiplies two vars... +//----------------------------------------------------------------------------- + +class CMultiplyProxy : public CFunctionProxy +{ +public: + bool Init( IMaterial *pMaterial, KeyValues *pKeyValues ); + void OnBind( void *pC_BaseEntity ); +}; + +bool CMultiplyProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues ) +{ + // Requires 2 args.. + bool ok = CFunctionProxy::Init( pMaterial, pKeyValues ); + ok = ok && m_pSrc2; + return ok; +} + +void CMultiplyProxy::OnBind( void *pC_BaseEntity ) +{ + Assert( m_pSrc1 && m_pSrc2 && m_pResult ); + + MaterialVarType_t resultType; + int vecSize; + ComputeResultType( resultType, vecSize ); + + switch( resultType ) + { + case MATERIAL_VAR_TYPE_VECTOR: + { + Vector a, b, c; + m_pSrc1->GetVecValue( a.Base(), vecSize ); + m_pSrc2->GetVecValue( b.Base(), vecSize ); + VectorMultiply( a, b, c ); + m_pResult->SetVecValue( c.Base(), vecSize ); + } + break; + + case MATERIAL_VAR_TYPE_FLOAT: + SetFloatResult( m_pSrc1->GetFloatValue() * m_pSrc2->GetFloatValue() ); + break; + + case MATERIAL_VAR_TYPE_INT: + m_pResult->SetFloatValue( m_pSrc1->GetIntValue() * m_pSrc2->GetIntValue() ); + break; + } + + if ( ToolsEnabled() ) + { + ToolFramework_RecordMaterialParams( GetMaterial() ); + } +} + + +EXPOSE_INTERFACE( CMultiplyProxy, IMaterialProxy, "Multiply" IMATERIAL_PROXY_INTERFACE_VERSION ); + + +//----------------------------------------------------------------------------- +// divides two vars... +//----------------------------------------------------------------------------- + +class CDivideProxy : public CFunctionProxy +{ +public: + bool Init( IMaterial *pMaterial, KeyValues *pKeyValues ); + void OnBind( void *pC_BaseEntity ); +}; + +bool CDivideProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues ) +{ + // Requires 2 args.. + bool ok = CFunctionProxy::Init( pMaterial, pKeyValues ); + ok = ok && m_pSrc2; + return ok; +} + +void CDivideProxy::OnBind( void *pC_BaseEntity ) +{ + Assert( m_pSrc1 && m_pSrc2 && m_pResult ); + + MaterialVarType_t resultType; + int vecSize; + ComputeResultType( resultType, vecSize ); + + switch( resultType ) + { + case MATERIAL_VAR_TYPE_VECTOR: + { + Vector a, b, c; + m_pSrc1->GetVecValue( a.Base(), vecSize ); + m_pSrc2->GetVecValue( b.Base(), vecSize ); + VectorDivide( a, b, c ); + m_pResult->SetVecValue( c.Base(), vecSize ); + } + break; + + case MATERIAL_VAR_TYPE_FLOAT: + if (m_pSrc2->GetFloatValue() != 0) + { + SetFloatResult( m_pSrc1->GetFloatValue() / m_pSrc2->GetFloatValue() ); + } + else + { + SetFloatResult( m_pSrc1->GetFloatValue() ); + } + break; + + case MATERIAL_VAR_TYPE_INT: + if (m_pSrc2->GetIntValue() != 0) + { + m_pResult->SetFloatValue( m_pSrc1->GetIntValue() / m_pSrc2->GetIntValue() ); + } + else + { + m_pResult->SetFloatValue( m_pSrc1->GetIntValue() ); + } + break; + } + + if ( ToolsEnabled() ) + { + ToolFramework_RecordMaterialParams( GetMaterial() ); + } +} + +EXPOSE_INTERFACE( CDivideProxy, IMaterialProxy, "Divide" IMATERIAL_PROXY_INTERFACE_VERSION ); + +//----------------------------------------------------------------------------- +// clamps a var... +//----------------------------------------------------------------------------- + +class CClampProxy : public CFunctionProxy +{ +public: + bool Init( IMaterial *pMaterial, KeyValues *pKeyValues ); + void OnBind( void *pC_BaseEntity ); + +private: + CFloatInput m_Min; + CFloatInput m_Max; +}; + +bool CClampProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues ) +{ + if (!CFunctionProxy::Init( pMaterial, pKeyValues )) + return false; + + if (!m_Min.Init( pMaterial, pKeyValues, "min", 0 )) + return false; + + if (!m_Max.Init( pMaterial, pKeyValues, "max", 1 )) + return false; + + return true; +} + +void CClampProxy::OnBind( void *pC_BaseEntity ) +{ + Assert( m_pSrc1 && m_pResult ); + + MaterialVarType_t resultType; + int vecSize; + ComputeResultType( resultType, vecSize ); + + float flMin = m_Min.GetFloat(); + float flMax = m_Max.GetFloat(); + + if (flMin > flMax) + { + float flTemp = flMin; + flMin = flMax; + flMax = flTemp; + } + + switch( resultType ) + { + case MATERIAL_VAR_TYPE_VECTOR: + { + Vector a; + m_pSrc1->GetVecValue( a.Base(), vecSize ); + for (int i = 0; i < vecSize; ++i) + { + if (a[i] < flMin) + a[i] = flMin; + else if (a[i] > flMax) + a[i] = flMax; + } + m_pResult->SetVecValue( a.Base(), vecSize ); + } + break; + + case MATERIAL_VAR_TYPE_FLOAT: + { + float src = m_pSrc1->GetFloatValue(); + if (src < flMin) + src = flMin; + else if (src > flMax) + src = flMax; + SetFloatResult( src ); + } + break; + + case MATERIAL_VAR_TYPE_INT: + { + int src = m_pSrc1->GetIntValue(); + if (src < flMin) + src = flMin; + else if (src > flMax) + src = flMax; + m_pResult->SetIntValue( src ); + } + break; + } + + if ( ToolsEnabled() ) + { + ToolFramework_RecordMaterialParams( GetMaterial() ); + } +} + + +EXPOSE_INTERFACE( CClampProxy, IMaterialProxy, "Clamp" IMATERIAL_PROXY_INTERFACE_VERSION ); + +//----------------------------------------------------------------------------- +// Creates a sinusoid +//----------------------------------------------------------------------------- + +// sinePeriod: time that it takes to go through whole sine wave in seconds (default: 1.0f) +// sineMax : the max value for the sine wave (default: 1.0f ) +// sineMin: the min value for the sine wave (default: 0.0f ) +class CSineProxy : public CResultProxy +{ +public: + virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues ); + virtual void OnBind( void *pC_BaseEntity ); + +private: + CFloatInput m_SinePeriod; + CFloatInput m_SineMax; + CFloatInput m_SineMin; + CFloatInput m_SineTimeOffset; +}; + + +bool CSineProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues ) +{ + if (!CResultProxy::Init( pMaterial, pKeyValues )) + return false; + + if (!m_SinePeriod.Init( pMaterial, pKeyValues, "sinePeriod", 1.0f )) + return false; + if (!m_SineMax.Init( pMaterial, pKeyValues, "sineMax", 1.0f )) + return false; + if (!m_SineMin.Init( pMaterial, pKeyValues, "sineMin", 0.0f )) + return false; + if (!m_SineTimeOffset.Init( pMaterial, pKeyValues, "timeOffset", 0.0f )) + return false; + + return true; +} + +void CSineProxy::OnBind( void *pC_BaseEntity ) +{ + Assert( m_pResult ); + + float flValue; + float flSineTimeOffset = m_SineTimeOffset.GetFloat(); + float flSineMax = m_SineMax.GetFloat(); + float flSineMin = m_SineMin.GetFloat(); + float flSinePeriod = m_SinePeriod.GetFloat(); + if (flSinePeriod == 0) + flSinePeriod = 1; + + // get a value in [0,1] + flValue = ( sin( 2.0f * M_PI * (gpGlobals->curtime - flSineTimeOffset) / flSinePeriod ) * 0.5f ) + 0.5f; + // get a value in [min,max] + flValue = ( flSineMax - flSineMin ) * flValue + flSineMin; + + SetFloatResult( flValue ); + + if ( ToolsEnabled() ) + { + ToolFramework_RecordMaterialParams( GetMaterial() ); + } +} + +EXPOSE_INTERFACE( CSineProxy, IMaterialProxy, "Sine" IMATERIAL_PROXY_INTERFACE_VERSION ); + +//----------------------------------------------------------------------------- +// copies a var... +//----------------------------------------------------------------------------- + +class CEqualsProxy : public CFunctionProxy +{ +public: + void OnBind( void *pC_BaseEntity ); +}; + + +void CEqualsProxy::OnBind( void *pC_BaseEntity ) +{ + Assert( m_pSrc1 && m_pResult ); + + MaterialVarType_t resultType; + int vecSize; + ComputeResultType( resultType, vecSize ); + + switch( resultType ) + { + case MATERIAL_VAR_TYPE_VECTOR: + { + Vector a; + m_pSrc1->GetVecValue( a.Base(), vecSize ); + m_pResult->SetVecValue( a.Base(), vecSize ); + } + break; + + case MATERIAL_VAR_TYPE_FLOAT: + SetFloatResult( m_pSrc1->GetFloatValue() ); + break; + + case MATERIAL_VAR_TYPE_INT: + m_pResult->SetIntValue( m_pSrc1->GetIntValue() ); + break; + } + + if ( ToolsEnabled() ) + { + ToolFramework_RecordMaterialParams( GetMaterial() ); + } +} + + +EXPOSE_INTERFACE( CEqualsProxy, IMaterialProxy, "Equals" IMATERIAL_PROXY_INTERFACE_VERSION ); + + +//----------------------------------------------------------------------------- +// Get the fractional part of a var +//----------------------------------------------------------------------------- + +class CFracProxy : public CFunctionProxy +{ +public: + void OnBind( void *pC_BaseEntity ); +}; + + +void CFracProxy::OnBind( void *pC_BaseEntity ) +{ + Assert( m_pSrc1 && m_pResult ); + + MaterialVarType_t resultType; + int vecSize; + ComputeResultType( resultType, vecSize ); + + switch( resultType ) + { + case MATERIAL_VAR_TYPE_VECTOR: + { + Vector a; + m_pSrc1->GetVecValue( a.Base(), vecSize ); + a[0] -= ( float )( int )a[0]; + a[1] -= ( float )( int )a[1]; + a[2] -= ( float )( int )a[2]; + m_pResult->SetVecValue( a.Base(), vecSize ); + } + break; + + case MATERIAL_VAR_TYPE_FLOAT: + { + float a = m_pSrc1->GetFloatValue(); + a -= ( int )a; + SetFloatResult( a ); + } + break; + + case MATERIAL_VAR_TYPE_INT: + // don't do anything besides assignment! + m_pResult->SetIntValue( m_pSrc1->GetIntValue() ); + break; + } + + if ( ToolsEnabled() ) + { + ToolFramework_RecordMaterialParams( GetMaterial() ); + } +} + + +EXPOSE_INTERFACE( CFracProxy, IMaterialProxy, "Frac" IMATERIAL_PROXY_INTERFACE_VERSION ); + +//----------------------------------------------------------------------------- +// Get the Integer part of a var +//----------------------------------------------------------------------------- + +class CIntProxy : public CFunctionProxy +{ +public: + void OnBind( void *pC_BaseEntity ); +}; + +void CIntProxy::OnBind( void *pC_BaseEntity ) +{ + Assert( m_pSrc1 && m_pResult ); + + MaterialVarType_t resultType; + int vecSize; + ComputeResultType( resultType, vecSize ); + + switch( resultType ) + { + case MATERIAL_VAR_TYPE_VECTOR: + { + Vector a; + m_pSrc1->GetVecValue( a.Base(), vecSize ); + a[0] = ( float )( int )a[0]; + a[1] = ( float )( int )a[1]; + a[2] = ( float )( int )a[2]; + m_pResult->SetVecValue( a.Base(), vecSize ); + } + break; + + case MATERIAL_VAR_TYPE_FLOAT: + { + float a = m_pSrc1->GetFloatValue(); + a = ( float )( int )a; + SetFloatResult( a ); + } + break; + + case MATERIAL_VAR_TYPE_INT: + // don't do anything besides assignment! + m_pResult->SetIntValue( m_pSrc1->GetIntValue() ); + break; + } + + if ( ToolsEnabled() ) + { + ToolFramework_RecordMaterialParams( GetMaterial() ); + } +} + +EXPOSE_INTERFACE( CIntProxy, IMaterialProxy, "Int" IMATERIAL_PROXY_INTERFACE_VERSION ); + +//----------------------------------------------------------------------------- +// Linear ramp proxy +//----------------------------------------------------------------------------- +class CLinearRampProxy : public CResultProxy +{ +public: + virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues ); + virtual void OnBind( void *pC_BaseEntity ); + +private: + CFloatInput m_Rate; + CFloatInput m_InitialValue; +}; + + +bool CLinearRampProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues ) +{ + if (!CResultProxy::Init( pMaterial, pKeyValues )) + return false; + + if (!m_Rate.Init( pMaterial, pKeyValues, "rate", 1 )) + return false; + + if (!m_InitialValue.Init( pMaterial, pKeyValues, "initialValue", 0 )) + return false; + + return true; +} + +void CLinearRampProxy::OnBind( void *pC_BaseEntity ) +{ + Assert( m_pResult ); + + float flValue; + + // get a value in [0,1] + flValue = m_Rate.GetFloat() * gpGlobals->curtime + m_InitialValue.GetFloat(); + SetFloatResult( flValue ); + + if ( ToolsEnabled() ) + { + ToolFramework_RecordMaterialParams( GetMaterial() ); + } +} + + + +EXPOSE_INTERFACE( CLinearRampProxy, IMaterialProxy, "LinearRamp" IMATERIAL_PROXY_INTERFACE_VERSION ); + + +//----------------------------------------------------------------------------- +// Uniform noise proxy +//----------------------------------------------------------------------------- +class CUniformNoiseProxy : public CResultProxy +{ +public: + virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues ); + virtual void OnBind( void *pC_BaseEntity ); + +private: + CFloatInput m_flMinVal; + CFloatInput m_flMaxVal; +}; + + +bool CUniformNoiseProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues ) +{ + if (!CResultProxy::Init( pMaterial, pKeyValues )) + return false; + + if (!m_flMinVal.Init( pMaterial, pKeyValues, "minVal", 0 )) + return false; + + if (!m_flMaxVal.Init( pMaterial, pKeyValues, "maxVal", 1 )) + return false; + + return true; +} + +void CUniformNoiseProxy::OnBind( void *pC_BaseEntity ) +{ + SetFloatResult( random->RandomFloat( m_flMinVal.GetFloat(), m_flMaxVal.GetFloat() ) ); + + if ( ToolsEnabled() ) + { + ToolFramework_RecordMaterialParams( GetMaterial() ); + } +} + + +EXPOSE_INTERFACE( CUniformNoiseProxy, IMaterialProxy, "UniformNoise" IMATERIAL_PROXY_INTERFACE_VERSION ); + + +//----------------------------------------------------------------------------- +// Gaussian noise proxy +//----------------------------------------------------------------------------- +class CGaussianNoiseProxy : public CResultProxy +{ +public: + virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues ); + virtual void OnBind( void *pC_BaseEntity ); + +private: + CFloatInput m_Mean; + CFloatInput m_StdDev; + CFloatInput m_flMinVal; + CFloatInput m_flMaxVal; +}; + + +bool CGaussianNoiseProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues ) +{ + if (!CResultProxy::Init( pMaterial, pKeyValues )) + return false; + + if (!m_Mean.Init( pMaterial, pKeyValues, "mean", 0.0f )) + return false; + + if (!m_StdDev.Init( pMaterial, pKeyValues, "halfwidth", 1.0f )) + return false; + + if (!m_flMinVal.Init( pMaterial, pKeyValues, "minVal", -FLT_MAX )) + return false; + + if (!m_flMaxVal.Init( pMaterial, pKeyValues, "maxVal", FLT_MAX )) + return false; + + return true; +} + +void CGaussianNoiseProxy::OnBind( void *pC_BaseEntity ) +{ + float flMean = m_Mean.GetFloat(); + float flStdDev = m_StdDev.GetFloat(); + float flVal = randomgaussian->RandomFloat( flMean, flStdDev ); + float flMaxVal = m_flMaxVal.GetFloat(); + float flMinVal = m_flMinVal.GetFloat(); + + if (flMinVal > flMaxVal) + { + float flTemp = flMinVal; + flMinVal = flMaxVal; + flMaxVal = flTemp; + } + + // clamp + if (flVal < flMinVal) + flVal = flMinVal; + else if ( flVal > flMaxVal ) + flVal = flMaxVal; + + SetFloatResult( flVal ); + + if ( ToolsEnabled() ) + { + ToolFramework_RecordMaterialParams( GetMaterial() ); + } +} + + +EXPOSE_INTERFACE( CGaussianNoiseProxy, IMaterialProxy, "GaussianNoise" IMATERIAL_PROXY_INTERFACE_VERSION ); + + +//----------------------------------------------------------------------------- +// Exponential proxy +//----------------------------------------------------------------------------- +class CExponentialProxy : public CFunctionProxy +{ +public: + virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues ); + virtual void OnBind( void *pC_BaseEntity ); + +private: + CFloatInput m_Scale; + CFloatInput m_Offset; + CFloatInput m_flMinVal; + CFloatInput m_flMaxVal; +}; + + +bool CExponentialProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues ) +{ + if (!CFunctionProxy::Init( pMaterial, pKeyValues )) + return false; + + if (!m_Scale.Init( pMaterial, pKeyValues, "scale", 1.0f )) + return false; + + if (!m_Offset.Init( pMaterial, pKeyValues, "offset", 0.0f )) + return false; + + if (!m_flMinVal.Init( pMaterial, pKeyValues, "minVal", -FLT_MAX )) + return false; + + if (!m_flMaxVal.Init( pMaterial, pKeyValues, "maxVal", FLT_MAX )) + return false; + + return true; +} + +void CExponentialProxy::OnBind( void *pC_BaseEntity ) +{ + float flVal = m_Scale.GetFloat() * exp(m_pSrc1->GetFloatValue( ) + m_Offset.GetFloat()); + + float flMaxVal = m_flMaxVal.GetFloat(); + float flMinVal = m_flMinVal.GetFloat(); + + if (flMinVal > flMaxVal) + { + float flTemp = flMinVal; + flMinVal = flMaxVal; + flMaxVal = flTemp; + } + + // clamp + if (flVal < flMinVal) + flVal = flMinVal; + else if ( flVal > flMaxVal ) + flVal = flMaxVal; + + SetFloatResult( flVal ); + + if ( ToolsEnabled() ) + { + ToolFramework_RecordMaterialParams( GetMaterial() ); + } +} + + +EXPOSE_INTERFACE( CExponentialProxy, IMaterialProxy, "Exponential" IMATERIAL_PROXY_INTERFACE_VERSION ); + + +//----------------------------------------------------------------------------- +// Absolute value proxy +//----------------------------------------------------------------------------- +class CAbsProxy : public CFunctionProxy +{ +public: + virtual void OnBind( void *pC_BaseEntity ); +}; + + +void CAbsProxy::OnBind( void *pC_BaseEntity ) +{ + SetFloatResult( fabs(m_pSrc1->GetFloatValue( )) ); + + if ( ToolsEnabled() ) + { + ToolFramework_RecordMaterialParams( GetMaterial() ); + } +} + + +EXPOSE_INTERFACE( CAbsProxy, IMaterialProxy, "Abs" IMATERIAL_PROXY_INTERFACE_VERSION ); + + +//----------------------------------------------------------------------------- +// Empty proxy-- used to comment out large proxy blocks +//----------------------------------------------------------------------------- +class CEmptyProxy : public IMaterialProxy +{ +public: + CEmptyProxy() {} + virtual ~CEmptyProxy() {} + virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues ) { return true; } + virtual void OnBind( void *pC_BaseEntity ) {} + virtual void Release( void ) { delete this; } + virtual IMaterial *GetMaterial() { return NULL; } +}; + + +EXPOSE_INTERFACE( CEmptyProxy, IMaterialProxy, "Empty" IMATERIAL_PROXY_INTERFACE_VERSION ); + + +//----------------------------------------------------------------------------- +// Comparison proxy +//----------------------------------------------------------------------------- +class CLessOrEqualProxy : public CFunctionProxy +{ +public: + bool Init( IMaterial *pMaterial, KeyValues *pKeyValues ); + void OnBind( void *pC_BaseEntity ); + +private: + IMaterialVar *m_pLessVar; + IMaterialVar *m_pGreaterVar; +}; + +bool CLessOrEqualProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues ) +{ + char const* pLessEqualVar = pKeyValues->GetString( "lessEqualVar" ); + if( !pLessEqualVar ) + return false; + + bool foundVar; + m_pLessVar = pMaterial->FindVar( pLessEqualVar, &foundVar, true ); + if( !foundVar ) + return false; + + char const* pGreaterVar = pKeyValues->GetString( "greaterVar" ); + if( !pGreaterVar ) + return false; + + foundVar; + m_pGreaterVar = pMaterial->FindVar( pGreaterVar, &foundVar, true ); + if( !foundVar ) + return false; + + // Compare 2 args.. + bool ok = CFunctionProxy::Init( pMaterial, pKeyValues ); + ok = ok && m_pSrc2; + return ok; +} + +void CLessOrEqualProxy::OnBind( void *pC_BaseEntity ) +{ + Assert( m_pSrc1 && m_pSrc2 && m_pLessVar && m_pGreaterVar && m_pResult ); + + IMaterialVar *pSourceVar; + if (m_pSrc1->GetFloatValue() <= m_pSrc2->GetFloatValue()) + { + pSourceVar = m_pLessVar; + } + else + { + pSourceVar = m_pGreaterVar; + } + + int vecSize = 0; + MaterialVarType_t resultType = m_pResult->GetType(); + if (resultType == MATERIAL_VAR_TYPE_VECTOR) + { + if (m_ResultVecComp >= 0) + resultType = MATERIAL_VAR_TYPE_FLOAT; + vecSize = m_pResult->VectorSize(); + } + else if (resultType == MATERIAL_VAR_TYPE_UNDEFINED) + { + resultType = pSourceVar->GetType(); + if (resultType == MATERIAL_VAR_TYPE_VECTOR) + { + vecSize = pSourceVar->VectorSize(); + } + } + + switch( resultType ) + { + case MATERIAL_VAR_TYPE_VECTOR: + { + Vector src; + pSourceVar->GetVecValue( src.Base(), vecSize ); + m_pResult->SetVecValue( src.Base(), vecSize ); + } + break; + + case MATERIAL_VAR_TYPE_FLOAT: + SetFloatResult( pSourceVar->GetFloatValue() ); + break; + + case MATERIAL_VAR_TYPE_INT: + m_pResult->SetFloatValue( pSourceVar->GetIntValue() ); + break; + } + + if ( ToolsEnabled() ) + { + ToolFramework_RecordMaterialParams( GetMaterial() ); + } +} + +EXPOSE_INTERFACE( CLessOrEqualProxy, IMaterialProxy, "LessOrEqual" IMATERIAL_PROXY_INTERFACE_VERSION ); + +//----------------------------------------------------------------------------- +// WrapMinMax proxy +//----------------------------------------------------------------------------- +class CWrapMinMaxProxy : public CFunctionProxy +{ +public: + virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues ); + virtual void OnBind( void *pC_BaseEntity ); + +private: + CFloatInput m_flMinVal; + CFloatInput m_flMaxVal; +}; + +bool CWrapMinMaxProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues ) +{ + if (!CFunctionProxy::Init( pMaterial, pKeyValues )) + return false; + + if (!m_flMinVal.Init( pMaterial, pKeyValues, "minVal", 0 )) + return false; + + if (!m_flMaxVal.Init( pMaterial, pKeyValues, "maxVal", 1 )) + return false; + + return true; +} + +void CWrapMinMaxProxy::OnBind( void *pC_BaseEntity ) +{ + Assert( m_pSrc1 && m_pResult ); + + if ( m_flMaxVal.GetFloat() <= m_flMinVal.GetFloat() ) // Bad input, just return the min + { + SetFloatResult( m_flMinVal.GetFloat() ); + } + else + { + float flResult = ( m_pSrc1->GetFloatValue() - m_flMinVal.GetFloat() ) / ( m_flMaxVal.GetFloat() - m_flMinVal.GetFloat() ); + + if ( flResult >= 0.0f ) + { + flResult -= ( float )( int )flResult; + } + else // Negative + { + flResult -= ( float )( ( ( int )flResult ) - 1 ); + } + + flResult *= ( m_flMaxVal.GetFloat() - m_flMinVal.GetFloat() ); + flResult += m_flMinVal.GetFloat(); + + SetFloatResult( flResult ); + } + + if ( ToolsEnabled() ) + { + ToolFramework_RecordMaterialParams( GetMaterial() ); + } +} + +EXPOSE_INTERFACE( CWrapMinMaxProxy, IMaterialProxy, "WrapMinMax" IMATERIAL_PROXY_INTERFACE_VERSION ); + + +//----------------------------------------------------------------------------- +// Selects the first var value if it's non-zero, otherwise goes with the second +//----------------------------------------------------------------------------- + +class CSelectFirstIfNonZeroProxy : public CFunctionProxy +{ +public: + bool Init( IMaterial *pMaterial, KeyValues *pKeyValues ); + void OnBind( void *pC_BaseEntity ); +}; + +bool CSelectFirstIfNonZeroProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues ) +{ + // Requires 2 args.. + bool ok = CFunctionProxy::Init( pMaterial, pKeyValues ); + ok = ok && m_pSrc2; + return ok; +} + +void CSelectFirstIfNonZeroProxy::OnBind( void *pC_BaseEntity ) +{ + Assert( m_pSrc1 && m_pSrc2 && m_pResult ); + + MaterialVarType_t resultType; + int vecSize; + ComputeResultType( resultType, vecSize ); + + switch( resultType ) + { + case MATERIAL_VAR_TYPE_VECTOR: + { + Vector a, b; + m_pSrc1->GetVecValue( a.Base(), vecSize ); + m_pSrc2->GetVecValue( b.Base(), vecSize ); + + if ( !a.IsZero() ) + { + m_pResult->SetVecValue( a.Base(), vecSize ); + } + else + { + m_pResult->SetVecValue( b.Base(), vecSize ); + } + } + break; + + case MATERIAL_VAR_TYPE_FLOAT: + if ( m_pSrc1->GetFloatValue() ) + { + SetFloatResult( m_pSrc1->GetFloatValue() ); + } + else + { + SetFloatResult( m_pSrc2->GetFloatValue() ); + } + break; + + case MATERIAL_VAR_TYPE_INT: + if ( m_pSrc1->GetIntValue() ) + { + m_pResult->SetFloatValue( m_pSrc1->GetIntValue() ); + } + else + { + m_pResult->SetFloatValue( m_pSrc2->GetIntValue() ); + } + break; + } + + if ( ToolsEnabled() ) + { + ToolFramework_RecordMaterialParams( GetMaterial() ); + } +} + EXPOSE_INTERFACE( CSelectFirstIfNonZeroProxy, IMaterialProxy, "SelectFirstIfNonZero" IMATERIAL_PROXY_INTERFACE_VERSION );
\ No newline at end of file |