.OBJ texture coordinates aren't mapped correctly

This is a cross-post from game-dev because it seems more general to graphical programming than game development.

I have written a simple .obj parser for my OpenGL game engine that reads vertices, uv's and normals; but when I get to drawing the model in the texture isn't mapped correctly.

I have tried

Code :

uv.y = 1.0f-uv.y

to get inverted Y axis coordinates as suggested by a few people but my textures are still skewed.

I know the texture and my rendering are correct because when I render a plane, with hand written texture coordinates and vertices using the same texture, it renders fine. I can render a textured cube by hand fine too.

I am using an index buffer to store vertex elements and I use the face elements provided by the obj to fill texture coordinate and normal buffers with the correct vectors.

.OBJ is multi-indexed; different vertex attributes have their own index (i.e. there is an index for position, one for normals, ...). OpenGL only supports a single index that is used for all vertex attributes. I suppose that is why you do this:

However, you are not doing this for positions (presumably because you are still using indexed drawing?), but for that to work you need to arrange for the normals/texcoords to be in an order that is "compatible" with the position index. The usual way to deal with the multiple indices in OBJ is to go through the indices and look at each tuple (position_index, normal_index, texcoord_index); if the tuple has not occurred previously (i.e. it's a new unique combination) write the referenced position, normal, texcoord to the vertex data buffer(s), write the number of unique tuples so far to the index buffer and remember that this tuple is associated with this new index. If the tuple occurred before, look up what index it was associated with and write that to the index buffer.

I don't know very much about them but I understand the basics. I have been meaning to do some practical work with them to get better with them. In your example do you suggest that I map unsigned integers to vertices and in the function iterate through the map to check for pairs?