summaryrefslogtreecommitdiffstats
path: root/obj.c
diff options
context:
space:
mode:
Diffstat (limited to 'obj.c')
-rw-r--r--obj.c41
1 files changed, 30 insertions, 11 deletions
diff --git a/obj.c b/obj.c
index e871fda..9ab4a6a 100644
--- a/obj.c
+++ b/obj.c
@@ -12,20 +12,22 @@ ObjModel* ObjLoadModel(char *memory, size_t size)
p = memory;
e = memory + size;
+ /* count the number of normals, texcoords, vertices, and faces, line by line */
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++;
+ else if (memcmp(p, "f", 1) == 0) ret->nFace++;
while (*p++ != (char) 0x0A);
}
+ /* allocate memory for arrays */
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);
+ ret->FaceArray = (ObjFace *) malloc(sizeof(ObjFace) * ret->nFace);
p = memory;
@@ -55,19 +57,36 @@ ObjModel* ObjLoadModel(char *memory, size_t size)
}
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]);
+ sscanf(p, "f %d/%d/%d %d/%d/%d %d/%d/%d", &ret->FaceArray[nF].Vertex[0],
+ &ret->FaceArray[nF].TexCoord[0],
+ &ret->FaceArray[nF].Normal[0],
+ &ret->FaceArray[nF].Vertex[1],
+ &ret->FaceArray[nF].TexCoord[1],
+ &ret->FaceArray[nF].Normal[1],
+ &ret->FaceArray[nF].Vertex[2],
+ &ret->FaceArray[nF].TexCoord[2],
+ &ret->FaceArray[nF].Normal[2]);
nF++;
}
+ /* seek to a newline */
while (*p++ != (char) 0x0A);
}
+
+ /* sanity check */
+ if ((ret->nVertex != nV) || (ret->nNormal != nN) || (ret->nTexCoord != nT)
+ || (ret->nFace != nF))
+ {
+ fprintf(stdout, "obj loader: warning, the number of scanned items does not equal to number of read\n");
+ if (ret->nVertex != nV)
+ fprintf(stdout, "vertices: scanned %d, read %d\n", ret->nVertex, nV);
+ if (ret->nNormal != nN)
+ fprintf(stdout, "normals: scanned %d, read %d\n", ret->nNormal, nN);
+ if (ret->nTexCoord != nT)
+ fprintf(stdout, "texcoords: scanned %d, read %d\n", ret->nTexCoord, nT);
+ if (ret->nFace != nF)
+ fprintf(stdout, "faces: scanned %d, read %d\n", ret->nFace, nF);
+ }
+
return ret;
}