]> git.tdb.fi Git - libs/gl.git/blob - source/glsl/evaluate.cpp
Fix the declaration of the builtin textureLod function
[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(VariableReference &var)
32 {
33         if(!var.declaration)
34                 return;
35
36         if(variable_values)
37         {
38                 ValueMap::const_iterator i = variable_values->find(var.declaration);
39                 if(i!=variable_values->end())
40                         i->second->visit(*this);
41         }
42         else if(var.declaration->init_expression)
43                 var.declaration->init_expression->visit(*this);
44 }
45
46 void ExpressionEvaluator::visit(UnaryExpression &unary)
47 {
48         r_result_valid = false;
49         unary.expression->visit(*this);
50         if(!r_result_valid)
51                 return;
52
53         if(unary.oper->token[0]=='!')
54                 r_result = !r_result;
55         else
56                 r_result_valid = false;
57 }
58
59 void ExpressionEvaluator::visit(BinaryExpression &binary)
60 {
61         r_result_valid = false;
62         binary.left->visit(*this);
63         if(!r_result_valid)
64                 return;
65
66         float left_result = r_result;
67         r_result_valid = false;
68         binary.right->visit(*this);
69         if(!r_result_valid)
70                 return;
71
72         std::string oper = binary.oper->token;
73         if(oper=="<")
74                 r_result = (left_result<r_result);
75         else if(oper=="<=")
76                 r_result = (left_result<=r_result);
77         else if(oper==">")
78                 r_result = (left_result>r_result);
79         else if(oper==">=")
80                 r_result = (left_result>=r_result);
81         else if(oper=="==")
82                 r_result = (left_result==r_result);
83         else if(oper=="!=")
84                 r_result = (left_result!=r_result);
85         else if(oper=="&&")
86                 r_result = (left_result && r_result);
87         else if(oper=="||")
88                 r_result = (left_result || r_result);
89         else
90                 r_result_valid = false;
91 }
92
93 } // namespace SL
94 } // namespace GL
95 } // namespace Msp