]> git.tdb.fi Git - libs/gl.git/blob - source/glsl/evaluate.cpp
Store a pointer to operator info rather than the token in expressions
[libs/gl.git] / source / glsl / evaluate.cpp
1 #include <msp/strings/lexicalcast.h>
2 #include "evaluate.h"
3
4 namespace Msp {
5 namespace GL {
6 namespace SL {
7
8 ExpressionEvaluator::ExpressionEvaluator():
9         variable_values(0),
10         result(0.0f),
11         result_valid(false)
12 { }
13
14 ExpressionEvaluator::ExpressionEvaluator(const ValueMap &v):
15         variable_values(&v),
16         result(0.0f),
17         result_valid(false)
18 { }
19
20 void ExpressionEvaluator::visit(Literal &literal)
21 {
22         if(literal.token=="true")
23                 result = 1.0f;
24         else if(literal.token=="false")
25                 result = 0.0f;
26         else
27                 result = lexical_cast<float>(literal.token);
28         result_valid = true;
29 }
30
31 void ExpressionEvaluator::visit(ParenthesizedExpression &parexp)
32 {
33         parexp.expression->visit(*this);
34 }
35
36 void ExpressionEvaluator::visit(VariableReference &var)
37 {
38         if(!var.declaration)
39                 return;
40
41         if(variable_values)
42         {
43                 ValueMap::const_iterator i = variable_values->find(var.declaration);
44                 if(i!=variable_values->end())
45                         i->second->visit(*this);
46         }
47         else if(var.declaration->init_expression)
48                 var.declaration->init_expression->visit(*this);
49 }
50
51 void ExpressionEvaluator::visit(UnaryExpression &unary)
52 {
53         result_valid = false;
54         unary.expression->visit(*this);
55         if(!result_valid)
56                 return;
57
58         if(unary.oper->token[0]=='!')
59                 result = !result;
60         else
61                 result_valid = false;
62 }
63
64 void ExpressionEvaluator::visit(BinaryExpression &binary)
65 {
66         result_valid = false;
67         binary.left->visit(*this);
68         if(!result_valid)
69                 return;
70
71         float left_result = result;
72         result_valid = false;
73         binary.right->visit(*this);
74         if(!result_valid)
75                 return;
76
77         std::string oper = binary.oper->token;
78         if(oper=="<")
79                 result = (left_result<result);
80         else if(oper=="<=")
81                 result = (left_result<=result);
82         else if(oper==">")
83                 result = (left_result>result);
84         else if(oper==">=")
85                 result = (left_result>=result);
86         else if(oper=="==")
87                 result = (left_result==result);
88         else if(oper=="!=")
89                 result = (left_result!=result);
90         else if(oper=="&&")
91                 result = (left_result && result);
92         else if(oper=="||")
93                 result = (left_result || result);
94         else
95                 result_valid = false;
96 }
97
98 } // namespace SL
99 } // namespace GL
100 } // namespace Msp