I'm trying to write an .obj file format loader for my OpenGL based engine. But models that I load aren't looking properly and I just can't find the problem. I'll be glad if someone can help me. Here's the code:
#include <iostream>
#include <fstream>
#include <vector>
#include "re_renderer.h"
#include "re_math.h"
#pragma once
class COBJModel: public CTexture
{
public:
COBJModel();
void load(const char *objFile);
void loadDiffuseMap(const char *diffuseMapFile);
void render(void);
private:
vector <int> triangleData;
vector <float> vertices;
vector <float> texCoords;
vector <float> normals;
vector <float> vertexArray;
vector <float> texCoordArray;
vector <float> normalArray;
GLuint diffuseTexture;
int x, y, z, nx, ny, nz, tx, ty, tz;
float a, b, c, na, nb, nc, u, v;
};
#include "re_objloader.h"
COBJModel::COBJModel()
{
x = 0;
y = 0;
z = 0;
nx = 0;
ny = 0;
nz = 0;
tx = 0;
ty = 0;
tz = 0;
a = 0;
b = 0;
c = 0;
na = 0;
nb = 0;
nc = 0;
u = 0;
v = 0;
}
void COBJModel::load(const char *objFile)
{
int i = 0;
ifstream modelFile;
string line;
modelFile.open(objFile, ios::in);
if (!modelFile.fail())
{
while (!modelFile.eof())
{
getline(modelFile, line);
const char* data = line.c_str();
if(data[0] == 'v' && data[1] == ' ')
{
sscanf(data, "v %f %f %f", &a, &b, &c);
vertices.push_back(a);
vertices.push_back(b);
vertices.push_back(c);
}
else if(data[0] == 'v' && data[1] == 'n')
{
sscanf(data, "vn %f %f %f", &na, &nb, &nc);
normals.push_back(na);
normals.push_back(nb);
normals.push_back(nc);
}
else if(data[0] == 'v' && data[1] == 't')
{
sscanf(data, "vt %f %f", &u, &v);
texCoords.push_back(u);
texCoords.push_back(v);
}
else if(data[0] == 'f')
{
sscanf(data, "f %d/%d/%d %d/%d/%d %d/%d/%d", &x, &tx, &nx, &y, &ty, &ny, &z, &tz, &nz);
triangleData.push_back(x);
triangleData.push_back(y);
triangleData.push_back(z);
triangleData.push_back(tx);
triangleData.push_back(ty);
triangleData.push_back(tz);
triangleData.push_back(nx);
triangleData.push_back(ny);
triangleData.push_back(nz);
}
else if(data[0] == 's')
{
}
else if(data[0] == 'g')
{
}
else if(data[0] == 'm')
{
}
else if(data[0] == 'u')
{
}
}
for(int i = 0; i < triangleData.size() / 9; i++)
{
vertexArray.push_back(vertices[triangleData[9 * i]]);
vertexArray.push_back(vertices[triangleData[(9 * i) + 1]]);
vertexArray.push_back(vertices[triangleData[(9 * i) + 2]]);
texCoordArray.push_back(texCoords[triangleData[(9 * i) + 3]]);
texCoordArray.push_back(texCoords[triangleData[(9 * i) + 4]]);
texCoordArray.push_back(texCoords[triangleData[(9 * i) + 5]]);
normalArray.push_back(normals[triangleData[(9 * i) + 6]]);
normalArray.push_back(normals[triangleData[(9 * i) + 7]]);
normalArray.push_back(normals[triangleData[(9 * i) + 8]]);
}
cout << "Loaded model \"" << objFile << "\"" << endl;
}
else
cout << "Could not load model \"" << objFile << "\"" << endl;
modelFile.close();
}
void COBJModel::loadDiffuseMap(const char *diffuseMapFile)
{
diffuseTexture = loadTexture(diffuseMapFile);
}
void COBJModel::render()
{
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, diffuseTexture);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(3, GL_FLOAT, 0, &texCoordArray[0]);
glNormalPointer(GL_FLOAT, 0, &normalArray[0]);
glVertexPointer(3, GL_FLOAT, 0, &vertexArray[0]);
glDrawArrays(GL_TRIANGLES, 0, vertexArray.size());
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_TEXTURE_2D);
}
And this is the result that I am getting(it's supposed to be a trash can :) ):
http://img204.imageshack.us/my.php?image=newbitmapimagebm7.jpg