]> git.tdb.fi Git - libs/gl.git/blob - source/glsl/evaluate.cpp
4bbdb2f60f436528b733905d604bad4100780497
[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=="!")
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         if(binary.oper=="<")
78                 result = (left_result<result);
79         else if(binary.oper=="<=")
80                 result = (left_result<=result);
81         else if(binary.oper==">")
82                 result = (left_result>result);
83         else if(binary.oper==">=")
84                 result = (left_result>=result);
85         else if(binary.oper=="==")
86                 result = (left_result==result);
87         else if(binary.oper=="!=")
88                 result = (left_result!=result);
89         else if(binary.oper=="&&")
90                 result = (left_result && result);
91         else if(binary.oper=="||")
92                 result = (left_result || result);
93         else
94                 result_valid = false;
95 }
96
97 } // namespace SL
98 } // namespace GL
99 } // namespace Msp