summaryrefslogtreecommitdiff
path: root/public/movieobjects/dmeexpressionoperator.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/movieobjects/dmeexpressionoperator.h')
-rw-r--r--public/movieobjects/dmeexpressionoperator.h106
1 files changed, 106 insertions, 0 deletions
diff --git a/public/movieobjects/dmeexpressionoperator.h b/public/movieobjects/dmeexpressionoperator.h
new file mode 100644
index 0000000..9a5de80
--- /dev/null
+++ b/public/movieobjects/dmeexpressionoperator.h
@@ -0,0 +1,106 @@
+//========= 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