src/serialize.cc
branchpyrit
changeset 80 907929fa9b59
parent 78 9569e9f35374
child 91 9d66d323c354
--- a/src/serialize.cc	Wed Apr 23 14:39:33 2008 +0200
+++ b/src/serialize.cc	Wed Apr 23 19:35:03 2008 +0200
@@ -25,15 +25,18 @@
  */
 
 #include "serialize.h"
+#include <vector>
 #include <string>
 #include <sstream>
 
 Indexer vertex_index, shape_index;
+vector<Vertex*> vertices;
 
 void resetSerializer()
 {
 	vertex_index.reset();
 	shape_index.reset();
+	vertices.clear();
 }
 
 bool Indexer::get(void *o, int &retidx)
@@ -53,32 +56,78 @@
 	}
 }
 
-Shape *loadShape(istream &st)
+Shape *loadShape(istream &st, Material *mat)
 {
 	string s;
 	istringstream is;
-	getline(st, s, ',');
-	trim(s);
-	if (s.compare("(box") == 0)
+	for (;;)
 	{
-		Vector3 L,H;
-		st >> L;
 		getline(st, s, ',');
-		st >> H;
-		getline(st, s, ')');
-		return new Box(L, H, new Material(Colour(1,1,1)));
+		trim(s);
+
+		// Vertex
+		if (s.compare("(v") == 0)
+		{
+			Vector3 P;
+			st >> P;
+			getline(st, s, ')');
+			vertices.push_back(new Vertex(P));
+			getline(st, s, ',');
+			continue;
+		}
+
+		// NormalVertex
+		if (s.compare("(vn") == 0)
+		{
+			Vector3 P,N;
+			st >> P;
+			getline(st, s, ',');
+			st >> N;
+			getline(st, s, ')');
+			vertices.push_back(new NormalVertex(P,N));
+			getline(st, s, ',');
+			continue;
+		}
+
+		// Triangle
+		if (s.compare("(t") == 0)
+		{
+			int a,b,c;
+			st >> a;
+			getline(st, s, ',');
+			st >> b;
+			getline(st, s, ',');
+			st >> c;
+			getline(st, s, ')');
+			return new Triangle(vertices[a], vertices[b], vertices[c], mat);
+		}
+
+		// box
+		if (s.compare("(box") == 0)
+		{
+			Vector3 L,H;
+			st >> L;
+			getline(st, s, ',');
+			st >> H;
+			getline(st, s, ')');
+			return new Box(L, H, mat);
+		}
+
+		// Sphere
+		if (s.compare("(sphere") == 0)
+		{
+			Vector3 center;
+			Float radius;
+			st >> center;
+			getline(st, s, ',');
+			st >> radius;
+			getline(st, s, ')');
+			return new Sphere(center, radius, mat);
+		}
+
+		// else...
+		return NULL;
 	}
-	if (s.compare("(sphere") == 0)
-	{
-		Vector3 center;
-		Float radius;
-		st >> center;
-		getline(st, s, ',');
-		st >> radius;
-		getline(st, s, ')');
-		return new Sphere(center, radius, new Material(Colour(1,1,1)));
-	}
-	return NULL;
 }
 
 ostream & operator<<(ostream &st, Shape &o)