From 8aff7ce656f9022263df56fbcb10e41500a8da8f Mon Sep 17 00:00:00 2001 From: Kyle K Date: Sat, 16 Oct 2010 03:15:06 -0500 Subject: Loads texture now, awesome --- Makefile | 2 +- obj.c | 15 ++++++++++----- obj.h | 3 +++ objloader.c | 38 ++++++++++++++++++++++---------------- 4 files changed, 36 insertions(+), 22 deletions(-) diff --git a/Makefile b/Makefile index 21509c3..f198a9a 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ PROG = objloader -OBJS = $(PROG).o obj.o +OBJS = $(PROG).o obj.o math3d.o CC = gcc DBGFLAGS = -g -O0 ifdef DEBUG diff --git a/obj.c b/obj.c index 7f42e35..9d4f62c 100644 --- a/obj.c +++ b/obj.c @@ -1,7 +1,7 @@ /* obj.c * * OBJ Loader - * inital code: http://www.gamedev.net/community/forums/topic.asp?topic_id=312335 + * initial code: http://www.gamedev.net/community/forums/topic.asp?topic_id=312335 * * notes: the mtl file should be implemented using arrays * more that one mtl needs to be supported some day @@ -133,8 +133,12 @@ ObjModel* ObjLoadModel(char *memory, size_t size) if (ret->mtllib != NULL && ret->usemtl) { /* append directory to filename */ - char *fname = (char *) malloc(sizeof(char) * 21); - sprintf(fname, "./cube/%s", ret->mtllib); + char *fname = (char *) malloc(sizeof(char) * 31); + /* sprintf(fname, "./cube/%s", ret->mtllib); */ + char *delimeter = strrchr(obj_last_fname, '/'); + unsigned int offset = delimeter - obj_last_fname; + strncpy(fname, obj_last_fname, offset + 1); + strcat(fname, ret->mtllib); char *mtl_mem = NULL; size_t mtl_bytes = ObjLoadFile(fname, &mtl_mem); @@ -147,7 +151,7 @@ ObjModel* ObjLoadModel(char *memory, size_t size) /* allocate space for members */ mtl->map_Ka = (char *) malloc(sizeof(char) * 21); mtl->map_Kd = (char *) malloc(sizeof(char) * 21); - /* set, what about rest? */ + /* reset, what about the rest? */ mtl->Ns = 0.0f; mtl->Ni = 0.0f; mtl->d = 0.0f; @@ -198,7 +202,7 @@ ObjModel* ObjLoadModel(char *memory, size_t size) if (memcmp(st, "map_Kd", 6) == 0) sscanf(st, "map_Kd %s", mtl->map_Kd); - /* got to next line */ + /* go to next line */ while (*st++ != (char) 0x0a); } /* set the mtl */ @@ -215,6 +219,7 @@ ObjModel* ObjLoadModel(char *memory, size_t size) size_t ObjLoadFile(char *szFileName, char **memory) { + strcpy(obj_last_fname, szFileName); /* seems useful for tracking */ size_t bytes = 0; FILE *file = fopen(szFileName, "rt"); diff --git a/obj.h b/obj.h index f9a4a26..8182129 100644 --- a/obj.h +++ b/obj.h @@ -1,6 +1,9 @@ #ifndef OBJ_H #define OBJ_H +/* external variables */ +char obj_last_fname[31]; + typedef struct { float x, y, z; diff --git a/objloader.c b/objloader.c index 34de2b9..1374530 100644 --- a/objloader.c +++ b/objloader.c @@ -9,7 +9,7 @@ * * todo: move obj files and texures into folder named e.g. "obj", or find some way * of figuring out the current directory, hmm, could modify a path string, e.g. - * "./cube/cube.obj" -> "/cube/*", I would need to loop for last occurence of "/" + * "./cube/cube.obj" -> "/cube/X", I would need to loop for last occurence of "/" * */ @@ -43,7 +43,7 @@ static void resize(int w, int h) SDL_SetVideoMode(w, h, 32, SDL_OPENGL | SDL_GL_DOUBLEBUFFER | SDL_RESIZABLE); } -static void setup_opengl() +static void setup_opengl(ObjModel *model) { /* light values and coordinates */ GLfloat whiteLight[] = { 0.05f, 0.05f, 0.05f, 1.0f }; @@ -73,15 +73,23 @@ static void setup_opengl() /* gray background */ glClearColor(0.5f, 0.5f, 0.5f, 1.0f); -#if 0 /* example of loading a targa file, note: RLE compression is not supported */ GLbyte *pBytes; GLint iWidth, iHeight, iComponents; GLenum eFormat; + + /* get the filename from obj file */ + char *fname = (char *) malloc(sizeof(char) * 31); + char *delimeter = strrchr(obj_last_fname, '/'); + unsigned int offset = delimeter - obj_last_fname; + strncpy(fname, obj_last_fname, offset + 1); + strcat(fname, model->mtl->map_Ka); /* ambient texture map */ + if (model->mtl != NULL) + printf("ambient texture map: %s\n", model->mtl->map_Ka); /* load texture */ glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - pBytes = gltLoadTGA("stone.tga", &iWidth, &iHeight, &iComponents, &eFormat); + pBytes = gltLoadTGA(fname, &iWidth, &iHeight, &iComponents, &eFormat); if (!pBytes) fprintf(stderr, "gltLoadTGA: failed to load texture!\n"); @@ -97,7 +105,6 @@ static void setup_opengl() glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glEnable(GL_TEXTURE_2D); -#endif } /* process SDL events */ @@ -149,22 +156,25 @@ void render(ObjModel *model) glPushMatrix(); glScalef(0.1f, 0.1f, 0.1f); - glTranslatef(0.0f, 0.0f, -150.0f); - glColor3f(1.0f, 0.0f, 0.0f); + glTranslatef(5.0f, 0.0f, -150.0f); glBegin(GL_QUADS); int i; for (i = 0; i < model->nFace; i++) - { + { 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 ); + glTexCoord2f(model->TexCoordArray[model->FaceArray[i].TexCoord[0] - 1].u, model->TexCoordArray[model->FaceArray[i].TexCoord[0] - 1].v); 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] - 1].x, model->NormalArray[model->FaceArray[i].Normal[1] - 1].y, model->NormalArray[model->FaceArray[i].Normal[1] - 1].z ); + glTexCoord2f(model->TexCoordArray[model->FaceArray[i].TexCoord[1] - 1].u, model->TexCoordArray[model->FaceArray[i].TexCoord[1] - 1].v); 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] - 1].x, model->NormalArray[model->FaceArray[i].Normal[2] - 1].y, model->NormalArray[model->FaceArray[i].Normal[2] - 1].z ); + glTexCoord2f(model->TexCoordArray[model->FaceArray[i].TexCoord[2] - 1].u, model->TexCoordArray[model->FaceArray[i].TexCoord[2] - 1].v); 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] - 1].x, model->NormalArray[model->FaceArray[i].Normal[3] - 1].y, model->NormalArray[model->FaceArray[i].Normal[3] - 1].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 ); + glTexCoord2f(model->TexCoordArray[model->FaceArray[i].TexCoord[3] - 1].u, model->TexCoordArray[model->FaceArray[i].TexCoord[3] - 1].v); 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 ); } @@ -213,17 +223,13 @@ int main(void) else fprintf(stdout, "status: using GLEW %s\n", glewGetString(GLEW_VERSION)); - /* setup few stuff before rendring */ - setup_opengl(); - /* OBJ Loading */ char *memory = NULL; size_t bytes = ObjLoadFile("./cube/cube.obj", &memory); - ObjModel *model = ObjLoadModel(memory, bytes); - printf("Object Model has: %d faces!\n", model->nFace); - if (model->mtl != NULL) - printf("ambient texture map: %s\n", model->mtl->map_Ka); + + /* setup few stuff before rendring */ + setup_opengl(model); /* main loop */ while (program_running) -- cgit v1.2.3