All pastes #609039 Raw Edit

Untitled

public text v1 · immutable
·published 2007-07-08 17:10 UTC
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();
}