rendered paste body#include <fstream>
#include <string>
#include <iostream>
class ObjModel {
private:
float *x; // x coord
float *y; // y coord
float *z; // z coord
float *t1,*t2,*t3;
float *n1,*n2,*n3;
int *f1,*f2,*f3;
int *ft1,*ft2,*ft3;
int *fn1,*fn2,*fn3;
int vNum;
int fNum;
int vtNum;
int vnNum;
public:
char *file;
void Read();
void Draw();
};
void ObjModel::Read() {
char cchar[512];
int vv=1;
int ff=0;
int ttft1,ttft2,ttft3,tf1,tf2,tf3,ttf1,ttf2,ttf3,ft1f1,ft1ft1,ft1f2,ft1ft2,ft1f3,ft1ft3;
int ft2fn1,ft2fn2,ft2fn3,ft3f1,ft3f2,ft3f3,ft3fn1,ft3fn2,ft3fn3;
vNum=0;
fNum=0;
std::string line;
char tmp[10];
std::ifstream ModelFile (file);
std::cout<<"open"<<std::endl;
if (ModelFile.is_open()) {
std::cout<<"opened"<<std::endl;
while (! ModelFile.eof() ) {
getline (ModelFile,line);
if(line.substr(0,1)=="v") {
vNum++; } // we want to know how big array to make for vert info
if(line.substr(0,1)=="f") {
fNum++; } // we also want to know how big array to make for face info
if(line.substr(0,2)=="vt") {
vtNum++; }
if(line.substr(0,2)=="vn") {
vnNum++; }
}
ModelFile.close();
vNum++;
fNum++;
vtNum++;
vnNum++;
x = (float*)malloc(vNum * sizeof(float));
z = (float*)malloc(vNum * sizeof(float));
y = (float*)malloc(vNum * sizeof(float));
t1 = (float*)malloc(vtNum * sizeof(float));
t2 = (float*)malloc(vtNum * sizeof(float));
t3 = (float*)malloc(vtNum * sizeof(float));
n1 = (float*)malloc(vnNum * sizeof(float));
n2 = (float*)malloc(vnNum * sizeof(float));
n3 = (float*)malloc(vnNum * sizeof(float));
f1 = (int*)malloc(fNum * sizeof(int));
f2 = (int*)malloc(fNum * sizeof(int));
f3 = (int*)malloc(fNum * sizeof(int));
ft1 = (int*)malloc(fNum * sizeof(int));
ft2 = (int*)malloc(fNum * sizeof(int));
ft3 = (int*)malloc(fNum * sizeof(int));
fn1 = (int*)malloc(fNum * sizeof(int));
fn2 = (int*)malloc(fNum * sizeof(int));
fn3 = (int*)malloc(fNum * sizeof(int));
std::ifstream ModelFile(file);
if(ModelFile.is_open()) {
while(!ModelFile.eof()){
getline (ModelFile,line);
if(line.substr(0,2)=="v ") { // v = vertecs
strcpy(cchar, line.c_str());
int result = sscanf (cchar,"%s %f %f %f", tmp, &x[vv], &y[vv], &z[vv]);
std::cout<<tmp<<": "<<x[vv] << " " << y[vv] << " "<<z[vv] << std::endl;
vv++;
}
/* if(line.substr(0,2)=="vt") { // v = vertecs
strcpy(cchar, line.c_str());
int result = sscanf (cchar,"%s %f %f %f", tmp, &t1[vv], &t2[vv], &t3[vv]);
//std::cout << "Textures: " << t1[vv] << " "<< t2[vv] << " " << t3[vv] << std::endl;
vv++;
}
if(line.substr(0,2)=="vn") { // v = vertecs
strcpy(cchar, line.c_str());
int result = sscanf (cchar,"%s %f %f %f", tmp, &n1[vv], &y[vv], &z[vv]);
vv++;
}*/
if(line.substr(0,1)=="f") { // f = face
strcpy(cchar, line.c_str());
sscanf (cchar,"%s %d %d %d", tmp, &f1[ff], &f2[ff], &f3[ff]); // only face info
// int resulft2=sscanf(cchar,"%s %d/%d %d/%d %d/%d", tmp, &ft1f1,&ft1ft1, &ft1f2,&ft1ft2, &ft1f3,&ft1ft3); // face and texture
// int resulft3=sscanf(cchar,"%s %d/%d/%d %d/%d/%d %d/%d/%d", tmp, &ttf1,&ttft1,&ft2fn1, &ttf2,&ttft2,&ft2fn2, &ttf3,&ttft3,&ft2fn3); // face, text and norms
// int result4=sscanf(cchar,"%s %d//%d %d//%d %d//%d", tmp, &ft3f1,&ft3fn1, &ft3f2,&ft3fn2, &ft3f3,&ft3fn3); // face and norms
// if(result>3) {
//f1[ff]=tf1; f2[ff]=tf2; f3[ff]=tf3;
//std::cout<<"Model d"<<std::endl;
// }/*
/* else if(resulft2>6) {
f1[ff]=ft1f1; f2[ff]=ft1f2; f3[ff]=ft1f3;
ft1[ff]=ft1ft1; ft2[ff]=ft1ft2; ft3[ff]=ft1ft3;
std::cout << "model faces: " << f1[ff] << f2[ff] <<" "<< f3[ff] <<std::endl;
}
else if(resulft3>9) {
f1[ff]=ttf1; f2[ff]=ttf2; f3[ff]=ttf3;
ft1[ff]=ttft1; ft2[ff]=ttft2; ft3[ff]=ttft3;
fn1[ff]=ft2fn1; fn2[ff]=ft2fn2; fn3[ff]=ft2fn3;
// std::cout << "face: "<<f1[ff]<<" "<<f2[ff]<<" "<<f3[ff]<<std::endl;
}
else if(result4>6) {
f1[ff]=ft3f1; f2[ff]=ft3f2; f3[ff]=ft3f3;
fn1[ff]=ft3fn1; fn2[ff]=ft3fn2; fn3[ff]=ft3fn3;
std::cout << "Model, normals"<<std::endl;
}*/
/* else {
std::cout << "hmm" << std::endl;
}*/
ff++;
}
}
}
ModelFile.close();
}
return;
}
void ObjModel::Draw() {
//std::cout<< "testi"<<std::endl;
glBegin(GL_TRIANGLES);
for(int i=0; i< fNum-1; i++) {
//glTexCoord2d(t1[ft1[i]], t2[ft1[i]]);
glVertex3f ( x[f1[i]] , y[f1[i]] , z[f1[i]]);
//glTexCoord2d(t1[ft2[i]], t2[ft2[i]]);
glVertex3f ( x[f2[i]] , y[f2[i]] , z[f2[i]]);
//glTexCoord2d(t1[ft2[i]], t2[ft2[i]]);
glVertex3f ( x[f3[i]] , y[f3[i]] , z[f3[i]]);
}
glEnd();
return;
}