ccdemos/common_ply.h
branchpyrit
changeset 39 7079dcc3bd74
child 41 c1080cb5bd6d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ccdemos/common_ply.h	Fri Dec 14 16:51:22 2007 +0100
@@ -0,0 +1,81 @@
+#include <iostream>
+#include <fstream>
+#include <iomanip>
+
+void load_ply(Raytracer &rt, const char *filename, Material *mat, Vector3 scale, Vector3 transp)
+{
+	vector<NormalVertex*> vertices;
+	vector<Vector3> normals;
+	vector<int> vertex_face_num;
+	ifstream f(filename);
+	string token = "a";
+	if (!f.is_open())
+	{
+		cout << "File not found: " << filename <<endl;
+		exit(1);
+	}
+	// read header
+	int vertex_num, face_num;
+	while (token != "end_header")
+	{
+		f >> token;
+		if (token == "element")
+		{
+			f >> token;
+			if (token == "vertex")
+				f >> vertex_num;
+			if (token == "face")
+				f >> face_num;
+		}
+		f.ignore(1000,'\n');
+	}
+
+	// read vertices
+	Vector3 P;
+	int num = vertex_num;
+	while (num--)
+	{
+		f >> P.x >> P.y >> P.z;
+		P.x = scale.x*P.x + transp.x;
+		P.y = scale.y*P.y + transp.y;
+		P.z = scale.z*P.z + transp.z;
+		vertices.push_back(new NormalVertex(P));
+		normals.push_back(Vector3());
+		vertex_face_num.push_back(0);
+		f.ignore(1000,'\n');
+	}
+
+	// read faces
+	Triangle *face;
+	int v1, v2, v3;
+	while (face_num--)
+	{
+		f >> num;
+		if (num != 3)
+		{
+			printf("ply error: faces of %d vertices not supported", num);
+			continue;
+		}
+		f >> v1 >> v2 >> v3;
+		face = new Triangle(vertices.at(v1), vertices.at(v3), vertices.at(v2), mat);
+		rt.addshape(face);
+		face->setSmooth();
+
+		normals.at(v1) += face->getNormal();
+		vertex_face_num.at(v1)++;
+		normals.at(v2) += face->getNormal();
+		vertex_face_num.at(v2)++;
+		normals.at(v3) += face->getNormal();
+		vertex_face_num.at(v3)++;
+		f.ignore(1000,'\n');
+	}
+
+	for (int i = 0; i < vertex_num; i++)
+	{
+		normals.at(i) /= vertex_face_num.at(i);
+		normals.at(i).normalize();
+		vertices.at(i)->N = normals.at(i);
+	}
+
+	f.close();
+}