summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKyle K <kylek389@gmail.com>2010-10-16 03:15:06 -0500
committerKamil Kaminski <kamilkss@gmail.com>2010-10-16 03:15:06 -0500
commit8aff7ce656f9022263df56fbcb10e41500a8da8f (patch)
tree53ecec9aa21c9523e24664e6e821fc5efb940768
parent026bf263d5106449e2e0ed04f55bb152003d80b1 (diff)
downloadOBJLoader-8aff7ce656f9022263df56fbcb10e41500a8da8f.tar.gz
OBJLoader-8aff7ce656f9022263df56fbcb10e41500a8da8f.tar.bz2
OBJLoader-8aff7ce656f9022263df56fbcb10e41500a8da8f.zip
Loads texture now, awesome
-rw-r--r--Makefile2
-rw-r--r--obj.c15
-rw-r--r--obj.h3
-rw-r--r--objloader.c38
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)