I wrote a simple *.obj
parser reading read vertices, texcoords and normals. But when I draw a model the texture isn't mapped correctly.
I have already tried uv.y = 1.0f - uv.y
to get inverted Y axis coordinates as suggested by a few people but my textures are still displayed skewed.
I know that both texture file and rendering code are correct. Because when I render a plane and use hand written and hard coded texture coordinates and vertices it renders fine. I can render a textured cube by hand fine, too.
I use an index buffer to store vertex elements and I use the face elements provided by the *.obj
file to fill texture coordinate buffer and normal buffer.
Model::Model(const string &givenName, const string &filePath){
name = givenName;
std::ifstream in(MODEL_PATH+filePath, std::ios::in);
if(!in){
error("Model \"" + filePath + "\" does not exist");
return;
}
ModelMeshIndex tempindex;
vector<vec3> normals;
vector<vec2> uvs;
string line;
while(getline(in, line)){
if(line.substr(0,2) == "v "){
std::istringstream s(line.substr(2));
vec3 v(0.0f);
s >> v.x >> v.y >> v.z;
data.vertices.push_back(v);
}
else if(line.substr(0,2) == "vt"){
std::istringstream s(line.substr(2));
vec2 v(0.0f);
s >> v.x >> v.y;
//v.y = 1.0f-v.y;
uvs.push_back(v);
}
else if(line.substr(0,2) == "vn"){
std::istringstream s(line.substr(2));
vec3 v(0.0f);
s >> v.x >> v.y >> v.z;
normals.push_back(v);
}
else if(line.substr(0,2) == "f "){
std::istringstream s(line.substr(1));
char tmp; // For the slashes between elements
unsigned short a,b,c, d,e,f, g,h,i;
s >> a >> tmp >> d >> tmp >>g;
s >> b >> tmp >> e >> tmp >>h;
s >> c >> tmp >> f >> tmp >>i;
a--; b--; c--; d--; e--; f--; g--; h--; i--;
data.index.vertexElements.push_back(a);
data.index.vertexElements.push_back(b);
data.index.vertexElements.push_back(c);
data.index.uvElements.push_back(d);
data.index.uvElements.push_back(e);
data.index.uvElements.push_back(f);
data.index.normalElements.push_back(g);
data.index.normalElements.push_back(h);
data.index.normalElements.push_back(i);
}
else if(line[0] == '#') continue;
else continue;
}
for(unsigned int i = 0; i < data.index.normalElements.size(); ++i)
data.normals.push_back(normals[data.index.normalElements[i]]);
for(unsigned int i = 0; i < data.index.uvElements.size(); ++i)
data.uvs.push_back(uvs[data.index.uvElements[i]]);
//data.uvs.push_back(vec2( 0.0f, 0.0f)); // bottom left
//data.uvs.push_back(vec2( 0.0f, 1.0f)); // top left
//data.uvs.push_back(vec2( 1.0f, 0.0f)); // bottom right
//data.uvs.push_back(vec2( 1.0f, 1.0f)); // top right
good = true;
}
What is wrong with my parser?