GameApi 28
Library used by GameApi Builder tool
Loading...
Searching...
No Matches
Parser.hh
Go to the documentation of this file.
1#include <vector>
2#include <sstream>
3//#include <typeinfo>
4#include "Graph.hh"
5#include "Serialize.hh"
6
8{
9 int id;
10 virtual ~BitmapHandle() { }
11};
12
13
20{
22 ~BitmapIntHandle() { delete bm; }
23};
25{
26 std::vector<BitmapHandle*> vec;
27 std::vector<int> owned;
29 {
30 // NOT deleted here, because bitmaparray() uses find_bitmap() to find the
31 // handles, and thus we don't have ownership of them.
32 if (vec.size() != owned.size())
33 {
34 std::cout << "BitmapArrayHandle destructor: vector sizes do not match" << std::endl;
35 }
36 int s = vec.size();
37 for(int i=0;i<s;i++)
38 if (owned[i]==1)
39 delete vec[i];
40 }
41};
43{
45 ~BitmapPosHandle() { delete bm; }
46};
53
55{
57 int id;
59 //FaceCollection **collarray;
63 //int size;
66 ~FaceCollPolyHandle() { /*if (collowned) delete coll; if (collarrayowned) delete collarray;*/ }
67
68};
69
70#if 0
71
72#if 0
73struct PolyHandle
74{
75 int id;
76 virtual ~PolyHandle() { }
77};
78#endif
79
80
81
82
83class ParserPairBase
84{
85public:
86 //virtual std::type_info TypeInfo() const=0;
87 virtual size_t SizeOf() const=0;
88 struct PtrSize
89 {
90 char *ptr;
91 size_t size;
92 };
93 virtual PtrSize BaseParse(std::string s, bool &success) const=0;
94 virtual std::string BaseCreate(PtrSize psz) const=0;
95};
96
97template<class T>
98class ParserPair : public ParserPairBase
99{
100public:
101 virtual std::string Create(T t) const=0;
102 virtual T Parse(std::string s, bool &success) const=0;
103 //std::type_info TypeInfo() const { return typeid(T); }
104 virtual size_t SizeOf() const { return sizeof(T); }
105 virtual PtrSize BaseParse(std::string s, bool &success) const
106 {
107 PtrSize sz;
108 T *ptr = new T;
109 sz.ptr = (char*)ptr;
110 sz.size = sizeof(T);
111 *ptr = Parse(s, success);
112 return sz;
113 }
114 virtual std::string BaseCreate(PtrSize psz) const
115 {
116 T *ptr = (T*)psz.ptr;
117#if 0
118 char *debugptr = (char*)ptr;
119 std::cout << typeid(T).name() << ":";
120 for(int i=0;i<psz.size;i++) { std::cout << std::hex << (int)debugptr[i] << " "; }
121 std::cout << std::endl;
122#endif
123 std::string s = Create(*ptr);
124 return s;
125 }
126
127};
128
129template<class T, class K>
130class ParserPairConversion : public ParserPair<K>
131{
132public:
133 ParserPairConversion(ParserPair<T> &p) : p(p) { }
134 virtual K Convert_1(T t) const=0;
135 virtual T Convert_2(K k) const=0;
136 virtual std::string Create(K k) const
137 {
138 T t = Convert_2(k);
139 return p.Create(t);
140 }
141 virtual K Parse(std::string s, bool &success) const
142 {
143 T t = p.Parse(s,success);
144 return Convert_1(t);
145 }
146
147private:
148 ParserPair<T> &p;
149};
150
151template<class T>
152class ObjectToPointerConversionParser : public ParserPairConversion<T,T*>
153{
154public:
155 virtual T* Convert_1(T t) const
156 {
157 tt=t;
158 return &tt;
159 }
160 virtual T Convert_2(T* t) const
161 {
162 return *t;
163 }
164private:
165 T tt;
166};
167
168class CharParser : public ParserPair<char>
169{
170public:
171 std::string Create(char c) const { std::string s; s+=c; return s; }
172 char Parse(std::string s, bool &success) const {
173 if (s.length()!=1) { success = false; return ' '; }
174 success = true;
175 return s[0];
176 }
177};
178
179template<class T>
180class VectorParser : public ParserPair<std::vector<T> >
181{
182public:
183 VectorParser(ParserPair<T> &pair, int level) : pair(pair), level(level) { }
184 std::string Create(std::vector<T> vec) const
185 {
186 int s2 = vec.size();
187 std::string s;
188 for(int i=0;i<s2;i++)
189 {
190 s += pair.Create(vec[i]);
191 s += level_char();
192 }
193 return s;
194 }
195 std::vector<T> Parse(std::string s, bool &success) const
196 {
197 int index = 0;
198 std::vector<T> vec;
199 int ss = s.length();
200 for(int i=0;i<ss;i++)
201 {
202 if (s[i]==level_char())
203 {
204 T t = pair.Parse(s.substr(index,i-index), success);
205 if (!success) { std::cout << "VectorParser failed" << std::endl; return vec; }
206 vec.push_back(t);
207 index = i+1;
208 }
209 }
210 success = true;
211 return vec;
212 }
213 char level_char() const
214 {
215 char array[] = { '@', '%', '&', '!', 'a','b','c','d','e','f','g','h' };
216 return array[level];
217 }
218private:
219 ParserPair<T> &pair;
220 int level;
221};
222
223template<class T>
224class ArrayParser : public ParserPair<Array<int, T>*>
225{
226public:
227 ArrayParser(ParserPair<T> &t, int level) : parser(t, level), v(0) { }
228 virtual std::string Create(Array<int,T>* t) const
229 {
230 if (t==0) return "_";
231 //std::cout << "ArrayParser:" << t << std::endl;
232 int s = t->Size();
233 std::vector<T> vec;
234 for(int i=0;i<s;i++)
235 {
236 vec.push_back(t->Index(i));
237 }
238 return parser.Create(vec);
239 }
240 virtual Array<int,T>* Parse(std::string s, bool &success) const
241 {
242 if (s.length()==1 && s[0]=='_') { success = true; return 0; }
243 delete v;
244 v = 0;
245 vec = parser.Parse(s,success);
246 v = new VectorArray<T>(vec.begin(), vec.end());
247 return v;
248 }
249private:
250 VectorParser<T> parser;
251 mutable std::vector<T> vec;
252 mutable VectorArray<T> *v;
253};
254
255class StringParser : public ParserPair<std::string>
256{
257 std::string Create(std::string t) const { return t; }
258 std::string Parse(std::string s, bool &success) const
259 {
260 success = true;
261 return s;
262 }
263};
264
265template<class T>
266class StringStreamParser : public ParserPair<T>
267{
268public:
269 std::string Create(T t) const
270 {
271 std::stringstream ss;
272 ss << t;
273 return ss.str();
274 }
275 T Parse(std::string s, bool &success) const
276 {
277 //std::cout << "StringStream parser string: '" << s << "'" << std::endl;
278 T i;
279 std::stringstream ss;
280 ss << s;
281 if (ss >> i) { success = true; } else { std::cout << "StringStream Parser failed" << std::endl; success = false; }
282 return i;
283 }
284};
285
286class FloatParser : public StringStreamParser<float> { };
287class IntParser : public StringStreamParser<int> { };
288class UnsignedIntParser : public StringStreamParser<unsigned int> { };
289class BoolParser : public StringStreamParser<bool> { };
290
291
292template<class T>
293class StructParser : public ParserPair<T>
294{
295public:
296 StructParser(int level) : level(level) { }
297 template<class TA>
298 void push_back(const ParserPair<TA> &pair)
299 {
300 vec.push_back(&pair);
301 }
302 std::string Create(T mystruct) const
303 {
304 int s2 = vec.size();
305 std::string s;
306 int pos =0;
307 for(int i=0;i<s2;i++)
308 {
309 const ParserPairBase *base = vec[i];
310 char *ptr = ((char*)&mystruct) + pos;
311 int sz = base->SizeOf();
312 ParserPairBase::PtrSize ssz;
313 ssz.ptr = ptr;
314 ssz.size = sz;
315 s += base->BaseCreate(ssz);
316 s += level_char();
317 pos += sz;
318 }
319 return s;
320 }
321 T Parse(std::string s, bool &success) const
322 {
323 int index = 0;
324 T vec2;
325 int ii=0;
326 int pos = 0;
327 int sk = s.length();
328 for(int i=0;i<sk;i++)
329 {
330 if (s[i]==level_char())
331 {
332 const ParserPairBase *base = vec[ii];
333 char *ptr = ((char*)&vec2) + pos;
334 int sz = base->SizeOf();
335 ParserPairBase::PtrSize ssz = base->BaseParse(s.substr(index, i-index), success);
336 if(sz!=int(ssz.size)) { std::cout << "ParseStruct size problem" << std::endl; }
337 if (!success) { std::cout << "StructParser failed" << std::endl; return vec2; }
338 std::copy(ssz.ptr, ssz.ptr+ssz.size, ptr);
339 index = i+1;
340 pos+=sz;
341 ii++;
342 }
343 }
344 success = true;
345 return vec2;
346 }
347 char level_char() const
348 {
349 char array[] = { '@', '%', '&', '!', 'a','b','c','d','e','f','g','h' };
350 return array[level];
351 }
352
353private:
354 std::vector<const ParserPairBase*> vec;
355 int level;
356};
357
358template<class T>
359class DiscriminatedUnionParser : public StructParser<T>
360{
361public:
362 template<class TA>
363 void push_back(const ParserPair<TA> &pair)
364 {
365 StructParser<T>::push_back(pair);
366 }
367};
368
369class PointParser : public ParserPair<Point>
370{
371public:
372 PointParser(int level) : vec(fl, level) { }
373 std::string Create(Point p) const
374 {
375 std::vector<float> v;
376 v.push_back(p.x);
377 v.push_back(p.y);
378 v.push_back(p.z);
379 return vec.Create(v);
380 }
381 Point Parse(std::string s, bool &success) const
382 {
383 std::vector<float> v = vec.Parse(s, success);
384 return Point(v[0],v[1],v[2]);
385 }
386private:
387 VectorParser<float> vec;
388 FloatParser fl;
389};
390
391class Point2dParser : public ParserPair<Point2d>
392{
393public:
394 Point2dParser(int level) : vec(fl, level) { }
395 std::string Create(Point2d p) const
396 {
397 std::vector<float> v;
398 v.push_back(p.x);
399 v.push_back(p.y);
400 return vec.Create(v);
401 }
402 Point2d Parse(std::string s, bool &success) const
403 {
404 std::vector<float> v = vec.Parse(s, success);
405 Point2d p;
406 p.x = v[0];
407 p.y = v[1];
408 return p;
409 }
410private:
411 VectorParser<float> vec;
412 FloatParser fl;
413};
414
415
416class Vector3dParser : public ParserPair<Vector>
417{
418public:
419 Vector3dParser(int level) : vec(fl, level) { }
420 std::string Create(Vector p) const
421 {
422 std::vector<float> v;
423 v.push_back(p.dx);
424 v.push_back(p.dy);
425 v.push_back(p.dz);
426 return vec.Create(v);
427 }
428 Vector Parse(std::string s, bool &success) const
429 {
430 std::vector<float> v = vec.Parse(s, success);
431 return Vector(v[0],v[1],v[2]);
432 }
433private:
434 VectorParser<float> vec;
435 FloatParser fl;
436};
437
438
439class FaceCollectionParser : public ParserPair<FaceCollection*>
440{ // if you need to change the parser, make FaceCollectionParser2
441 // so that old data can be still loaded.
442public:
443 FaceCollectionParser(int level)
444 : pointsparser_level1(pointsparser_level2, level+1),
445 facepoint_level1(facepoint_level2, level+1),
446 facepoint_level2(facepoint_level3, level+2),
447 facepoint_level3(level+3),
448 pointnormal_level1(pointnormal_level2, level+1),
449 pointnormal_level2(pointnormal_level3, level+2),
450 pointnormal_level3(level+3),
451 color_level1(color_level2, level+1),
452 color_level2(color_level3, level+2),
453 texcoord_level1(texcoord_level2, level+1),
454 texcoord_level2(texcoord_level3, level+2),
455 texcoord_level3(level+3),
456 struct_parser(level+0)
457 {
458 struct_parser.push_back(NumFacesParser);
459 struct_parser.push_back(pointsparser_level1);
460 struct_parser.push_back(facepoint_level1);
461 struct_parser.push_back(pointnormal_level1);
462 struct_parser.push_back(color_level1);
463 struct_parser.push_back(texcoord_level1);
464 }
465 struct FaceStruct
466 {
467 int numfaces;
468 std::vector<int> numpoints;
469 std::vector<std::vector<Point> > facepoint;
470 std::vector<std::vector<Vector> > pointnormal;
471 std::vector<std::vector<unsigned int> > color;
472 std::vector<std::vector<Point2d> > texcoord;
473 };
474 class FaceStructFaceCollection : public SingleForwardFaceCollection
475 {
476 public:
477 FaceStructFaceCollection(FaceStruct &st) : st(st) { }
478 void Collect(CollectVisitor &vis)
479 {
480 }
481 void HeavyPrepare() { }
482
483 virtual int NumFaces() const { return st.numfaces; }
484 virtual int NumPoints(int face) const
485 {
486 //std::cout << "numfaces=" << st.numfaces << std::endl;
487 //std::cout << "FaceStrucctFaceCollection::NumPoints(" << face << ")" << std::endl;
488 return st.numpoints[face];
489 }
490 virtual Point FacePoint(int face, int point) const
491 {
492 return st.facepoint[face][point];
493 }
494 virtual Vector PointNormal(int face, int point) const
495 {
496 return st.pointnormal[face][point];
497 }
498 virtual float Attrib(int face, int point, int id) const
499 {
500 return 0.0;
501 }
502 virtual int AttribI(int face, int point, int id) const
503 {
504 return 0;
505 }
506 virtual unsigned int Color(int face, int point) const
507 {
508 return st.color[face][point];
509 }
510 virtual Point2d TexCoord(int face, int point) const
511 {
512 return st.texcoord[face][point];
513 }
514 private:
515 FaceStruct &st;
516 };
517 void Copy(FaceStruct &st, FaceCollection *coll) const
518 {
519 st.numfaces = coll->NumFaces();
520 int s = st.numfaces;
521 for(int i=0;i<s;i++)
522 {
523 st.numpoints.push_back(coll->NumPoints(i));
524 st.facepoint.push_back(std::vector<Point>());
525 st.pointnormal.push_back(std::vector<Vector>());
526 st.color.push_back(std::vector<unsigned int>());
527 st.texcoord.push_back(std::vector<Point2d>());
528 for(int k=0;k<st.numpoints[i];k++)
529 {
530 st.facepoint[i].push_back(coll->FacePoint(i,k));
531 st.pointnormal[i].push_back(coll->PointNormal(i,k));
532 st.color[i].push_back(coll->Color(i,k));
533 st.texcoord[i].push_back(coll->TexCoord(i,k));
534 }
535 }
536 }
537 virtual std::string Create(FaceCollection *t) const
538 {
539 if (t==0) return "_";
540 FaceStruct s;
541 Copy(s, t);
542 return struct_parser.Create(s);
543 }
544 virtual FaceCollection* Parse(std::string s, bool &success) const
545 {
546 if (s.length()==1 && s[0]=='_') { success = true; return 0; }
547 FaceStruct *ss = new FaceStruct;
548 *ss = struct_parser.Parse(s, success);
549 return new FaceStructFaceCollection(*ss);
550 }
551
552private:
553 IntParser NumFacesParser;
554 VectorParser<int> pointsparser_level1;
555 IntParser pointsparser_level2;
556 VectorParser<std::vector<Point> > facepoint_level1;
557 VectorParser<Point> facepoint_level2;
558 PointParser facepoint_level3;
559 VectorParser<std::vector<Vector> > pointnormal_level1;
560 VectorParser<Vector> pointnormal_level2;
561 Vector3dParser pointnormal_level3;
562 VectorParser<std::vector<unsigned int> > color_level1;
563 VectorParser<unsigned int> color_level2;
564 UnsignedIntParser color_level3;
565 VectorParser<std::vector<Point2d> > texcoord_level1;
566 VectorParser<Point2d> texcoord_level2;
567 Point2dParser texcoord_level3;
568 StructParser<FaceStruct> struct_parser;
569};
570
571template<class T>
572class BitmapParser : public ParserPair<Bitmap<T>*>
573{
574public:
575 BitmapParser(ParserPair<T> &pair, int level) : level1(level2,level+0), level2(pair, level+1), pair(pair) { }
576 virtual std::string Create(Bitmap<T> *t) const
577 {
578 std::vector<std::vector<T> > vec;
579 int sx = t->SizeX();
580 int sy = t->SizeY();
581 for(int i=0;i<sy;i++)
582 {
583 vec.push_back(std::vector<T>());
584 for(int j=0;j<sx;j++)
585 {
586 vec[i].push_back(t->Map(i,j));
587 }
588 }
589 return level1.Create(vec);
590 }
591 template<class T2>
592 class VectorVectorBitmap : public Bitmap<T2>
593 {
594 public:
595 VectorVectorBitmap(std::vector<std::vector<T2> > &vec) : vec(vec) { }
596 void Collect(CollectVisitor &vis)
597 {
598 }
599 void HeavyPrepare() { }
600
601 void Prepare() {}
602
603 virtual int SizeX() const { if (vec.size()==0) return 0; return vec[0].size(); }
604 virtual int SizeY() const { return vec.size(); }
605 virtual T Map(int x, int y) const
606 {
607 return vec[x][y];
608 }
609 private:
610 std::vector<std::vector<T2> > &vec;
611 };
612 virtual Bitmap<T> *Parse(std::string s, bool &success) const
613 {
614 std::vector<std::vector<T> > vec = level1.Parse(s, success);
615 std::vector<std::vector<T> > *heap = new std::vector<std::vector<T> >(vec);
616 return new VectorVectorBitmap<T>(*heap);
617 }
618
619private:
620 VectorParser<std::vector<T> > level1;
621 VectorParser<T> level2;
622 ParserPair<T> &pair;
623};
624
625class EventInfoParser : public ParserPair<EventInfo>
626{
627public:
628 EventInfoParser(int level)
629 : event_info_parser(level)
630 {
631 event_info_parser.push_back(time_parser);
632 event_info_parser.push_back(ac_event_id_parser);
633 event_info_parser.push_back(deac_event_id_parser);
634 event_info_parser.push_back(time_origin_id_parser);
635 event_info_parser.push_back(key_value_parser);
636 event_info_parser.push_back(state_change_id_parser);
637 event_info_parser.push_back(timer_bool_parser);
638 event_info_parser.push_back(key_down_bool_parser);
639 event_info_parser.push_back(key_up_bool_parser);
640 event_info_parser.push_back(ac_mouse_bool_parser);
641 event_info_parser.push_back(deac_mouse_bool_parser);
642 event_info_parser.push_back(state_change_bool_parser);
643 event_info_parser.push_back(padding1);
644 event_info_parser.push_back(padding2);
645
646 }
647 virtual std::string Create(EventInfo t) const
648 {
649 return event_info_parser.Create(t);
650 }
651 virtual EventInfo Parse(std::string s, bool &success) const
652 {
653 return event_info_parser.Parse(s,success);
654 }
655private:
656 FloatParser time_parser;
657 IntParser ac_event_id_parser;
658 IntParser deac_event_id_parser;
659 IntParser time_origin_id_parser;
660 IntParser key_value_parser;
661 IntParser state_change_id_parser;
662 BoolParser timer_bool_parser;
663 BoolParser key_down_bool_parser;
664 BoolParser key_up_bool_parser;
665 BoolParser ac_mouse_bool_parser;
666 BoolParser deac_mouse_bool_parser;
667 BoolParser state_change_bool_parser;
668 BoolParser padding1;
669 BoolParser padding2;
670 StructParser<EventInfo> event_info_parser;
671};
672
673class LinkageInfoParser : public ParserPair<LinkageInfo>
674{
675public:
676 LinkageInfoParser(int level)
677 : parser(level)
678 {
679 parser.push_back(start_parser);
680 parser.push_back(end_parser);
681 }
682 virtual std::string Create(LinkageInfo t) const
683 {
684 return parser.Create(t);
685 }
686 virtual LinkageInfo Parse(std::string s, bool &success) const
687 {
688 return parser.Parse(s,success);
689 }
690private:
691 IntParser start_parser;
692 IntParser end_parser;
693 StructParser<LinkageInfo> parser;
694};
695
696class PolyHandleParser : public ParserPair<FaceCollPolyHandle*>
697{
698public:
699 PolyHandleParser(int level) : coll(level+1), facesparser(level+2), arrayparser(facesparser,level+1), struct_parser(level)
700 {
701 struct_parser.push_back(id);
702 struct_parser.push_back(coll);
703 struct_parser.push_back(arrayparser);
704 struct_parser.push_back(collowned);
705 struct_parser.push_back(arrayowned);
706 struct_parser.push_back(padding1);
707 struct_parser.push_back(padding2);
708 }
709 std::string Create(FaceCollPolyHandle* t) const
710 {
711 if (t==0) return "_";
712 FaceCollPolyHandle h = *t;
713 h.collowned = false;
714 h.collarrayowned = false;
715 return struct_parser.Create(h);
716 }
717 FaceCollPolyHandle* Parse(std::string s, bool &success) const
718 {
719 if (s.length()==1 && s[0]=='_') { success = true; return 0; }
720 // also minor ownership problems..
721 faces = struct_parser.Parse(s,success);
722 // note: derived-to-base conversion here.
723 return const_cast<FaceCollPolyHandle*>(static_cast<const FaceCollPolyHandle*>(&faces));
724 }
725
726private:
727 IntParser id;
728 FaceCollectionParser coll;
729 BoolParser collowned;
730 FaceCollectionParser facesparser;
731 ArrayParser<FaceCollection*> arrayparser;
732 BoolParser arrayowned;
733 BoolParser padding1;
734 BoolParser padding2;
735 StructParser<FaceCollPolyHandle> struct_parser;
736 mutable FaceCollPolyHandle faces; // this one is special
737};
738
739#if 0
740
741template<class T, class K> // T = baseclass, K = derived class
742class DynamicCastParser : public ParserPairConversion<T*, K*>
743{
744public:
745 DynamicCastParser(ParserPair<T*> &p) : ParserPairConversion<T*,K*>(p) { }
746 virtual K *Convert_1(T *t) const { return dynamic_cast<K*>(t); }
747 virtual T *Convert_2(K *k) const { return k; }
748
749};
750
751#endif
752
753#if 0
754class PolyHandleParser : public ParserPair<PolyHandle*>
755{
756public:
757 PolyHandleParser(int level) : parser(level), convert(parser) { }
758private:
759 FaceCollPolyHandleParser parser;
760 DynamicCastParser<PolyHandle, FaceCollPolyHandle> convert;
761
762};
763#endif
764
765#if 0
766class BitmapHandleParser : public ParserPair<BitmapHandle*>
767{
768public:
769 BitmapHandleParser(int level) : level(level), color_parser(level+3), bm_parser(color_parser, level+2)
770 {
771 color_parser.push_back(r_parser);
772 color_parser.push_back(g_parser);
773 color_parser.push_back(b_parser);
774 color_parser.push_back(alpha_parser);
775 }
776
777 virtual std::string Create(BitmapHandle* t) const
778 {
779 BitmapColorHandle *chandle = dynamic_cast<BitmapColorHandle*>(t);
780 if (chandle)
781 {
782 IntParser p;
783 std::string s = p.Create(1); // BitmapColorHandle=1
784 StringParser string_parser;
785 VectorParser<std::string> vec_parser(string_parser, level+1);
786 std::vector<std::string> vec;
787 vec.push_back(s);
788 std::string s2 = bm_parser.Create(chandle->bm);
789 vec.push_back(s2);
790 return vec_parser.Create(vec);
791 }
792 else
793 {
794 std::cout << "ERROR, INVALID BITMAP TYPE IN SERIALIZE" << std::endl;
795 IntParser p;
796 std::string s = p.Create(-1); // BitmapColorHandle=1
797 StringParser string_parser;
798 VectorParser<std::string> vec_parser(string_parser, level+1);
799 std::vector<std::string> vec;
800 vec.push_back(s);
801 std::string s2 = "";
802 vec.push_back(s2);
803 return vec_parser.Create(vec);
804 }
805 return "";
806 }
807 virtual BitmapHandle* Parse(std::string s, bool &success) const
808 {
809 StringParser string_parser;
810 VectorParser<std::string> vec_parser(string_parser, level+1);
811 std::vector<std::string> vec = vec_parser.Parse(s,success);
812 if (!success) return NULL;
813 std::string type_string = vec[0];
814 IntParser p;
815 int value = p.Parse(type_string, success);
816 if (!success) return NULL;
817 switch(value)
818 {
819 case 0: // BitmapColorHandle
820 {
821 std::string bitmap_string = vec[1];
822 Bitmap<Color> *bm = bm_parser.Parse(bitmap_string, success);
823 if (!success) return NULL;
824 BitmapColorHandle *handle = new BitmapColorHandle;
825 handle->bm = bm;
826 return handle;
827 }
828 case -1:
829 return 0;
830 default:
831 std::cout << "UNKNOWN BITMAP TYPE IN UNSERIALIZE" << std::endl;
832 break;
833 }
834 return 0;
835 }
836private:
837 int level;
838 IntParser r_parser, g_parser, b_parser, alpha_parser;
839 StructParser<Color> color_parser;
840 BitmapParser<Color> bm_parser;
841};
842
843#endif
844
845class LinkInfoParser : public ParserPair<LinkInfo>
846{
847public:
848 LinkInfoParser(int level) : poly_start(level+1), poly_end(level+1), bitmap_start(level+1), bitmap_end(level+1), link_info_parser(level)
849 {
850 link_info_parser.push_back(start_event);
851 link_info_parser.push_back(end_event);
852 link_info_parser.push_back(poly_start);
853 link_info_parser.push_back(poly_end);
854 link_info_parser.push_back(bitmap_start);
855 link_info_parser.push_back(bitmap_end);
856#if 0
857 link_info_parser.push_back(func1);
858 link_info_parser.push_back(func1_scale);
859 link_info_parser.push_back(func2);
860 link_info_parser.push_back(func2_scale);
861 link_info_parser.push_back(func3);
862 link_info_parser.push_back(func3_scale);
863 link_info_parser.push_back(func4);
864 link_info_parser.push_back(func4_scale);
865#endif
866 link_info_parser.push_back(polygon_posx_func);
867 link_info_parser.push_back(polygon_posy_func);
868 link_info_parser.push_back(polygon_posz_func);
869 link_info_parser.push_back(bitmap_posx_func);
870 link_info_parser.push_back(bitmap_posy_func);
871 link_info_parser.push_back(bitmap_posz_func);
872 link_info_parser.push_back(polygon_rotx_func);
873 link_info_parser.push_back(polygon_roty_func);
874 link_info_parser.push_back(polygon_rotz_func);
875 link_info_parser.push_back(sound_channel_func);
876 }
877
878 virtual std::string Create(LinkInfo t) const
879 {
880 return link_info_parser.Create(t);
881 }
882 virtual LinkInfo Parse(std::string s, bool &success) const
883 {
884 return link_info_parser.Parse(s,success);
885 }
886private:
887 IntParser start_event;
888 IntParser end_event;
889 PolyHandleParser poly_start;
890 PolyHandleParser poly_end;
891 BitmapHandleParser bitmap_start;
892 BitmapHandleParser bitmap_end;
893#if 0
894 FunctionParser func1;
895 BoolParser func1_scale;
896 FunctionParser func2;
897 BoolParser func2_scale;
898 FunctionParser func3;
899 BoolParser func3_scale;
900 FunctionParser func4;
901 BoolParser func4_scale;
902#endif
903 IntParser polygon_posx_func;
904 IntParser polygon_posy_func;
905 IntParser polygon_posz_func;
906 IntParser bitmap_posx_func;
907 IntParser bitmap_posy_func;
908 IntParser bitmap_posz_func;
909 IntParser polygon_rotx_func;
910 IntParser polygon_roty_func;
911 IntParser polygon_rotz_func;
912 IntParser sound_channel_func;
913 StructParser<LinkInfo> link_info_parser;
914};
915
916class NDimParser : public ParserPair<NDim<float,Point>*>
917{
918public:
919 NDimParser(int level) : pointparser(level+1) { }
920 virtual std::string Create(NDim<float,Point> *t) const
921 {
922 int sz = t->Count().size();
923 std::cout << "sz: " << sz << std::endl;
924 float *array = new float[sz];
925 for(int i=0;i<sz;i++) { array[i] = 0.0; }
926 std::string ss = "{";
927 ss += intparser.Create(sz);
928 ss += '#';
929 ss += CreateRecurse(t, array, sz,sz);
930 ss += '}';
931 return ss;
932 }
933 virtual NDim<float,Point> *Parse(std::string s, bool &success) const
934 {
935 return NULL;
936 }
937
938 std::string CreateRecurse(NDim<float,Point> *t, float *array, int sz, int orig_sz) const
939 {
940 std::string s = "";
941 if (sz==0) return s;
942 //float val = array[sz-1];
943 array[sz-1]=0.0;
944 s+=CreateRecurse(t, array, sz-1, orig_sz);
945 array[sz-1]=1.0;
946 s+=CreateRecurse(t, array, sz-1, orig_sz);
947 array[sz-1]=0.0;
948 s+='[';
949 s+=pointparser.Create(t->Map(array, orig_sz));
950 s+=']';
951 array[sz-1]=1.0;
952 s+='[';
953 s+=pointparser.Create(t->Map(array, orig_sz));
954 s+=']';
955 //std::string s;
956 return s;
957 }
958 IntParser intparser;
959 PointParser pointparser;
960};
961
962class PosInfoParser : public ParserPair<PosInfo>
963{
964public:
965 PosInfoParser(int level) : curve(level+1), struct_parser(level)
966 {
967 struct_parser.push_back(link);
968 struct_parser.push_back(curve);
969 }
970 virtual std::string Create(PosInfo t) const
971 {
972 return struct_parser.Create(t);
973 }
974 virtual PosInfo Parse(std::string s, bool &success) const
975 {
976 return struct_parser.Parse(s,success);
977 }
978private:
979 IntParser link;
980 NDimParser curve;
981#if 0
982 CurveIn3dParser curve;
983#endif
984 StructParser<PosInfo> struct_parser;
985};
986
987class MousePlaneParser : public ParserPair<MousePlane*>
988{
989public: // TODO
990 MousePlaneParser(int level) { }
991 virtual std::string Create(MousePlane* t) const
992 {
993 if (t==0) return "_";
994 return "_";
995 }
996 virtual MousePlane* Parse(std::string s, bool &success) const
997 {
998 if (s.length()==1 && s[0]=='_') { success = true; return 0; }
999 success=true;
1000 return 0;
1001 }
1002
1003private:
1004};
1005
1006class StateInfo2Parser : public ParserPair<StateInfo2>
1007{
1008public:
1009 StateInfo2Parser(int level) : enable_obj(boolparser, level+1), plane(level+1), struct_parser(level)
1010 {
1011 struct_parser.push_back(enable_obj);
1012 struct_parser.push_back(plane);
1013 }
1014 virtual std::string Create(StateInfo2 t) const
1015 {
1016 return struct_parser.Create(t);
1017 }
1018 virtual StateInfo2 Parse(std::string s, bool &success) const
1019 {
1020 return struct_parser.Parse(s,success);
1021 }
1022
1023private:
1024 BoolParser boolparser;
1025 ArrayParser<bool> enable_obj;
1026 MousePlaneParser plane;
1027 StructParser<StateInfo2> struct_parser;
1028};
1029
1030class SequencerParser : public ParserPair<Sequencer2*>
1031{
1032public:
1033 SequencerParser() :
1034 events_parser(eventinfo_parser, 1),
1035 eventinfo_parser(1),
1036 linkage_parser(linkageinfo_parser, 1),
1037 linkageinfo_parser(1),
1038 links_parser(linkinfo_parser, 1),
1039 linkinfo_parser(1),
1040 pos_parser(posinfo_parser, 1),
1041 posinfo_parser(1),
1042 states_parser(stateinfo2_parser,1),
1043 stateinfo2_parser(1),
1044 struct_parser(0)
1045 {
1046 struct_parser.push_back(events_parser);
1047 struct_parser.push_back(linkage_parser);
1048 struct_parser.push_back(links_parser);
1049 struct_parser.push_back(pos_parser);
1050 struct_parser.push_back(states_parser);
1051 }
1052 struct SeqData
1053 {
1054 std::vector<EventInfo> events;
1055 std::vector<LinkageInfo> linkage;
1056 std::vector<LinkInfo> links;
1057 std::vector<PosInfo> pos;
1058 std::vector<StateInfo2> states;
1059 };
1060 class SeqDataSequencer2 : public Sequencer2
1061 {
1062 public:
1063 SeqDataSequencer2(SeqData &data) : data(data) { }
1064 virtual int NumEvents() const { return data.events.size(); }
1065 virtual EventInfo Event(int i) const { return data.events[i]; }
1066
1067 virtual int NumLinks() const { return data.linkage.size(); }
1068 virtual LinkageInfo Linkage(int i) const { return data.linkage[i]; }
1069 virtual LinkInfo Links(int i) const { return data.links[i]; }
1070 // positions
1071 virtual int NumPositions() const { return data.pos.size(); }
1072 virtual PosInfo Positions(int i) const { return data.pos[i]; }
1073 // states
1074 virtual int NumStates() const { return data.states.size(); }
1075 virtual StateInfo2 States(int i) const { return data.states[i]; }
1076
1077 private:
1078 SeqData &data;
1079 };
1080 virtual std::string Create(Sequencer2* t) const
1081 {
1082 SeqData data;
1083 int s1 = t->NumEvents();
1084 for(int i1=0;i1<s1;i1++)
1085 {
1086 data.events.push_back(t->Event(i1));
1087 }
1088 int s2 = t->NumLinks();
1089 for(int i2=0;i2<s2;i2++)
1090 {
1091 data.linkage.push_back(t->Linkage(i2));
1092 data.links.push_back(t->Links(i2));
1093 }
1094 int s3 = t->NumPositions();
1095 for(int i3=0;i3<s3;i3++)
1096 {
1097 data.pos.push_back(t->Positions(i3));
1098 }
1099 int s4 = t->NumStates();
1100 for(int i4=0;i4<s4;i4++)
1101 {
1102 data.states.push_back(t->States(i4));
1103 }
1104 return struct_parser.Create(data);
1105 }
1106 virtual Sequencer2* Parse(std::string s, bool &success) const
1107 {
1108 SeqData data = struct_parser.Parse(s, success);
1109 if (!success) return 0;
1110 SeqData *heap = new SeqData(data);
1111 return new SeqDataSequencer2(*heap);
1112 }
1113private:
1114 VectorParser<EventInfo> events_parser;
1115 EventInfoParser eventinfo_parser;
1116 VectorParser<LinkageInfo> linkage_parser;
1117 LinkageInfoParser linkageinfo_parser;
1118 VectorParser<LinkInfo> links_parser;
1119 LinkInfoParser linkinfo_parser;
1120 VectorParser<PosInfo> pos_parser;
1121 PosInfoParser posinfo_parser;
1122 VectorParser<StateInfo2> states_parser;
1123 StateInfo2Parser stateinfo2_parser;
1124 StructParser<SeqData> struct_parser;
1125};
1126#endif
PT Map(PT p, int face, int point, void *data)
Definition GameApiTest.cc:19
Definition EffectI.hh:22
virtual I Size() const =0
Definition GraphI.hh:826
virtual int SizeY() const =0
virtual int SizeX() const =0
virtual C Map(int x, int y) const =0
Definition EffectI.hh:212
virtual Vector PointNormal(int face, int point) const =0
virtual Point FacePoint(int face, int point) const =0
virtual unsigned int Color(int face, int point) const =0
virtual int NumPoints(int face) const =0
virtual Point2d TexCoord(int face, int point) const =0
virtual int NumFaces() const =0
virtual B Index(A a) const =0
virtual B Map(I *array, int size) const =0
virtual std::vector< I > Count() const =0
virtual int NumStates() const =0
virtual LinkInfo Links(int i) const =0
virtual StateInfo2 States(int i) const =0
virtual PosInfo Positions(int i) const =0
virtual EventInfo Event(int i) const =0
virtual LinkageInfo Linkage(int i) const =0
virtual int NumEvents() const =0
virtual int NumPositions() const =0
virtual int NumLinks() const =0
float dy
Definition VectorTools.hh:268
float dz
Definition VectorTools.hh:268
float dx
Definition VectorTools.hh:268
background color
Definition gameapi_example.php:46
PT func2(int face, int point, EveryApi &ev)
Definition test.cpp:27
convert($d)
Definition mesh_api.php:35
iVBORw0KGgoAAAANSUhEUgAAANcAAAB5CAMAAACdtUQZAAAA51BMVEX</div ></div >< div style="padding: 0px 0px; width: 1324px;">< div style="height: 400px; width: 1324px;"></div >< div itemscope itemtype="https: </div><div itemscope itemtype="https:</div >< div itemscope itemtype="https: </div></div><p><div style="padding:0px 0px;width:1324px;"><div></div><div itemscope itemtype="https:< ul >< li >< b > Application name
8AkrcAgqgAs9wqQ0ey2tkAo8gAuuQfeI4hPUH09fXHy8z4+fng4uNKXF/Lz9BzfoAcgpkQMTUAKjAbOT4Qr9AXhJ8Rl7ktMCwTosA...
Definition meshpage.php:1610
lazy data
Definition meshpage.php:1583
n< br > font size
Definition meshpage.php:3536
void array(const std::string &type, Module &m)
Definition bootstrap.hpp:23
Definition Parser.hh:25
std::vector< int > owned
Definition Parser.hh:27
~BitmapArrayHandle()
Definition Parser.hh:28
std::vector< BitmapHandle * > vec
Definition Parser.hh:26
Definition Parser.hh:15
~BitmapColorHandle()
Definition Parser.hh:17
Bitmap< Color > * bm
Definition Parser.hh:16
Definition Parser.hh:8
int id
Definition Parser.hh:9
virtual ~BitmapHandle()
Definition Parser.hh:10
Definition Parser.hh:20
Bitmap< int > * bm
Definition Parser.hh:21
~BitmapIntHandle()
Definition Parser.hh:22
Definition Parser.hh:43
Bitmap< Pos > * bm
Definition Parser.hh:44
~BitmapPosHandle()
Definition Parser.hh:45
Definition Parser.hh:48
~BitmapTileHandle()
Definition Parser.hh:51
Bitmap< Color > * bm
Definition Parser.hh:49
int tile_sy
Definition Parser.hh:50
int tile_sx
Definition Parser.hh:50
Array< int, FaceCollection * > * collarray
Definition Parser.hh:60
FaceCollection * coll
Definition Parser.hh:58
bool collarrayowned
Definition Parser.hh:62
bool padding1
Definition Parser.hh:64
bool collowned
Definition Parser.hh:61
~FaceCollPolyHandle()
Definition Parser.hh:66
FaceCollPolyHandle()
Definition Parser.hh:56
bool padding2
Definition Parser.hh:65
int id
Definition Parser.hh:57
float x
Definition VectorTools.hh:911
float y
Definition VectorTools.hh:911
float x
Definition Parser.cc:60
float y
Definition Parser.cc:60
float z
Definition Parser.cc:60
Definition Common2.hh:717
virtual ~PolyHandle()
Definition Common2.hh:719
int id
Definition Common2.hh:718
W link(std::string url, std::string str, int size_x, int size_y, int font_size, unsigned int font_colour, int align)
Definition ui.cc:731