]> git.tdb.fi Git - libs/gl.git/blob - source/programsyntax.cpp
Refresh lighting and culling uniforms if the camera changes in pop_state
[libs/gl.git] / source / programsyntax.cpp
1 #include "programsyntax.h"
2
3 using namespace std;
4
5 namespace Msp {
6 namespace GL {
7 namespace ProgramSyntax {
8
9 template<typename C>
10 NodeContainer<C>::NodeContainer(const NodeContainer &c):
11         C(c)
12 {
13         for(typename C::iterator i=this->begin(); i!=this->end(); ++i)
14                 *i = (*i)->clone();
15 }
16
17
18 Block::Block():
19         use_braces(false)
20 { }
21
22 void Block::visit(NodeVisitor &visitor)
23 {
24         visitor.visit(*this);
25 }
26
27
28 void Literal::visit(NodeVisitor &visitor)
29 {
30         visitor.visit(*this);
31 }
32
33
34 void ParenthesizedExpression::visit(NodeVisitor &visitor)
35 {
36         visitor.visit(*this);
37 }
38
39
40 VariableReference::VariableReference():
41         declaration(0)
42 { }
43
44 void VariableReference::visit(NodeVisitor &visitor)
45 {
46         visitor.visit(*this);
47 }
48
49
50 void MemberAccess::visit(NodeVisitor &visitor)
51 {
52         visitor.visit(*this);
53 }
54
55
56 UnaryExpression::UnaryExpression():
57         prefix(true)
58 { }
59
60 void UnaryExpression::visit(NodeVisitor &visitor)
61 {
62         visitor.visit(*this);
63 }
64
65
66 void BinaryExpression::visit(NodeVisitor &visitor)
67 {
68         visitor.visit(*this);
69 }
70
71
72 Assignment::Assignment():
73         self_referencing(false),
74         target_declaration(0)
75 { }
76
77 void Assignment::visit(NodeVisitor &visitor)
78 {
79         visitor.visit(*this);
80 }
81
82
83 FunctionCall::FunctionCall():
84         declaration(0),
85         constructor(false)
86 { }
87
88 void FunctionCall::visit(NodeVisitor &visitor)
89 {
90         visitor.visit(*this);
91 }
92
93
94 void ExpressionStatement::visit(NodeVisitor &visitor)
95 {
96         visitor.visit(*this);
97 }
98
99
100 void Import::visit(NodeVisitor &visitor)
101 {
102         visitor.visit(*this);
103 }
104
105
106 void Layout::visit(NodeVisitor &visitor)
107 {
108         visitor.visit(*this);
109 }
110
111
112 void InterfaceLayout::visit(NodeVisitor &visitor)
113 {
114         visitor.visit(*this);
115 }
116
117
118 StructDeclaration::StructDeclaration()
119 {
120         members.use_braces = true;
121 }
122
123 void StructDeclaration::visit(NodeVisitor &visitor)
124 {
125         visitor.visit(*this);
126 }
127
128
129 VariableDeclaration::VariableDeclaration():
130         constant(false),
131         type_declaration(0),
132         array(false),
133         linked_declaration(0)
134 { }
135
136 void VariableDeclaration::visit(NodeVisitor &visitor)
137 {
138         visitor.visit(*this);
139 }
140
141
142 InterfaceBlock::InterfaceBlock():
143         array(false)
144 {
145         members.use_braces = true;
146 }
147
148 void InterfaceBlock::visit(NodeVisitor &visitor)
149 {
150         visitor.visit(*this);
151 }
152
153
154 FunctionDeclaration::FunctionDeclaration():
155         definition(0)
156 { }
157
158 FunctionDeclaration::FunctionDeclaration(const FunctionDeclaration &other):
159         return_type(other.return_type),
160         name(other.name),
161         parameters(other.parameters),
162         definition(other.definition==&other ? this : other.definition),
163         body(other.body)
164 { }
165
166 void FunctionDeclaration::visit(NodeVisitor &visitor)
167 {
168         visitor.visit(*this);
169 }
170
171
172 void Conditional::visit(NodeVisitor &visitor)
173 {
174         visitor.visit(*this);
175 }
176
177
178 void Iteration::visit(NodeVisitor &visitor)
179 {
180         visitor.visit(*this);
181 }
182
183
184 void Passthrough::visit(NodeVisitor &visitor)
185 {
186         visitor.visit(*this);
187 }
188
189
190 void Return::visit(NodeVisitor &visitor)
191 {
192         visitor.visit(*this);
193 }
194
195
196 void NodeVisitor::visit(Assignment &assign)
197 {
198         visit(static_cast<BinaryExpression &>(assign));
199 }
200
201
202 void TraversingVisitor::visit(Block &block)
203 {
204         for(list<RefPtr<Node> >::iterator i=block.body.begin(); i!=block.body.end(); ++i)
205                 (*i)->visit(*this);
206 }
207
208 void TraversingVisitor::visit(ParenthesizedExpression &parexpr)
209 {
210         parexpr.expression->visit(*this);
211 }
212
213 void TraversingVisitor::visit(MemberAccess &memacc)
214 {
215         memacc.left->visit(*this);
216 }
217
218 void TraversingVisitor::visit(UnaryExpression &unary)
219 {
220         unary.expression->visit(*this);
221 }
222
223 void TraversingVisitor::visit(BinaryExpression &binary)
224 {
225         binary.left->visit(*this);
226         binary.right->visit(*this);
227 }
228
229 void TraversingVisitor::visit(FunctionCall &call)
230 {
231         for(vector<RefPtr<Expression> >::iterator i=call.arguments.begin(); i!=call.arguments.end(); ++i)
232                 (*i)->visit(*this);
233 }
234
235 void TraversingVisitor::visit(ExpressionStatement &expr)
236 {
237         expr.expression->visit(*this);
238 }
239
240 void TraversingVisitor::visit(InterfaceLayout &layout)
241 {
242         layout.layout.visit(*this);
243 }
244
245 void TraversingVisitor::visit(StructDeclaration &strct)
246 {
247         strct.members.visit(*this);
248 }
249
250 void TraversingVisitor::visit(VariableDeclaration &var)
251 {
252         if(var.layout)
253                 var.layout->visit(*this);
254         if(var.init_expression)
255                 var.init_expression->visit(*this);
256         if(var.array_size)
257                 var.array_size->visit(*this);
258 }
259
260 void TraversingVisitor::visit(InterfaceBlock &iface)
261 {
262         iface.members.visit(*this);
263 }
264
265 void TraversingVisitor::visit(FunctionDeclaration &func)
266 {
267         for(vector<RefPtr<VariableDeclaration> >::iterator i=func.parameters.begin(); i!=func.parameters.end(); ++i)
268                 (*i)->visit(*this);
269         func.body.visit(*this);
270 }
271
272 void TraversingVisitor::visit(Conditional &cond)
273 {
274         cond.condition->visit(*this);
275         cond.body.visit(*this);
276         cond.else_body.visit(*this);
277 }
278
279 void TraversingVisitor::visit(Iteration &iter)
280 {
281         iter.init_statement->visit(*this);
282         if(iter.condition)
283                 iter.condition->visit(*this);
284         if(iter.loop_expression)
285                 iter.loop_expression->visit(*this);
286         iter.body.visit(*this);
287 }
288
289 void TraversingVisitor::visit(Passthrough &pass)
290 {
291         if(pass.subscript)
292                 pass.subscript->visit(*this);
293 }
294
295 void TraversingVisitor::visit(Return &ret)
296 {
297         if(ret.expression)
298                 ret.expression->visit(*this);
299 }
300
301
302 Stage::Stage(StageType t):
303         type(t),
304         previous(0)
305 { }
306
307
308 Module::Module():
309         shared(SHARED)
310 { }
311
312 } // namespace ProgramSyntax
313 } // namespace GL
314 } // namespace Msp