From 6eab93bc13fea3e1ca8ada24130350774de911ca Mon Sep 17 00:00:00 2001 From: Kyle K Date: Fri, 15 Oct 2010 23:56:47 -0500 Subject: Fix off-by-one, now obj shows up correctly --- obj.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------- obj.h | 6 +++--- objloader.c | 52 ++++++++++++++++++++++++++++++++-------------------- 3 files changed, 88 insertions(+), 31 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); } diff --git a/obj.h b/obj.h index b70f9f9..51acb3a 100644 --- a/obj.h +++ b/obj.h @@ -22,10 +22,9 @@ typedef struct typedef struct { char *mtllib; - char *o_name; - char *g_name; + char *objectName; + char *groupName; int nVertex, nNormal, nTexCoord, nFace; - ObjVertex *VertexArray; ObjNormal *NormalArray; ObjTexCoord *TexCoordArray; @@ -36,6 +35,7 @@ typedef struct ObjModel *ObjLoadModel(char *, size_t); /* read a file into argument 2, and return amount of bytes read */ size_t ObjLoadFile(char *, char **); +void ObjList(ObjModel *); void ObjFree(ObjModel *); #endif diff --git a/objloader.c b/objloader.c index 688c643..7521822 100644 --- a/objloader.c +++ b/objloader.c @@ -30,7 +30,7 @@ static void resize(int w, int h) glLoadIdentity(); /* produce the perspective projection */ - gluPerspective(60.0f, fAspect, 1.0, 40.0); + gluPerspective(45.0f, fAspect, 1.0, 300.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); @@ -46,9 +46,9 @@ static void setup_opengl() GLfloat sourceLight[] = { 0.75f, 0.75f, 0.75f, 1.0f }; GLfloat lightPos[] = { -10.f, 5.0f, 5.0f, 1.0f }; - glEnable(GL_DEPTH_TEST); /* hidden surface removal */ - glFrontFace(GL_CCW); /* counter clock-wise polygons face out */ - glEnable(GL_CULL_FACE); /* do not calculate inside of a pyramid */ + glEnable(GL_DEPTH_TEST);/* hidden surface removal */ + glFrontFace(GL_CCW);/* counter clock-wise polygons face out */ + glEnable(GL_CULL_FACE); /* do not calculate inside of a pyramid */ /* enable lighting */ glEnable(GL_LIGHTING); @@ -79,7 +79,7 @@ static void setup_opengl() glPixelStorei(GL_UNPACK_ALIGNMENT, 1); pBytes = gltLoadTGA("stone.tga", &iWidth, &iHeight, &iComponents, &eFormat); if (!pBytes) - fprintf(stderr, "gltLoadTGA: failed to load texture!\n"); + fprintf(stderr, "gltLoadTGA: failed to load texture!\n"); /* load texture image */ glTexImage2D(GL_TEXTURE_2D, 0, iComponents, iWidth, iHeight, 0, eFormat, @@ -142,27 +142,39 @@ void render(ObjModel *model) /* clear the window with current clearing color */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); draw_ground(); - - int i; +#if 0 glPushMatrix(); - glTranslatef(0.0f, -2.0f, -2.0f); - glScalef(0.2f, 0.2f, 0.2f); - glBegin(GL_QUADS); - + glTranslatef(0.0f, 0.0f, -50.0f); + glScalef(0.2f, 0.2f, 0.2f); + glColor3f(1.0f, 0.0f, 0.0f); + glBegin(GL_QUADS); + glVertex3f(25.0f, 0.0f, 0.0f); + glVertex3f(25.0f, 50.0f, 0.0f); + glVertex3f(-25.0f, 50.0f, 0.0f); + glVertex3f(-25.0f, 0.0f, 0.0f); + glEnd(); +#endif + + glPushMatrix(); + glScalef(0.1f, 0.1f, 0.1f); + glTranslatef(0.0f, 0.0f, -150.0f); + glColor3f(1.0f, 0.0f, 0.0f); + glBegin(GL_QUADS); + int i; for (i = 0; i < model->nFace; i++) { - glNormal3f(model->NormalArray[model->FaceArray[i].Normal[0]].x, model->NormalArray[model->FaceArray[i].Normal[0]].y, model->NormalArray[model->FaceArray[i].Normal[0]].z ); - glVertex3f(model->VertexArray[model->FaceArray[i].Vertex[0]].x, model->VertexArray[model->FaceArray[i].Vertex[0]].y, model->VertexArray[model->FaceArray[i].Vertex[0]].z ); + glNormal3f(model->NormalArray[model->FaceArray[i].Normal[0] - 1].x, model->NormalArray[model->FaceArray[i].Normal[0] - 1].y, model->NormalArray[model->FaceArray[i].Normal[0] - 1].z ); + glVertex3f(model->VertexArray[model->FaceArray[i].Vertex[0] - 1].x, model->VertexArray[model->FaceArray[i].Vertex[0] - 1].y, model->VertexArray[model->FaceArray[i].Vertex[0] - 1].z ); - glNormal3f(model->NormalArray[model->FaceArray[i].Normal[1]].x, model->NormalArray[model->FaceArray[i].Normal[1]].y, model->NormalArray[model->FaceArray[i].Normal[1]].z ); - glVertex3f(model->VertexArray[model->FaceArray[i].Vertex[1]].x, model->VertexArray[model->FaceArray[i].Vertex[1]].y, model->VertexArray[model->FaceArray[i].Vertex[1]].z ); + glNormal3f(model->NormalArray[model->FaceArray[i].Normal[1] - 1].x, model->NormalArray[model->FaceArray[i].Normal[1] - 1].y, model->NormalArray[model->FaceArray[i].Normal[1] - 1].z ); + glVertex3f(model->VertexArray[model->FaceArray[i].Vertex[1] - 1].x, model->VertexArray[model->FaceArray[i].Vertex[1] - 1].y, model->VertexArray[model->FaceArray[i].Vertex[1] - 1].z ); - glNormal3f(model->NormalArray[model->FaceArray[i].Normal[2]].x, model->NormalArray[model->FaceArray[i].Normal[2]].y, model->NormalArray[model->FaceArray[i].Normal[2]].z ); - glVertex3f(model->VertexArray[model->FaceArray[i].Vertex[2]].x, model->VertexArray[model->FaceArray[i].Vertex[2]].y, model->VertexArray[model->FaceArray[i].Vertex[2]].z ); + glNormal3f(model->NormalArray[model->FaceArray[i].Normal[2] - 1].x, model->NormalArray[model->FaceArray[i].Normal[2] - 1].y, model->NormalArray[model->FaceArray[i].Normal[2] - 1].z ); + glVertex3f(model->VertexArray[model->FaceArray[i].Vertex[2] - 1].x, model->VertexArray[model->FaceArray[i].Vertex[2] - 1].y, model->VertexArray[model->FaceArray[i].Vertex[2] - 1].z ); - glNormal3f(model->NormalArray[model->FaceArray[i].Normal[3]].x, model->NormalArray[model->FaceArray[i].Normal[3]].y, model->NormalArray[model->FaceArray[i].Normal[3]].z ); - glVertex3f(model->VertexArray[model->FaceArray[i].Vertex[3]].x, model->VertexArray[model->FaceArray[i].Vertex[3]].y, model->VertexArray[model->FaceArray[i].Vertex[3]].z ); + glNormal3f(model->NormalArray[model->FaceArray[i].Normal[3] - 1].x, model->NormalArray[model->FaceArray[i].Normal[3] - 1].y, model->NormalArray[model->FaceArray[i].Normal[3] - 1].z ); + glVertex3f(model->VertexArray[model->FaceArray[i].Vertex[3] - 1].x, model->VertexArray[model->FaceArray[i].Vertex[3] - 1].y, model->VertexArray[model->FaceArray[i].Vertex[3] - 1].z ); } glEnd(); @@ -219,7 +231,7 @@ int main(void) ObjModel *model = ObjLoadModel(memory, bytes); printf("Object Model has: %d faces!\n", model->nFace); - + /* main loop */ while (program_running) { -- cgit v1.2.3