vrecko
virtual reality framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
queryinterpret.h
Go to the documentation of this file.
1 #ifndef QUERYINTERPRET_H_
2 #define QUERYINTERPRET_H_
3 
4 #include "abstractinterpret.h"
5 #include "lsgeode.h"
6 #include "log.h"
7 
8 namespace AP_LSystem {
10 {
11 private:
12  static QueryInterpret * interpret;
13  osg::Matrixd matrix;
14 
19  unsigned dirty;
20 
21  LongString * word;
22 
26  enum dirtyBits
27  {
28  CLEAR = 0x00000000,
29  POSITION = 0x0000000F,
30  POSITIONX = 0x00000001,
31  POSITIONY = 0x00000002,
32  POSITIONZ = 0x00000004,
33  HEADING = 0x000000F0,
34  HEADINGX = 0x00000010,
35  HEADINGY = 0x00000020,
36  HEADINGZ = 0x00000040,
37  UP = 0x00000F00,
38  UPX = 0x00000100,
39  UPY = 0x00000200,
40  UPZ = 0x00000400,
41  LEFT = 0x0000F000,
42  LEFTX = 0x00001000,
43  LEFTY = 0x00002000,
44  LEFTZ = 0x00004000,
45  DIRTY = 0xFFFFFFFF,
46  };
47 
52  {
53  // create group for geodes
54  m_Owner = new osg::Group();
55 
56  word = NULL;
57 
58  createGeodes();
59 
60  dirty = QueryInterpret::DIRTY;
61 
62  for( vector<LSGeode *>::iterator it = m_Geodes.begin(); it != m_Geodes.end(); it++ )
63  {
64  (*it)->setTurtleType( LS_TURTLE_QUERY );
65  }
66  };
67 
71  void update()
72  {
73  ParseableString * pW = new ParseableString( word );
74 
75  if(!pW)
76  return;
77 
78  parse( pW );
79  }
80 
81  virtual int parse( ParseableString * word);
82 
83  ~QueryInterpret(void);
84 
85 public:
89  static QueryInterpret * get()
90  {
91  if(!interpret) interpret = new QueryInterpret();
92 
93  return interpret;
94  }
95 
96 
100  double positionX( )
101  {
102  if( dirty & QueryInterpret::POSITIONX )
103  {
104  // update matrix
105  update();
106 
107  // set Position as CLEAR
108  dirty &= ~QueryInterpret::POSITION;
109  }
110  dirty |= QueryInterpret::POSITIONX;
111 
113 
114  return matrix.getTrans().x();
115  }
116 
120  double positionY( )
121  {
122  if( dirty & QueryInterpret::POSITIONY )
123  {
124  // update matrix
125  update();
126 
127  // set Position as CLEAR
128  dirty &= ~QueryInterpret::POSITION;
129  }
130  dirty |= QueryInterpret::POSITIONY;
131 
133 
134  return matrix.getTrans().y();
135  }
136 
140  double positionZ( )
141  {
142  if( dirty & QueryInterpret::POSITIONZ )
143  {
144  // update matrix
145  update();
146 
147  // set Position as CLEAR
148  dirty &= ~QueryInterpret::POSITION;
149  }
150  dirty |= QueryInterpret::POSITIONZ;
151 
153 
154  return matrix.getTrans().z();
155  }
156 
160  double headingX( )
161  {
162  if( dirty & QueryInterpret::HEADINGX )
163  {
164  // update matrix
165  update();
166 
167  // set Position as CLEAR
168  dirty &= ~QueryInterpret::HEADING;
169  }
170  dirty |= QueryInterpret::HEADING;
171 
172  osg::Vec3d v = matrix.getRotate() * HeadVec;
173 
175 
176  return v.x();
177  }
178 
182  double headingY( )
183  {
184  if( dirty & QueryInterpret::HEADINGY )
185  {
186  // update matrix
187  update();
188 
189  // set Position as CLEAR
190  dirty &= ~QueryInterpret::HEADING;
191  }
192  dirty |= QueryInterpret::HEADING;
193 
194  osg::Vec3d v = matrix.getRotate() * HeadVec;
195 
197 
198  return v.y();
199  }
200 
204  double headingZ( )
205  {
206  if( dirty & QueryInterpret::HEADINGZ )
207  {
208  // update matrix
209  update();
210 
211  // set Position as CLEAR
212  dirty &= ~QueryInterpret::HEADING;
213  }
214  dirty |= QueryInterpret::HEADING;
215 
216  osg::Vec3d v = matrix.getRotate() * HeadVec;
217 
219 
220  return v.z();
221  }
222 
226  double upX( )
227  {
228  if( dirty & QueryInterpret::UPX )
229  {
230  // update matrix
231  update();
232 
233  // set Position as CLEAR
234  dirty &= ~QueryInterpret::UP;
235  }
236  dirty |= QueryInterpret::UP;
237 
238  osg::Vec3d v = matrix.getRotate() * UpVec;
239 
241 
242  return v.x();
243  }
244 
248  double upY( )
249  {
250  if( dirty & QueryInterpret::UPY )
251  {
252  // update matrix
253  update();
254 
255  // set Position as CLEAR
256  dirty &= ~QueryInterpret::UP;
257  }
258  dirty |= QueryInterpret::UP;
259 
260  osg::Vec3d v = matrix.getRotate() * UpVec;
261 
263 
264  return v.y();
265  }
266 
270  double upZ( )
271  {
272  if( dirty & QueryInterpret::UPZ )
273  {
274  // update matrix
275  update();
276 
277  // set Position as CLEAR
278  dirty &= ~QueryInterpret::UP;
279  }
280  dirty |= QueryInterpret::UP;
281 
282  osg::Vec3d v = matrix.getRotate() * UpVec;
283 
285 
286  return v.z();
287  }
288 
292  double leftX( )
293  {
294  if( dirty & QueryInterpret::LEFTX )
295  {
296  // update matrix
297  update();
298 
299  // set Position as CLEAR
300  dirty &= ~QueryInterpret::LEFT;
301  }
302  dirty |= QueryInterpret::LEFT;
303 
304  osg::Vec3d v = matrix.getRotate() * LeftVec;
305 
307 
308  return v.x();
309  }
310 
314  double leftY( )
315  {
316  if( dirty & QueryInterpret::LEFTY )
317  {
318  // update matrix
319  update();
320 
321  // set Position as CLEAR
322  dirty &= ~QueryInterpret::LEFT;
323  }
324  dirty |= QueryInterpret::LEFT;
325 
326  osg::Vec3d v = matrix.getRotate() * LeftVec;
327 
329 
330  return v.y();
331  }
332 
336  double leftZ( )
337  {
338  if( dirty & QueryInterpret::LEFTZ )
339  {
340  // update matrix
341  update();
342 
343  // set Position as CLEAR
344  dirty &= ~QueryInterpret::LEFT;
345  }
346  dirty |= QueryInterpret::LEFT;
347 
348  osg::Vec3d v = matrix.getRotate() * LeftVec;
349 
351 
352  return v.z();
353  }
354 
358  void bindWord( LongString * str)
359  {
360  word = str;
361  matrix.makeIdentity();
362  }
363 
364 };
365 }
366 
367 #endif
368