]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/evaluate.cpp
Implement constant folding in the GLSL compiler
[libs/gl.git] / source / glsl / evaluate.cpp
diff --git a/source/glsl/evaluate.cpp b/source/glsl/evaluate.cpp
deleted file mode 100644 (file)
index 2b3f50a..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-#include <msp/strings/lexicalcast.h>
-#include "evaluate.h"
-
-namespace Msp {
-namespace GL {
-namespace SL {
-
-ExpressionEvaluator::ExpressionEvaluator():
-       variable_values(0),
-       r_result(0.0f),
-       r_result_valid(false)
-{ }
-
-ExpressionEvaluator::ExpressionEvaluator(const ValueMap &v):
-       variable_values(&v),
-       r_result(0.0f),
-       r_result_valid(false)
-{ }
-
-void ExpressionEvaluator::visit(Literal &literal)
-{
-       if(literal.token=="true")
-               r_result = 1.0f;
-       else if(literal.token=="false")
-               r_result = 0.0f;
-       else
-               r_result = lexical_cast<float>(literal.token);
-       r_result_valid = true;
-}
-
-void ExpressionEvaluator::visit(VariableReference &var)
-{
-       if(!var.declaration)
-               return;
-
-       if(variable_values)
-       {
-               ValueMap::const_iterator i = variable_values->find(var.declaration);
-               if(i!=variable_values->end())
-                       i->second->visit(*this);
-       }
-       else if(var.declaration->init_expression)
-               var.declaration->init_expression->visit(*this);
-}
-
-void ExpressionEvaluator::visit(UnaryExpression &unary)
-{
-       r_result_valid = false;
-       unary.expression->visit(*this);
-       if(!r_result_valid)
-               return;
-
-       if(unary.oper->token[0]=='!')
-               r_result = !r_result;
-       else
-               r_result_valid = false;
-}
-
-void ExpressionEvaluator::visit(BinaryExpression &binary)
-{
-       r_result_valid = false;
-       binary.left->visit(*this);
-       if(!r_result_valid)
-               return;
-
-       float left_result = r_result;
-       r_result_valid = false;
-       binary.right->visit(*this);
-       if(!r_result_valid)
-               return;
-
-       std::string oper = binary.oper->token;
-       if(oper=="<")
-               r_result = (left_result<r_result);
-       else if(oper=="<=")
-               r_result = (left_result<=r_result);
-       else if(oper==">")
-               r_result = (left_result>r_result);
-       else if(oper==">=")
-               r_result = (left_result>=r_result);
-       else if(oper=="==")
-               r_result = (left_result==r_result);
-       else if(oper=="!=")
-               r_result = (left_result!=r_result);
-       else if(oper=="&&")
-               r_result = (left_result && r_result);
-       else if(oper=="||")
-               r_result = (left_result || r_result);
-       else
-               r_result_valid = false;
-}
-
-} // namespace SL
-} // namespace GL
-} // namespace Msp