summaryrefslogtreecommitdiffstats
path: root/obj.c
diff options
context:
space:
mode:
Diffstat (limited to 'obj.c')
-rw-r--r--obj.c61
1 files changed, 53 insertions, 8 deletions
diff --git a/obj.c b/obj.c
index e60aa7d..c6d9966 100644
--- a/obj.c
+++ b/obj.c
@@ -20,7 +20,7 @@ ObjModel* ObjLoadModel(char *memory, size_t size)
else if (memcmp(p, "v", 1) == 0) ret->nVertex++;
else if (memcmp(p, "f", 1) == 0) ret->nFace++;
- while (*p++ != (char) 0x0A);
+ while (*p++ != (char) 0x0a);
}
/* allocate memory for arrays */
@@ -32,33 +32,40 @@ ObjModel* ObjLoadModel(char *memory, size_t size)
p = memory;
int nV = 0, nN = 0, nT = 0, nF = 0;
+ int nread = 0;
while (p != e)
{
if (memcmp(p, "vn", 2) == 0)
{
- sscanf(p, "vn %f %f %f", &ret->NormalArray[nN].x,
+ nread = sscanf(p, "vn %f %f %f", &ret->NormalArray[nN].x,
&ret->NormalArray[nN].y,
&ret->NormalArray[nN].z);
+ if (nread != 3)
+ printf("vn: read only %d instead of 3\n", nread);
nN++;
}
else if (memcmp(p, "vt", 2) == 0)
{
- sscanf(p, "vt %f %f", &ret->TexCoordArray[nT].u,
+ nread = sscanf(p, "vt %f %f", &ret->TexCoordArray[nT].u,
&ret->TexCoordArray[nT].v);
+ if (nread != 2)
+ printf("vt: read only %d instead of 2\n", nread);
nT++;
}
else if (memcmp(p, "v", 1) == 0) /* or *p == 'v' */
{
- sscanf(p, "v %f %f %f", &ret->VertexArray[nV].x,
+ nread = sscanf(p, "v %f %f %f", &ret->VertexArray[nV].x,
&ret->VertexArray[nV].y,
&ret->VertexArray[nV].z);
+ if (nread != 3)
+ printf("v: read only %d instead of 3\n", nread);
nV++;
}
/* quad */
else if (memcmp(p, "f", 1) == 0) /* or *p == 'f' */
{
- sscanf(p, "f %d/%d/%d %d/%d/%d %d/%d/%d %d/%d/%d",
+ nread = sscanf(p, "f %d/%d/%d %d/%d/%d %d/%d/%d %d/%d/%d",
&ret->FaceArray[nF].Vertex[0],
&ret->FaceArray[nF].TexCoord[0],
&ret->FaceArray[nF].Normal[0],
@@ -70,11 +77,13 @@ ObjModel* ObjLoadModel(char *memory, size_t size)
&ret->FaceArray[nF].Normal[2],
&ret->FaceArray[nF].Vertex[3],
&ret->FaceArray[nF].TexCoord[3],
- &ret->FaceArray[nF].Normal[3]);
+ &ret->FaceArray[nF].Normal[3]);
+ if (nread != 12)
+ printf("f: read only %d instead of 12\n", nread);
nF++;
}
/* seek to a newline */
- while (*p++ != (char) 0x0A);
+ while (*p++ != (char) 0x0a);
}
/* sanity check */
@@ -114,12 +123,48 @@ size_t ObjLoadFile(char *szFileName, char **memory)
return bytes;
}
+void ObjList(ObjModel *model)
+{
+ int i;
+ printf("%d vertices\n", model->nVertex);
+ for (i = 0; i < model->nVertex; i++)
+ printf("v %f %f %f\n", model->VertexArray[i].x, model->VertexArray[i].y,
+ model->VertexArray[i].z);
+
+ printf("%d normal vectors\n", model->nNormal);
+ for (i = 0; i < model->nNormal; i++)
+ printf("v %f %f %f\n", model->NormalArray[i].x, model->NormalArray[i].y,
+ model->NormalArray[i].z);
+
+ printf("%d texture coordinates\n", model->nTexCoord);
+ for (i = 0; i < model->nTexCoord; i++)
+ printf("v %f %f\n", model->TexCoordArray[i].u, model->TexCoordArray[i].v);
+
+ printf("%d faces\n", model->nFace);
+ for (i = 0; i < model->nFace; i++)
+ {
+ printf("f %d/%d/%d %d/%d/%d %d/%d/%d %d/%d/%d\n",
+ model->FaceArray[i].Vertex[0],
+ model->FaceArray[i].TexCoord[0],
+ model->FaceArray[i].Normal[0],
+ model->FaceArray[i].Vertex[1],
+ model->FaceArray[i].TexCoord[1],
+ model->FaceArray[i].Normal[1],
+ model->FaceArray[i].Vertex[2],
+ model->FaceArray[i].TexCoord[2],
+ model->FaceArray[i].Normal[2],
+ model->FaceArray[i].Vertex[3],
+ model->FaceArray[i].TexCoord[3],
+ model->FaceArray[i].Normal[3]);
+ }
+}
+
void ObjFree(ObjModel *model)
{
free(model->NormalArray);
free(model->TexCoordArray);
free(model->FaceArray);
free(model->VertexArray);
- free(model);
+ free(model);
}