#include "loader.h" #include #include #include // STATIC PROTOTYPES static char *GetLine(char *buffer, int maxLength, FILE *fp); // PUBLIC FUNCTIONS int LoadMesh(char *filename, Mesh &mesh) { FILE *fp; char buffer[256]; char *token; char garbage[5]; fp = fopen(filename, "r"); if (fp == NULL) { fprintf(stderr, "Error loading file: %s\n", filename); return -1; } token = GetLine(buffer, sizeof(buffer), fp); while (token != NULL) { if (token[0] == 'v') { Point v; sscanf( token, "%s %f %f %f", garbage, &v.x, &v.y, &v.z); mesh.verts.push_back(v); } else if (token[0] == 'f') { Face f; sscanf(token, "%s %d %d %d", garbage, &f.vertIndex[0], &f.vertIndex[1], &f.vertIndex[2]); // Convert to 0-indexed f.vertIndex[0] -= 1; f.vertIndex[1] -= 1; f.vertIndex[2] -= 1; mesh.faces.push_back(f); } token = GetLine(buffer, sizeof(buffer), fp); } printf("OBJ: %s\n", filename); printf("Verts: %lu\n", mesh.verts.size()); printf("Faces: %lu\n", mesh.faces.size()); fclose(fp); return 0; } static char *GetLine(char *buffer, int maxLength, FILE *fp) { while(true) { if (!fgets(buffer, maxLength, fp)) { return NULL; } // for (length = strlen(buffer), index = 0; isspace(buffer[index]); ++index); if (buffer[0] != 'v' && buffer[0] != 'f') { continue; } return buffer; } }