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.
107 lines
3.0 KiB
107 lines
3.0 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// The expression operator class - scalar math calculator
|
||
|
// for a good list of operators and simple functions, see:
|
||
|
// \\fileserver\user\MarcS\boxweb\aliveDistLite\v4.2.0\doc\alive\functions.txt
|
||
|
// (although we'll want to implement elerp as the standard 3x^2 - 2x^3 with rescale)
|
||
|
//
|
||
|
//=============================================================================
|
||
|
|
||
|
#ifndef DMEEXPRESSIONOPERATOR_H
|
||
|
#define DMEEXPRESSIONOPERATOR_H
|
||
|
#ifdef _WIN32
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#include "movieobjects/dmeoperator.h"
|
||
|
#include "tier1/utlstack.h" // for calculator
|
||
|
#include "tier1/utlvector.h" // for calculator
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Calculator Parsing class
|
||
|
// precedence order:
|
||
|
// unary operators: + - ! func var
|
||
|
// * / %
|
||
|
// + -
|
||
|
// < > <= >=
|
||
|
// == !=
|
||
|
// &&
|
||
|
// ||
|
||
|
// ?:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CExpressionCalculator
|
||
|
{
|
||
|
public:
|
||
|
CExpressionCalculator( const char *expr = NULL ) : m_expr( expr ) {}
|
||
|
void SetExpression( const char *expr )
|
||
|
{
|
||
|
m_expr = expr;
|
||
|
}
|
||
|
|
||
|
void SetVariable( const char *var, float value );
|
||
|
void SetVariable( int nVariableIndex, float value );
|
||
|
int FindVariableIndex( const char *var );
|
||
|
|
||
|
bool Evaluate( float &value );
|
||
|
|
||
|
// Builds a list of variable names from the expression
|
||
|
bool BuildVariableListFromExpression( );
|
||
|
|
||
|
// Iterate over variables
|
||
|
int VariableCount();
|
||
|
const char *VariableName( int nIndex );
|
||
|
|
||
|
private:
|
||
|
bool ParseExpr ( const char *&expr );
|
||
|
bool ParseConditional( const char *&expr );
|
||
|
bool ParseOr ( const char *&expr );
|
||
|
bool ParseAnd ( const char *&expr );
|
||
|
bool ParseEquality ( const char *&expr );
|
||
|
bool ParseLessGreater( const char *&expr );
|
||
|
bool ParseAddSub ( const char *&expr );
|
||
|
bool ParseDivMul ( const char *&expr );
|
||
|
bool ParseUnary ( const char *&expr );
|
||
|
bool ParsePrimary ( const char *&expr );
|
||
|
bool Parse1ArgFunc ( const char *&expr );
|
||
|
bool Parse2ArgFunc ( const char *&expr );
|
||
|
bool Parse3ArgFunc ( const char *&expr );
|
||
|
// bool Parse4ArgFunc ( const char *&expr );
|
||
|
bool Parse5ArgFunc ( const char *&expr );
|
||
|
|
||
|
CUtlString m_expr;
|
||
|
CUtlVector< CUtlString > m_varNames;
|
||
|
CUtlVector<float> m_varValues;
|
||
|
CUtlStack<float> m_stack;
|
||
|
bool m_bIsBuildingArgumentList;
|
||
|
};
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// An operator which computes the value of expressions
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CDmeExpressionOperator : public CDmeOperator
|
||
|
{
|
||
|
DEFINE_ELEMENT( CDmeExpressionOperator, CDmeOperator );
|
||
|
|
||
|
public:
|
||
|
virtual void Operate();
|
||
|
|
||
|
virtual void GetInputAttributes ( CUtlVector< CDmAttribute * > &attrs );
|
||
|
virtual void GetOutputAttributes( CUtlVector< CDmAttribute * > &attrs );
|
||
|
|
||
|
void SetSpewResult( bool state );
|
||
|
|
||
|
protected:
|
||
|
bool Parse( const char *expr );
|
||
|
|
||
|
bool IsInputAttribute( CDmAttribute *pAttribute );
|
||
|
|
||
|
CDmaVar< float > m_result;
|
||
|
CDmaString m_expr;
|
||
|
CDmaVar< bool > m_bSpewResult;
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif // DMEEXPRESSIONOPERATOR_H
|