2018-09-05 02:50:27 +00:00
|
|
|
#include "loader.h"
|
|
|
|
#include <cctype>
|
|
|
|
#include <cstdio>
|
|
|
|
#include <cstring>
|
|
|
|
|
|
|
|
|
|
|
|
// 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());
|
|
|
|
|
2018-09-06 01:48:27 +00:00
|
|
|
mesh.vertsTransformed.resize(mesh.verts.size());
|
|
|
|
|
2018-09-05 02:50:27 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|