#include #include #include #include #include #include #include "ModelViewMatrix.h" using namespace std; struct Face{ vertex vert[3]; double ambient[3]; double refractive; double reflective; double diffuse[3]; double specular[3]; double shininess; double emission[3]; Mat4 matrix; Mat4 inverseMatrix; double dielectric; double reflectivity; double translucency; }; class Obj{ public: vector v; vector vt; vector vn; vector faces; double center[3]; double radius; void setMatrices(Mat4 m, Mat4 mi){ for(int i = 0; i < faces.size(); i++){ faces[i].matrix = m; faces[i].inverseMatrix = mi; } } void setDielectric(double a){ for(int i = 0; i < faces.size(); i++){ faces[i].dielectric = a; } } void setReflectivity(double a){ for(int i = 0; i < faces.size(); i++){ faces[i].reflectivity = a; } } void setTranslucency(double a){ for(int i = 0; i < faces.size(); i++){ faces[i].translucency = a; } } }; double quickDist(double x, double y, double z, double a, double b, double c){ return (x-a)*(x-a) + (y-b)*(y-b) + (z-c)*(z-c); } //void printObj(Obj obj){ // for(int i = 0; i < obj.faces.size(); i++){ // cout // } //} Obj loadObj(string filename){ char line[1000]; char command[1000]; Obj obj; for(int i = 0; i < 3; i++) obj.center[i] = 0; obj.radius = 0; double numverts = 0; FILE *fp ; fp = fopen(filename.c_str(), "rt") ; while (!feof(fp)) { cout << setiosflags(ios::fixed) << setprecision(5); fgets(line,sizeof(line),fp) ; if (feof(fp)) break ; if (line[0] == '#') continue ; // Comment lines int num = sscanf(line, "%s", command) ; if (num != 1) continue ; // Blank line etc. // Now, we simply parse the file by looking at the first line for the // various commands /************** OBJ **********/ if (!strcmp(command, "v")) { vertex v; double x, y, z; int num = sscanf(line, "%s %f %f %f", command, &v.x, &v.y, &v.z) ; //int num = sscanf(line, "%s %lf %lf %lf", command, &x, &y, &z) ; if (num != 4) { fprintf(stderr, "v x y z") ; exit(1) ; } assert(!strcmp(command,"v")) ; //v.init(); //v.x = x; //v.y = y; //v.z = z; obj.center[0] += v.x; obj.center[1] += v.y; obj.center[2] += v.z; numverts++; obj.v.push_back(v); cout << "v " << v.x << " " << v.y<< " " << v.z << endl; }else if(!strcmp(command,"vt")){ vertex vt; int num = sscanf(line, "%s %f %f", command, &vt.u, &vt.v); if (num != 3) { fprintf(stderr, "vt u v") ; exit(1) ; } assert(!strcmp(command,"vt")) ; obj.vt.push_back(vt); cout << "vt " << vt.u << " " << vt.v << endl; }else if(!strcmp(command,"vn")){ vertex vn; int num = sscanf(line, "%s %f %f %f", command, &vn.x, &vn.y, &vn.z); if (num != 4) { fprintf(stderr, "vn x y z") ; exit(1) ; } assert(!strcmp(command,"vn")) ; obj.vn.push_back(vn); cout << "vn " << vn.x << " " << vn.y<< " " << vn.z << endl; }else if(!strcmp(command,"f")){ Face f; int v0,t0,n0,v1,t1,n1,v2,t2,n2; int num = sscanf(line, "%s %d/%d/%d %d/%d/%d %d/%d/%d", command, &v0,&t0,&n0,&v1,&t1,&n1,&v2,&t2,&n2); cout << "f " <