rendered paste body//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<mdl.fc;i++)
{
glNormal3f( mdl.vn[ mdl.f[i].vn[0] ].x, mdl.vn[ mdl.f[i].vn[0] ].y, mdl.vn[ mdl.f[i].vn[0] ].z );
glTexCoord2f( mdl.vt[ mdl.f[i].vt[0] ].x, mdl.vt[ mdl.f[i].vt[0] ].y );
glVertex3f( mdl.v [ mdl.f[i].v [0] ].x, mdl.v [ mdl.f[i].v [0] ].y, mdl.v [ mdl.f[i].v [0] ].z );
glNormal3f( mdl.vn[ mdl.f[i].vn[1] ].x, mdl.vn[ mdl.f[i].vn[1] ].y, mdl.vn[ mdl.f[i].vn[1] ].z );
glTexCoord2f( mdl.vt[ mdl.f[i].vt[1] ].x, mdl.vt[ mdl.f[i].vt[1] ].y );
glVertex3f( mdl.v [ mdl.f[i].v [1] ].x, mdl.v [ mdl.f[i].v [1] ].y, mdl.v [ mdl.f[i].v [1] ].z );
glNormal3f( mdl.vn[ mdl.f[i].vn[2] ].x, mdl.vn[ mdl.f[i].vn[2] ].y, mdl.vn[ mdl.f[i].vn[2] ].z );
glTexCoord2f( mdl.vt[ mdl.f[i].vt[2] ].x, mdl.vt[ mdl.f[i].vt[2] ].y );
glVertex3f( mdl.v [ mdl.f[i].v [2] ].x, mdl.v [ mdl.f[i].v [2] ].y, mdl.v [ mdl.f[i].v [2] ].z );
}
glEnd();
}