diff options
Diffstat (limited to 'obj.c')
-rw-r--r-- | obj.c | 41 |
1 files changed, 30 insertions, 11 deletions
@@ -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; } |