diff options
| author | Kyle K <kylek389@gmail.com> | 2010-10-16 03:15:06 -0500 | 
|---|---|---|
| committer | Kamil Kaminski <kamilkss@gmail.com> | 2010-10-16 03:15:06 -0500 | 
| commit | 8aff7ce656f9022263df56fbcb10e41500a8da8f (patch) | |
| tree | 53ecec9aa21c9523e24664e6e821fc5efb940768 | |
| parent | 026bf263d5106449e2e0ed04f55bb152003d80b1 (diff) | |
| download | OBJLoader-8aff7ce656f9022263df56fbcb10e41500a8da8f.tar.gz OBJLoader-8aff7ce656f9022263df56fbcb10e41500a8da8f.tar.bz2 OBJLoader-8aff7ce656f9022263df56fbcb10e41500a8da8f.zip  | |
Loads texture now, awesome
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | obj.c | 15 | ||||
| -rw-r--r-- | obj.h | 3 | ||||
| -rw-r--r-- | objloader.c | 38 | 
4 files changed, 36 insertions, 22 deletions
@@ -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 @@ -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"); @@ -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)  | 
