I am trying to create a simple program that displays models and such (Think of it as a game without any actual "game"). I'm using the Ne(w)He second lesson as my base, but I've managed to use SOIL for textures, and use a greatly modified readFile function to load custom files in perfectly. However, I am currently trying to load a .obj file created from Animator, and it's not working right.
These are the structs I'm using:
struct Vertex
{
float x, y, z;
Vertex(float x, float y, float z)
{
this->x = x;
this->y = y;
this->z = z;
}
};
struct uv
{
float u, v;
uv(float u, float v)
{
this->u = u;
this->v = v;
}
};
struct part
{
std::vector<Vertex> m_Vertices; //We have a vector of vertices, each vertex with its 3 coordinates
//std::vector<Vertex> m_Colors; //also 3 floats for colors, so we just use the Vertex-struct
std::vector<Vertex> m_Normals; //also 3 floats for colors, so we just use the Vertex-struct
std::vector<uv> m_uvcords; // vector of uv maps
GLuint tex_2d;
int vertices;
part()
{
}
~part()
{
this->m_Vertices.clear();
// this->m_Colors.clear();
this->m_uvcords.clear();
this->m_Normals.clear();
this->tex_2d = NULL;
this->vertices = 0;
}
};
std::vector<part> m_parts;
And this is the readFile function:
Lesson02::part Lesson02::readFile(const char *filename)
{
Lesson02::part temp;
Lesson02::part temp2;
float x, y, z, u, v, r, g, b;
int texpoints;
int normals;
int numfaces;
int t1, t2 = 0;
FILE *filein;
char oneline[255];
int faces[12][5][3];
filein = fopen(filename, "rt"); // File To Load World Data From
readstr(filein,oneline);
sscanf(oneline, "No. points %d:\n", &temp.vertices);
cout << temp.vertices << endl;
//readstr(filein,oneline);
//sscanf(oneline, "TEX %d %d\n", &t1, &t2);
temp2.tex_2d = SOIL_load_OGL_texture
(
readTexName(0, 2).c_str(),
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_MIPMAPS | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
);
cout << readTexName(t1, t2) << endl;
//glBindTexture( GL_TEXTURE_2D, tex_2d );
for (int i = 0; i < temp.vertices; i++)
{
readstr(filein,oneline);
sscanf(oneline, "v %f %f %f", &x, &y, &z);
cout << x << " " << y << " " << z << endl;
temp.m_Vertices.push_back(Vertex( x, y, z));
}
cout << "V NORMAL MAP V"<< endl;
readstr(filein,oneline);
sscanf(oneline, "No. normals %d:\n", &normals);
for (int i = 0; i < normals; i++)
{
readstr(filein,oneline);
sscanf(oneline, "vn %f %f %f", &x, &y, &z);
cout << x << "n" << y << "n" << z << endl;
temp.m_Normals.push_back(Vertex( x, y, z));
}
cout << "V UV MAP V"<< endl;
readstr(filein,oneline);
sscanf(oneline, "No. texture coordinates %d:\n", &texpoints);
for (int i = 0; i < texpoints; i++)
{
readstr(filein,oneline);
sscanf(oneline, "vt %f %f", &u, &v);
cout << u << " " << v << endl;
temp.m_uvcords.push_back(uv(u, v));
}
cout << "V FACES MAP V"<< endl;
readstr(filein,oneline);
sscanf(oneline, "No. faces %d:\n", &numfaces);
for (int i = 0; i < numfaces; i++)
{
readstr(filein,oneline);
sscanf(oneline, "f %d/%d/%d %d/%d/%d %d/%d/%d %d/%d/%d %d/%d/%d", &faces[0][0], &faces[0][1], &faces[0][2],
&faces[1][0], &faces[1][1], &faces[1][2],&faces[2][0], &faces[2][1], &faces[2][2],
&faces[3][0], &faces[3][1], &faces[3][2], &faces[4][0], &faces[4][1], &faces[4][2]);
cout << "f " << faces[0][0] << "/" << faces[0][1]<< "/" <<faces[0][2]<< " " <<
faces[1][0] << "/" << faces[1][1] << "/" << faces[1][2] << " " << faces[2][0] << "/"
<< faces[2][1] << "/" << faces[2][2] << " " << faces[3][0] << "/" << faces[3][1] << "/" << faces[3][2]
<< " " << faces[4][0] << "/" << faces[4][1] << "/" << faces[4][2] << endl;
//temp.m_uvcords.push_back(uv(u, v));
}
temp2.vertices = temp.vertices;
for (int i = 0; i < numfaces; i++)
{
for(int j = 0; j < 5; j++)
{
cout << "F Vert " << i << " " << j << ": " << faces[j][0] << endl;
cout << "F Norm " << i << " " << j << ": " << faces[j][2] << endl;
cout << "F Tex " << i << " " << j << ": " << faces[j][1] << endl;
temp2.m_Vertices.push_back(temp.m_Vertices[(faces[j][0] - 1)]);
temp2.m_uvcords.push_back(temp.m_uvcords[(faces[j][1] - 1)]);
temp2.m_Normals.push_back(temp.m_Normals[(faces[j][2] - 1)]);
}
}
fclose(filein);
return temp2;
}
And this is the drawing part of it
void Lesson02::draw()
{
int parts = 1;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
glLoadIdentity(); // Reset The Current Modelview Matrix
glTranslatef(transX, 0.0f,transY);
glRotatef(rotx, 0.0f, 1.0f, 0.0f);
//Now we need to tell OpenGL to use the arrays we filled with data
glEnableClientState(GL_VERTEX_ARRAY); //We want a vertex array
//glEnableClientState(GL_COLOR_ARRAY); //and a color array
glEnableClientState(GL_NORMAL_ARRAY); //and a color array
glEnableClientState(GL_TEXTURE_COORD_ARRAY); //and a color array
for(int i = 0; i < parts; i++)
{
glBindTexture( GL_TEXTURE_2D, m_parts.tex_2d );
glVertexPointer(3, GL_FLOAT, 0, &m_parts.m_Vertices[0]);
glNormalPointer(GL_FLOAT, 0, &m_parts.m_Normals[0]);
//glColorPointer(3, GL_FLOAT, 0, &m_parts.m_Colors[0]);
glTexCoordPointer(2, GL_FLOAT, 0, &m_parts.m_uvcords[0]);
glDrawArrays(GL_POLYGON, 0, m_parts.vertices);
}
rotx += 0.05f;
//glBindTexture(GL_TEXTURE_2D, tex_2d);
//Disable using the Vertex and Color array
//glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
I originally had the program so it would return "temp" from readFile and not "temp2" but that made it display a garbled mess of triangles, so now it returns temp 2 so that it is only drawing the face parts. It looks a lot better than what it did, but it's still not displaying the whole model.
Here's the model:
# Created with Anim8or 0.95
# Object "object01":
# ComRec:
# ComRec:
#g mesh01
No. points 20:
v 0 0 12.7985
v 8.53229 0 9.53939
v -4.26615 7.38918 9.53939
v -4.26615 -7.38918 9.53939
v 9.53939 7.38918 4.26615
v 9.53939 -7.38918 4.26615
v -11.1689 4.5667 4.26615
v 1.62952 11.956 4.26615
v 1.62952 -11.956 4.26615
v -11.1689 -4.56677 4.26615
v 11.1689 4.56677 -4.26615
v 11.1689 -4.56677 -4.26615
v -9.53939 7.38918 -4.26615
v -1.62952 11.956 -4.26615
v -1.62952 -11.956 -4.26615
v -9.53939 -7.38918 -4.26615
v 4.26615 7.38918 -9.53939
v 4.26615 -7.38918 -9.53939
v -8.53229 0 -9.53939
v 0 0 -12.7985
No. normals 72:
vn 0.30353 0.52573 0.79465
vn -0.60706 0 0.79465
vn 0.30353 -0.52573 0.79465
vn 0.98225 0 0.18759
vn -0.49112 0.85065 0.18759
vn -0.49112 -0.85065 0.18759
vn 0.49112 0.85065 -0.18759
vn 0.49112 -0.85065 -0.18759
vn -0.98225 0 -0.18759
vn 0.60707 0 -0.79465
vn -0.30353 0.52574 -0.79465
vn -0.30353 -0.52574 -0.79465
vn 0.30353 0.52573 0.79465
vn 0.30353 -0.52573 0.79465
vn -0.60706 0 0.79465
vn 0.30353 0.52573 0.79465
vn 0.98225 0 0.18759
vn 0.30353 -0.52573 0.79465
vn 0.30353 0.52573 0.79465
vn -0.49112 0.85065 0.18759
vn -0.60706 0 0.79465
vn -0.60706 0 0.79465
vn -0.49112 -0.85065 0.18759
vn 0.30353 -0.52573 0.79465
vn 0.30353 0.52573 0.79465
vn 0.49112 0.85065 -0.18759
vn 0.98225 0 0.18759
vn 0.30353 -0.52573 0.79465
vn 0.49112 -0.85065 -0.18759
vn 0.98225 0 0.18759
vn -0.60706 0 0.79465
vn -0.98225 0 -0.18759
vn -0.49112 0.85065 0.18759
vn 0.30353 0.52573 0.79465
vn 0.49112 0.85065 -0.18759
vn -0.49112 0.85065 0.18759
vn 0.30353 -0.52573 0.79465
vn 0.49112 -0.85065 -0.18759
vn -0.49112 -0.85065 0.18759
vn -0.60706 0 0.79465
vn -0.98225 0 -0.18759
vn -0.49112 -0.85065 0.18759
vn 0.98225 0 0.18759
vn 0.60707 0 -0.79465
vn 0.49112 0.85065 -0.18759
vn 0.98225 0 0.18759
vn 0.60707 0 -0.79465
vn 0.49112 -0.85065 -0.18759
vn -0.49112 0.85065 0.18759
vn -0.30353 0.52574 -0.79465
vn -0.98225 0 -0.18759
vn -0.49112 0.85065 0.18759
vn -0.30353 0.52574 -0.79465
vn 0.49112 0.85065 -0.18759
vn -0.49112 -0.85065 0.18759
vn -0.30353 -0.52574 -0.79465
vn 0.49112 -0.85065 -0.18759
vn -0.49112 -0.85065 0.18759
vn -0.30353 -0.52574 -0.79465
vn -0.98225 0 -0.18759
vn 0.49112 0.85065 -0.18759
vn -0.30353 0.52574 -0.79465
vn 0.60707 0 -0.79465
vn 0.49112 -0.85065 -0.18759
vn -0.30353 -0.52574 -0.79465
vn 0.60707 0 -0.79465
vn -0.98225 0 -0.18759
vn -0.30353 -0.52574 -0.79465
vn -0.30353 0.52574 -0.79465
vn 0.60707 0 -0.79465
vn -0.30353 -0.52574 -0.79465
vn -0.30353 0.52574 -0.79465
No. texture coordinates 20:
vt 0.30902 0.80902
vt 0.57295 1
vt 0.92705 0.80902
vt 0.88197 0.50000
vt 0.50000 0.50000
vt 0.30902 0.19098
vt 0 0.30902
vt 0 0.69098
vt 0.92705 0.19098
vt 0.57295 0
vt 1 0.69098
vt 1 0.30902
vt 0.07295 0.80902
vt 0.42705 1
vt 0.42705 0
vt 0.07295 0.19098
vt 0.69098 0.80902
vt 0.69098 0.19098
vt 0.11803 0.50000
vt 0.50000 0.50000
No. faces 12:
f 1/5/13 2/4/16 5/3/25 8/2/34 3/1/19
f 1/5/15 3/1/21 7/8/31 10/7/40 4/6/22
f 1/5/14 4/6/24 9/10/37 6/9/28 2/4/18
f 2/4/17 6/9/30 12/12/46 11/11/43 5/3/27
f 3/1/20 8/2/36 14/14/52 13/13/49 7/8/33
f 4/6/23 10/7/42 16/16/58 15/15/55 9/10/39
f 5/3/26 11/11/45 17/17/61 14/14/54 8/2/35
f 6/9/29 9/10/38 15/15/57 18/18/64 12/12/48
f 7/8/32 13/13/51 19/19/67 16/16/60 10/7/41
f 11/11/44 12/12/47 18/18/66 20/20/70 17/17/63
f 13/13/50 14/14/53 17/17/62 20/20/72 19/19/69
f 15/15/56 16/16/59 19/19/68 20/20/71 18/18/65
Please help me figure out whats wrong. I'm nearly at my wits end with this.
Thank you for your help in advance.