equal
deleted
inserted
replaced
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
24 * THE SOFTWARE. |
24 * THE SOFTWARE. |
25 */ |
25 */ |
26 |
26 |
27 #include "serialize.h" |
27 #include "serialize.h" |
|
28 #include <vector> |
28 #include <string> |
29 #include <string> |
29 #include <sstream> |
30 #include <sstream> |
30 |
31 |
31 Indexer vertex_index, shape_index; |
32 Indexer vertex_index, shape_index; |
|
33 vector<Vertex*> vertices; |
32 |
34 |
33 void resetSerializer() |
35 void resetSerializer() |
34 { |
36 { |
35 vertex_index.reset(); |
37 vertex_index.reset(); |
36 shape_index.reset(); |
38 shape_index.reset(); |
|
39 vertices.clear(); |
37 } |
40 } |
38 |
41 |
39 bool Indexer::get(void *o, int &retidx) |
42 bool Indexer::get(void *o, int &retidx) |
40 { |
43 { |
41 map <void *, int>::iterator i; |
44 map <void *, int>::iterator i; |
51 retidx = i->second; |
54 retidx = i->second; |
52 return true; |
55 return true; |
53 } |
56 } |
54 } |
57 } |
55 |
58 |
56 Shape *loadShape(istream &st) |
59 Shape *loadShape(istream &st, Material *mat) |
57 { |
60 { |
58 string s; |
61 string s; |
59 istringstream is; |
62 istringstream is; |
60 getline(st, s, ','); |
63 for (;;) |
61 trim(s); |
|
62 if (s.compare("(box") == 0) |
|
63 { |
64 { |
64 Vector3 L,H; |
|
65 st >> L; |
|
66 getline(st, s, ','); |
65 getline(st, s, ','); |
67 st >> H; |
66 trim(s); |
68 getline(st, s, ')'); |
67 |
69 return new Box(L, H, new Material(Colour(1,1,1))); |
68 // Vertex |
|
69 if (s.compare("(v") == 0) |
|
70 { |
|
71 Vector3 P; |
|
72 st >> P; |
|
73 getline(st, s, ')'); |
|
74 vertices.push_back(new Vertex(P)); |
|
75 getline(st, s, ','); |
|
76 continue; |
|
77 } |
|
78 |
|
79 // NormalVertex |
|
80 if (s.compare("(vn") == 0) |
|
81 { |
|
82 Vector3 P,N; |
|
83 st >> P; |
|
84 getline(st, s, ','); |
|
85 st >> N; |
|
86 getline(st, s, ')'); |
|
87 vertices.push_back(new NormalVertex(P,N)); |
|
88 getline(st, s, ','); |
|
89 continue; |
|
90 } |
|
91 |
|
92 // Triangle |
|
93 if (s.compare("(t") == 0) |
|
94 { |
|
95 int a,b,c; |
|
96 st >> a; |
|
97 getline(st, s, ','); |
|
98 st >> b; |
|
99 getline(st, s, ','); |
|
100 st >> c; |
|
101 getline(st, s, ')'); |
|
102 return new Triangle(vertices[a], vertices[b], vertices[c], mat); |
|
103 } |
|
104 |
|
105 // box |
|
106 if (s.compare("(box") == 0) |
|
107 { |
|
108 Vector3 L,H; |
|
109 st >> L; |
|
110 getline(st, s, ','); |
|
111 st >> H; |
|
112 getline(st, s, ')'); |
|
113 return new Box(L, H, mat); |
|
114 } |
|
115 |
|
116 // Sphere |
|
117 if (s.compare("(sphere") == 0) |
|
118 { |
|
119 Vector3 center; |
|
120 Float radius; |
|
121 st >> center; |
|
122 getline(st, s, ','); |
|
123 st >> radius; |
|
124 getline(st, s, ')'); |
|
125 return new Sphere(center, radius, mat); |
|
126 } |
|
127 |
|
128 // else... |
|
129 return NULL; |
70 } |
130 } |
71 if (s.compare("(sphere") == 0) |
|
72 { |
|
73 Vector3 center; |
|
74 Float radius; |
|
75 st >> center; |
|
76 getline(st, s, ','); |
|
77 st >> radius; |
|
78 getline(st, s, ')'); |
|
79 return new Sphere(center, radius, new Material(Colour(1,1,1))); |
|
80 } |
|
81 return NULL; |
|
82 } |
131 } |
83 |
132 |
84 ostream & operator<<(ostream &st, Shape &o) |
133 ostream & operator<<(ostream &st, Shape &o) |
85 { |
134 { |
86 return o.dump(st); |
135 return o.dump(st); |