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