Your source had a couple of bugs (DL version). And a couple a nit-picks of mine.
I cleaned up the code for improved readability. Changed a few naming conventions to std notation. Increased speed (very minor in the read / scan loops) (just make sure the file ends with a blank line!!!). Reduced code (with use of std lib's). I also added free to release the objects. Hope you don't take offence and rain on your parade.
main.cpp
#include <stdlib.h>#include <stdio.h>#include "obj.h"int main(){ char* memory = NULL; size_t bytes = ObjLoadFile("tank.obj", &memory); ObjModel* model = ObjLoadModel(memory, bytes); printf("Object Model has: %d faces!\n", model->nTriangle); free(model->NormalArray); free(model->TexCoordArray); free(model->TriangleArray); free(model->VertexArray); free(model); system("PAUSE"); return 0;}
obj.cpp
#include <stdlib.h>#include <stdio.h>#include <memory.h>#include "obj.h"ObjModel* ObjLoadModel(char* memory, size_t size){ char* p = NULL, * e = NULL; ObjModel* ret = (ObjModel*) calloc(1, sizeof(ObjModel)); memset(ret, 0, sizeof(ObjModel)); p = memory; e = memory + size; while (p != e) { if (memcmp(p, "vn", 2) == 0) ret->nNormal++; else if (memcmp(p, "vt", 2) == 0) ret->nTexCoord++; else if (memcmp(p, "v", 1) == 0) ret->nVertex++; else if (memcmp(p, "f", 1) == 0) ret->nTriangle++; while (*p++ != (char) 0x0A); } ret->VertexArray = (ObjVertex*) malloc(sizeof(ObjVertex) * ret->nVertex); ret->NormalArray = (ObjNormal*) malloc(sizeof(ObjNormal) * ret->nNormal); ret->TexCoordArray = (ObjTexCoord*) malloc(sizeof(ObjTexCoord) * ret->nTexCoord); ret->TriangleArray = (ObjTriangle*) malloc(sizeof(ObjTriangle) * ret->nTriangle); p = memory; int nV = 0, nN = 0, nT = 0, nF = 0; while (p != e) { if (memcmp(p, "vn", 2) == 0) { sscanf(p, "vn %f %f %f", &ret->NormalArray[nN].x, &ret->NormalArray[nN].y, &ret->NormalArray[nN].z); nN++; } else if (memcmp(p, "vt", 2) == 0) { sscanf(p, "vt %f %f", &ret->TexCoordArray[nT].u, &ret->TexCoordArray[nT].v); nT++; } else if (memcmp(p, "v", 1) == 0) /* or *p == 'v' */ { sscanf(p, "v %f %f %f", &ret->VertexArray[nV].x, &ret->VertexArray[nV].y, &ret->VertexArray[nV].z); nV++; } else if (memcmp(p, "f", 1) == 0) /* or *p == 'f' */ { sscanf(p, "f %d/%d/%d %d/%d/%d %d/%d/%d", &ret->TriangleArray[nF].Vertex[0], &ret->TriangleArray[nF].TexCoord[0], &ret->TriangleArray[nF].Normal[0], &ret->TriangleArray[nF].Vertex[1], &ret->TriangleArray[nF].TexCoord[1], &ret->TriangleArray[nF].Normal[1], &ret->TriangleArray[nF].Vertex[2], &ret->TriangleArray[nF].TexCoord[2], &ret->TriangleArray[nF].Normal[2]); nF++; } while (*p++ != (char) 0x0A); } return ret;}size_t ObjLoadFile(char* szFileName, char** memory){ size_t bytes = 0; FILE* file = fopen(szFileName, "rt"); if (file != NULL) { fseek(file, 0, SEEK_END); size_t end = ftell(file); fseek(file, 0, SEEK_SET); *memory = (char*) malloc(end); bytes = fread(*memory, sizeof(char), end, file); fclose(file); } return bytes;}
obj.h
#ifndef OBJ_H#define OBJ_Hstruct ObjVertex{ float x, y, z;};typedef ObjVertex ObjNormal;struct ObjTexCoord{ float u, v;};struct ObjTriangle{ int Vertex[3]; int Normal[3]; int TexCoord[3];};struct ObjModel{ int nVertex, nNormal, nTexCoord, nTriangle; ObjVertex* VertexArray; ObjNormal* NormalArray; ObjTexCoord* TexCoordArray; ObjTriangle* TriangleArray;};ObjModel* ObjLoadModel(char*, size_t);size_t ObjLoadFile(char*, char**);#endif