Skip to content

Commit

Permalink
Implement ValveSoftware#315
Browse files Browse the repository at this point in the history
  • Loading branch information
Bitl committed Feb 22, 2025
1 parent 5d163f4 commit f775ead
Show file tree
Hide file tree
Showing 3 changed files with 152 additions and 5 deletions.
80 changes: 80 additions & 0 deletions src/game/client/functionproxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,53 @@
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"

#ifdef BDSBASE
// Get the named material variable and the vector component, if applicable.
static bool GetMaterialVariable(IMaterial* pMaterial, const char* pVarName,
IMaterialVar*& pMaterialVar, int& vecComp)
{
// Look for array specification...
char pTemp[256];
if (strchr(pVarName, '['))
{
// strip off the array...
Q_strncpy(pTemp, pVarName, 256);
char* pArray = strchr(pTemp, '[');
*pArray++ = 0;

char* pIEnd;
vecComp = strtol(pArray, &pIEnd, 10);

// Use the version without the array...
pVarName = pTemp;
}
else
{
vecComp = -1;
}

bool foundVar;
pMaterialVar = pMaterial->FindVar(pVarName, &foundVar, true);
return foundVar;
}

// Return the material's float value if vecComp is < 0, otherwise
// return the given component of the material's vector.
static float GetMaterialFloat(const IMaterialVar& material, int vecComp)
{
if (vecComp < 0)
return material.GetFloatValue();

int iVecSize = material.VectorSize();
if (vecComp >= iVecSize)
return 0;

float v[4];
material.GetVecValue(v, iVecSize);
return v[vecComp];
}
#endif

//-----------------------------------------------------------------------------
// Helper class to deal with floating point inputs
//-----------------------------------------------------------------------------
Expand All @@ -36,6 +83,9 @@ bool CFloatInput::Init( IMaterial *pMaterial, KeyValues *pKeyValues, const char
return true;
}

#ifdef BDSBASE
return GetMaterialVariable(pMaterial, pVarName, m_pFloatVar, m_FloatVecComp);
#else
// Look for array specification...
char pTemp[256];
if (strchr(pVarName, '['))
Expand All @@ -60,6 +110,8 @@ bool CFloatInput::Init( IMaterial *pMaterial, KeyValues *pKeyValues, const char
m_pFloatVar = pMaterial->FindVar( pVarName, &bFoundVar, true );
if (!bFoundVar)
return false;

#endif
}
else
{
Expand Down Expand Up @@ -109,6 +161,13 @@ CResultProxy::~CResultProxy()

bool CResultProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
{
#ifdef BDSBASE
char const* pVarName = pKeyValues->GetString("resultVar");
if (!pVarName)
return false;

return GetMaterialVariable(pMaterial, pVarName, m_pResult, m_ResultVecComp);
#else
char const* pResult = pKeyValues->GetString( "resultVar" );
if( !pResult )
return false;
Expand Down Expand Up @@ -139,6 +198,7 @@ bool CResultProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
return false;

return true;
#endif
}


Expand Down Expand Up @@ -206,16 +266,24 @@ bool CFunctionProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
if( !pSrcVar1 )
return false;

#ifdef BDSBASE
bool foundVar = GetMaterialVariable(pMaterial, pSrcVar1, m_pSrc1, m_Src1VecComp);
#else
bool foundVar;
m_pSrc1 = pMaterial->FindVar( pSrcVar1, &foundVar, true );
#endif
if( !foundVar )
return false;

// Source 2 is optional, some math ops may be single-input
char const* pSrcVar2 = pKeyValues->GetString( "srcVar2" );
if( pSrcVar2 && (*pSrcVar2) )
{
#ifdef BDSBASE
foundVar = GetMaterialVariable(pMaterial, pSrcVar2, m_pSrc2, m_Src2VecComp);
#else
m_pSrc2 = pMaterial->FindVar( pSrcVar2, &foundVar, true );
#endif
if( !foundVar )
return false;
}
Expand Down Expand Up @@ -257,3 +325,15 @@ void CFunctionProxy::ComputeResultType( MaterialVarType_t& resultType, int& vecS
}
}

#ifdef BDSBASE
float CFunctionProxy::GetSrc1Float() const
{
return GetMaterialFloat(*m_pSrc1, m_Src1VecComp);
}

float CFunctionProxy::GetSrc2Float() const
{
return GetMaterialFloat(*m_pSrc2, m_Src2VecComp);
}
#endif

8 changes: 8 additions & 0 deletions src/game/client/functionproxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,17 @@ class CFunctionProxy : public CResultProxy

protected:
void ComputeResultType( MaterialVarType_t& resultType, int& vecSize );
#ifdef BDSBASE
float GetSrc1Float() const;
float GetSrc2Float() const;
#endif

IMaterialVar* m_pSrc1;
IMaterialVar* m_pSrc2;
#ifdef BDSBASE
int m_Src1VecComp;
int m_Src2VecComp;
#endif
};

#endif // FUNCTIONPROXY_H
Expand Down
69 changes: 64 additions & 5 deletions src/game/client/mathproxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,11 @@ void CAddProxy::OnBind( void *pC_BaseEntity )
break;

case MATERIAL_VAR_TYPE_FLOAT:
#ifdef BDSBASE
SetFloatResult(GetSrc1Float() + GetSrc2Float());
#else
SetFloatResult( m_pSrc1->GetFloatValue() + m_pSrc2->GetFloatValue() );
#endif
break;

case MATERIAL_VAR_TYPE_INT:
Expand Down Expand Up @@ -117,7 +121,11 @@ void CSubtractProxy::OnBind( void *pC_BaseEntity )
break;

