]> git.tdb.fi Git - libs/gl.git/blob - source/glsl/evaluate.cpp
f290002b61a14c0fefb15b92398a821c7ec7f529
[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         r_result(0.0f),
11         r_result_valid(false)
12 { }
13
14 ExpressionEvaluator::ExpressionEvaluator(const ValueMap &v):
15         variable_values(&v),
16         r_result(0.0f),
17         r_result_valid(false)
18 { }
19
20 void ExpressionEvaluator::visit(Literal &literal)
21 {
22         if(literal.token=="true")
23                 r_result = 1.0f;
24         else if(literal.token=="false")
25                 r_result = 0.0f;
26         else
27                 r_result = lexical_cast<float>(literal.token);
28         r_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         r_result_valid = false;
54         unary.expression->visit(*this);
55         if(!r_result_valid)
56                 return;
57
58         if(unary.oper->token[0]=='!')
59                 r_result = !r_result;
60         else
61                 r_result_valid = false;
62 }
63
64 void ExpressionEvaluator::visit(BinaryExpression &binary)
65 {
66         r_result_valid = false;
67         binary.left->visit(*this);
68         if(!r_result_valid)
69                 return;
70
71         float left_result = r_result;
72         r_result_valid = false;
73         binary.right->visit(*this);
74         if(!r_result_valid)
75                 return;
76
77         std::string oper = binary.oper->token;
78         if(oper=="<")
79                 r_result = (left_result<r_result);
80         else if(oper=="<=")
81                 r_result = (left_result<=r_result);
82         else if(oper==">")
83                 r_result = (left_result>r_result);
84         else if(oper==">=")
85                 r_result = (left_result>=r_result);
86         else if(oper=="==")
87                 r_result = (left_result==r_result);
88         else if(oper=="!=")
89                 r_result = (left_result!=r_result);
90         else if(oper=="&&")
91                 r_result = (left_result && r_result);
92         else if(oper=="||")
93                 r_result = (left_result || r_result);
94         else
95                 r_result_valid = false;
96 }
97
98 } // namespace SL
99 } // namespace GL
100 } // namespace Msp