summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKyle K <kylek389@gmail.com>2010-10-15 23:56:47 -0500
committerKamil Kaminski <kamilkss@gmail.com>2010-10-15 23:56:47 -0500
commit6eab93bc13fea3e1ca8ada24130350774de911ca (patch)
treed8ad415160cede6d3e01638d43fd5ff74c5acb67
parentdb7029be089626a4dd4d96e123cb45e3d773df39 (diff)
downloadOBJLoader-6eab93bc13fea3e1ca8ada24130350774de911ca.tar.gz
OBJLoader-6eab93bc13fea3e1ca8ada24130350774de911ca.tar.bz2
OBJLoader-6eab93bc13fea3e1ca8ada24130350774de911ca.zip
Fix off-by-one, now obj shows up correctly
-rw-r--r--obj.c61
-rw-r--r--obj.h6
-rw-r--r--objloader.c52
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)
{