case MATERIAL_VAR_TYPE_FLOAT:
SetFloatResult( m_pSrc1->GetFloatValue() - m_pSrc2->GetFloatValue() );
#ifdef BDSBASE
SetFloatResult(GetSrc1Float() - GetSrc2Float());
#else
SetFloatResult(m_pSrc1->GetFloatValue() - m_pSrc2->GetFloatValue());
#endif
break;

case MATERIAL_VAR_TYPE_INT:
Expand Down Expand Up @@ -174,7 +182,11 @@ void CMultiplyProxy::OnBind( void *pC_BaseEntity )
break;

case MATERIAL_VAR_TYPE_FLOAT:
SetFloatResult( m_pSrc1->GetFloatValue() * m_pSrc2->GetFloatValue() );
#ifdef BDSBASE
SetFloatResult(GetSrc1Float() * GetSrc2Float());
#else
SetFloatResult(m_pSrc1->GetFloatValue() * m_pSrc2->GetFloatValue());
#endif
break;

case MATERIAL_VAR_TYPE_INT:
Expand Down Expand Up @@ -232,14 +244,25 @@ void CDivideProxy::OnBind( void *pC_BaseEntity )
break;

case MATERIAL_VAR_TYPE_FLOAT:
#ifdef BDSBASE
if (GetSrc2Float() != 0)
{
SetFloatResult(GetSrc1Float() / GetSrc2Float());
}
else
{
SetFloatResult(GetSrc1Float());
}
#else
if (m_pSrc2->GetFloatValue() != 0)
{
SetFloatResult( m_pSrc1->GetFloatValue() / m_pSrc2->GetFloatValue() );
SetFloatResult(m_pSrc1->GetFloatValue() / m_pSrc2->GetFloatValue());
}
else
{
SetFloatResult( m_pSrc1->GetFloatValue() );
SetFloatResult(m_pSrc1->GetFloatValue());
}
#endif
break;

case MATERIAL_VAR_TYPE_INT:
Expand Down Expand Up @@ -328,7 +351,12 @@ void CClampProxy::OnBind( void *pC_BaseEntity )

case MATERIAL_VAR_TYPE_FLOAT:
{
#ifdef BDSBASE
float src = GetSrc1Float();
#else
float src = m_pSrc1->GetFloatValue();
#endif

if (src < flMin)
src = flMin;
else if (src > flMax)
Expand Down Expand Up @@ -453,7 +481,11 @@ void CEqualsProxy::OnBind( void *pC_BaseEntity )
break;

case MATERIAL_VAR_TYPE_FLOAT:
SetFloatResult( m_pSrc1->GetFloatValue() );
#ifdef BDSBASE
SetFloatResult(GetSrc1Float());
#else
SetFloatResult(m_pSrc1->GetFloatValue());
#endif
break;

case MATERIAL_VAR_TYPE_INT:
Expand Down Expand Up @@ -505,7 +537,11 @@ void CFracProxy::OnBind( void *pC_BaseEntity )

case MATERIAL_VAR_TYPE_FLOAT:
{
#ifdef BDSBASE
float a = GetSrc1Float();
#else
float a = m_pSrc1->GetFloatValue();
#endif
a -= ( int )a;
SetFloatResult( a );
}
Expand Down Expand Up @@ -559,7 +595,11 @@ void CIntProxy::OnBind( void *pC_BaseEntity )

case MATERIAL_VAR_TYPE_FLOAT:
{
#ifdef BDSBASE
float a = GetSrc1Float();
#else
float a = m_pSrc1->GetFloatValue();
#endif
a = ( float )( int )a;
SetFloatResult( a );
}
Expand Down Expand Up @@ -898,7 +938,11 @@ void CLessOrEqualProxy::OnBind( void *pC_BaseEntity )
Assert( m_pSrc1 && m_pSrc2 && m_pLessVar && m_pGreaterVar && m_pResult );

IMaterialVar *pSourceVar;
#ifdef BDSBASE
if (GetSrc1Float() <= GetSrc2Float())
#else
if (m_pSrc1->GetFloatValue() <= m_pSrc2->GetFloatValue())
#endif
{
pSourceVar = m_pLessVar;
}
Expand Down Expand Up @@ -989,7 +1033,11 @@ void CWrapMinMaxProxy::OnBind( void *pC_BaseEntity )
}
else
{
#ifdef BDSBASE
float flResult = (GetSrc1Float() - m_flMinVal.GetFloat()) / (m_flMaxVal.GetFloat() - m_flMinVal.GetFloat());
#else
float flResult = ( m_pSrc1->GetFloatValue() - m_flMinVal.GetFloat() ) / ( m_flMaxVal.GetFloat() - m_flMinVal.GetFloat() );
#endif

if ( flResult >= 0.0f )
{
Expand Down Expand Up @@ -1062,6 +1110,16 @@ void CSelectFirstIfNonZeroProxy::OnBind( void *pC_BaseEntity )
break;

case MATERIAL_VAR_TYPE_FLOAT:
#ifdef BDSBASE
if (GetSrc1Float())
{
SetFloatResult(GetSrc1Float());
}
else
{
SetFloatResult(GetSrc2Float());
}
#else
if ( m_pSrc1->GetFloatValue() )
{
SetFloatResult( m_pSrc1->GetFloatValue() );
Expand All @@ -1070,6 +1128,7 @@ void CSelectFirstIfNonZeroProxy::OnBind( void *pC_BaseEntity )
{
SetFloatResult( m_pSrc2->GetFloatValue() );
}
#endif
break;

case MATERIAL_VAR_TYPE_INT:
Expand Down

0 comments on commit f775ead

Please sign in to comment.