//Neaded Structures struct Face{long v[3], vt[3], vn[3];}; struct Model{long vc,vtc,vnc,fc; Vertex3f *v,*vn; Vertex2f *vt; Face *f;}; //Arra for our .OBJ models Model Models[16]; //Fills given array (out) with part of other array (in) , s - start position, l - length bool mid(char *in, char *out, int s, int l) { l=s+l;int i=s; while(i<=l){out[i-s]=in[i];i++;}out[l-s]=0; return true; } //Loading .OBJ file into array void LoadModel(char* szFileName, Model &mdl) { char line[64]; long vc=0,vtc=0,vnc=0,fc=0; ifstream file(szFileName); while(file.getline(line,64)) { if(line[0]=='v' && line[1]==' ') vc++; if(line[0]=='v' && line[1]=='t' && line[2]==' ') vtc++; if(line[0]=='v' && line[1]=='n' && line[2]==' ') vnc++; if(line[0]=='f' && line[1]==' ') fc++; } mdl.vc = vc; mdl.v = new Vertex3f[vc ]; vc = 0; mdl.vtc = vtc; mdl.vt = new Vertex2f[vtc]; vtc = 0; mdl.vnc = vnc; mdl.vn = new Vertex3f[vnc]; vnc = 0; mdl.fc = fc; mdl.f = new Face[fc]; fc = 0; int space[9], i, n; char buffer[16]; file.close(); file.clear(); file.open(szFileName); while(file.getline(line,64)) { // Finding " " or "/" symbols in line n=0; for(i=0;i<64;i++) if(line[i]==' ' || line[i]=='/') space[n++]=i; if(line[0]=='v' && line[1]==' ') { mid(line,buffer,space[0]+1,16); mdl.v[vc].x=atof(buffer); mid(line,buffer,space[1]+1,16); mdl.v[vc].y=atof(buffer); mid(line,buffer,space[2]+1,16); mdl.v[vc].z=atof(buffer); vc++; } if(line[0]=='v' && line[1]=='t' && line[2]==' ') { mid(line,buffer,space[0]+1,16); mdl.vt[vtc].x=atof(buffer); mid(line,buffer,space[1]+1,16); mdl.vt[vtc].y=atof(buffer); vtc++; } if(line[0]=='v' && line[1]=='n' && line[2]==' ') { mid(line,buffer,space[0]+1,16); mdl.vn[vnc].x=atof(buffer); mid(line,buffer,space[1]+1,16); mdl.vn[vnc].y=atof(buffer); mid(line,buffer,space[2]+1,16); mdl.vn[vnc].z=atof(buffer); vnc++; } if(line[0]=='f' && line[1]==' ') { mid(line,buffer,space[0]+1,16); mdl.f[fc].v [0]=atof(buffer)-1; mid(line,buffer,space[1]+1,16); mdl.f[fc].vt[0]=atof(buffer)-1; mid(line,buffer,space[2]+1,16); mdl.f[fc].vn[0]=atof(buffer)-1; mid(line,buffer,space[3]+1,16); mdl.f[fc].v [1]=atof(buffer)-1; mid(line,buffer,space[4]+1,16); mdl.f[fc].vt[1]=atof(buffer)-1; mid(line,buffer,space[5]+1,16); mdl.f[fc].vn[1]=atof(buffer)-1; mid(line,buffer,space[6]+1,16); mdl.f[fc].v [2]=atof(buffer)-1; mid(line,buffer,space[7]+1,16); mdl.f[fc].vt[2]=atof(buffer)-1; mid(line,buffer,space[8]+1,16); mdl.f[fc].vn[2]=atof(buffer)-1; fc++; } } file.close(); } //Drawing loaded .OBJ model void DrawModel(Model &mdl, GLuint &texture) { glBegin(GL_TRIANGLES); for(long i=0;i