I really appreciate the help so far, thanks.
I have just noticed that my alias to compile and run my opengl was suppressing error output. I'm constantly getting this error:
GLM: Warning: glmDraw() warning: texture render mode requested with no texture coordinates defined.
The object I am trying to load does seem to have a texture though:
# Mon Jun 17 10:04:54 1996##mtllib f-16.mtlgv -1.896410 3.055388 0.729943v -1.912970 2.997458 0.729941v -1.896410 2.994088 0.729943...
And here's the code for the f-16.mtl file, in the same folder (which has standard 644 access)
newmtl glassKa 0.4000 0.4000 0.4000Kd 0.3000 0.2302 0.2302Ks 0.3000 0.3000 0.3000illum 2d 0.2100Ns 117.0500newmtl grayKa 0.4000 0.4000 0.4000Kd 0.3000 0.2302 0.2302Ks 0.3000 0.3000 0.3000illum 2Ns 60.0000newmtl redKa 0.4000 0.4000 0.4000Kd 0.3000 0.0343 0.0343Ks 0.3000 0.3000 0.3000illum 2Ns 60.0000newmtl blueKa 0.4000 0.4000 0.4000Kd 0.0343 0.1861 0.3000Ks 0.3000 0.3000 0.3000illum 2Ns 60.0000newmtl blackKa 0.4000 0.4000 0.4000Kd 0.0019 0.0101 0.0163Ks 0.3000 0.3000 0.3000illum 2Ns 60.0000
First pass is defined as:
/* glmFirstPass: first pass at a Wavefront OBJ file that gets all the * statistics of the model (such as #vertices, #normals, etc) * * model - properly initialized GLMmodel structure * file - (fopen'd) file descriptor */static GLvoidglmFirstPass(GLMmodel* model, FILE* file) { GLuint numvertices; /* number of vertices in model */ GLuint numnormals; /* number of normals in model */ GLuint numtexcoords; /* number of texcoords in model */ GLuint numtriangles; /* number of triangles in model */ GLMgroup* group; /* current group */ unsigned v, n, t; char buf[128]; /* make a default group */ group = glmAddGroup(model, "default"); numvertices = numnormals = numtexcoords = numtriangles = 0; while(fscanf(file, "%s", buf) != EOF) { switch(buf[0]) { case '#': /* comment */ /* eat up rest of line */ fgets(buf, sizeof(buf), file); break; case 'v': /* v, vn, vt */ switch(buf[1]) { case '\0': /* vertex */ /* eat up rest of line */ fgets(buf, sizeof(buf), file); numvertices++; break; case 'n': /* normal */ /* eat up rest of line */ fgets(buf, sizeof(buf), file); numnormals++; break; case 't': /* texcoord */ /* eat up rest of line */ fgets(buf, sizeof(buf), file); numtexcoords++; break; default: __glmFatalError("glmFirstPass(): Unknown token \"%s\".", buf); break; } break; case 'm': if(strncmp(buf, "mtllib", 6) != 0) __glmFatalError("glmReadOBJ: Got \"%s\" instead of \"mtllib\"", buf); fgets(buf, sizeof(buf), file); sscanf(buf, "%s %s", buf, buf); model->mtllibname = __glmStrStrip((char*)buf); glmReadMTL(model, model->mtllibname); break; case 'u': if(strncmp(buf, "usemtl", 6) != 0) __glmFatalError("glmReadOBJ: Got \"%s\" instead of \"usemtl\"", buf); /* eat up rest of line */ fgets(buf, sizeof(buf), file); break; case 'g': /* group */ /* eat up rest of line */ fgets(buf, sizeof(buf), file);#if SINGLE_STRING_GROUP_NAMES sscanf(buf, "%s", buf);#else buf[strlen(buf)-1] = '\0'; /* nuke '\n' */#endif group = glmAddGroup(model, buf); break; case 'f': /* face */ v = n = t = 0; fscanf(file, "%s", buf); /* can be one of %d, %d//%d, %d/%d, %d/%d/%d %d//%d */
if (strstr(buf,
"//")) {
sscanf(buf,
"%d//%d", &v, &n);
fscanf(file,
"%d//%d", &v, &n);
fscanf(file,
"%d//%d", &v, &n);
numtriangles++;
group->numtriangles++;
while(fscanf(file,
"%d//%d", &v, &n) >
0) {
numtriangles++;
group->numtriangles++;
}
}
else if (sscanf(buf,
"%d/%d/%d", &v, &t, &n) ==
3) {
fscanf(file,
"%d/%d/%d", &v, &t, &n);
fscanf(file,
"%d/%d/%d", &v, &t, &n);
numtriangles++;
group->numtriangles++;
while(fscanf(file,
"%d/%d/%d", &v, &t, &n) >
0) {
numtriangles++;
group->numtriangles++;
}
}
else if (sscanf(buf,
"%d/%d", &v, &t) ==
2) {
fscanf(file,
"%d/%d", &v, &t);
fscanf(file,
"%d/%d", &v, &t);
numtriangles++;
group->numtriangles++;
while(fscanf(file,
"%d/%d", &v, &t) >
0) {
numtriangles++;
group->numtriangles++;
}
}
else {
fscanf(file,
"%d", &v);
fscanf(file,
"%d", &v);
numtriangles++;
group->numtriangles++;
while(fscanf(file,
"%d", &v) >
0) {
numtriangles++;
group->numtriangles++;
}
}
break;
default:
fgets(buf,
sizeof(buf), file);
break;
}
}
model->numvertices = numvertices;
model->numnormals = numnormals;
model->numtexcoords = numtexcoords;
model->numtriangles = numtriangles;
group = model->groups;
while(group) {
group->triangles = (GLuint*)malloc(
sizeof(GLuint) * group->numtriangles);
group->numtriangles =
0;
group = group->next;
}
}
Second pass is defined as:
/* glmSecondPass: second pass at a Wavefront OBJ file that gets all * the data. * * model - properly initialized GLMmodel structure * file - (fopen'd) file descriptor */static GLvoidglmSecondPass(GLMmodel* model, FILE* file) { GLuint numvertices; /* number of vertices in model */ GLuint numnormals; /* number of normals in model */ GLuint numtexcoords; /* number of texcoords in model */ GLuint numtriangles; /* number of triangles in model */ GLfloat* vertices; /* array of vertices */ GLfloat* normals; /* array of normals */ GLfloat* texcoords; /* array of texture coordinates */ GLMgroup* group; /* current group pointer */ GLuint material; /* current material */ unsigned int v, n, t; char buf[128]; /* set the pointer shortcuts */ vertices = model->vertices; normals = model->normals; texcoords = model->texcoords; group = model->groups; /* on the second pass through the file, read all the data into the allocated arrays */ numvertices = numnormals = numtexcoords = 1; numtriangles = 0; material = 0; while(fscanf(file, "%s", buf) != EOF) { switch(buf[0]) { case '#': /* comment */ /* eat up rest of line */ fgets(buf, sizeof(buf), file); break; case 'v': /* v, vn, vt */ switch(buf[1]) { case '\0': /* vertex */ fscanf(file, "%f %f %f", &vertices[3 * numvertices + 0], &vertices[3 * numvertices + 1], &vertices[3 * numvertices + 2]); numvertices++; break; case 'n': /* normal */ fscanf(file, "%f %f %f", &normals[3 * numnormals + 0], &normals[3 * numnormals + 1], &normals[3 * numnormals + 2]); numnormals++; break; case 't': /* texcoord */ fscanf(file, "%f %f", &texcoords[2 * numtexcoords + 0], &texcoords[2 * numtexcoords + 1]); numtexcoords++; break; } break; case 'u': fgets(buf, sizeof(buf), file); sscanf(buf, "%s %s", buf, buf); material = glmFindMaterial(model, buf);#ifdef MATERIAL_BY_FACE if(!group->material && group->numtriangles) group->material = material;#else group->material = material;#endif break; case 'g': /* group */ /* eat up rest of line */ fgets(buf, sizeof(buf), file);#if SINGLE_STRING_GROUP_NAMES sscanf(buf, "%s", buf);#else buf[strlen(buf)-1] = '\0'; /* nuke '\n' */#endif group = glmFindGroup(model, buf);#ifndef MATERIAL_BY_FACE group->material = material;#endif break; case 'f': /* face */ v = n = t = 0; T(numtriangles).findex = -1;#ifdef MATERIAL_BY_FACE if(group->material == 0) group->material = material; T(numtriangles).material = material;#endif fscanf(file, "%s", buf); /* can be one of %d, %d//%d, %d/%d, %d/%d/%d %d//%d */
if (strstr(buf,
"//")) {
sscanf(buf,
"%u//%u", &v, &n);
T(numtriangles).vindices[
0] = v;
T(numtriangles).tindices[
0] = -
1;
T(numtriangles).nindices[
0] = n;
fscanf(file,
"%u//%u", &v, &n);
T(numtriangles).vindices[
1] = v;
T(numtriangles).tindices[
1] = -
1;
T(numtriangles).nindices[
1] = n;
fscanf(file,
"%u//%u", &v, &n);
T(numtriangles).vindices[
2] = v;
T(numtriangles).tindices[
2] = -
1;
T(numtriangles).nindices[
2] = n;
group->triangles[group->numtriangles++] = numtriangles;
numtriangles++;
while(fscanf(file,
"%u//%u", &v, &n) >
0) {
#ifdef MATERIAL_BY_FACE
T(numtriangles).material = material;
#endif T(numtriangles).vindices[
0] = T(numtriangles-
1).vindices[
0];
T(numtriangles).tindices[
0] = T(numtriangles-
1).tindices[
0];
T(numtriangles).nindices[
0] = T(numtriangles-
1).nindices[
0];
T(numtriangles).vindices[
1] = T(numtriangles-
1).vindices[
2];
T(numtriangles).tindices[
1] = T(numtriangles-
1).tindices[
2];
T(numtriangles).nindices[
1] = T(numtriangles-
1).nindices[
2];
T(numtriangles).vindices[
2] = v;
T(numtriangles).tindices[
2] = -
1;
T(numtriangles).nindices[
2] = n;
group->triangles[group->numtriangles++] = numtriangles;
numtriangles++;
}
}
else if (sscanf(buf,
"%u/%u/%u", &v, &t, &n) ==
3) {
T(numtriangles).vindices[
0] = v;
T(numtriangles).tindices[
0] = t;
T(numtriangles).nindices[
0] = n;
fscanf(file,
"%u/%u/%u", &v, &t, &n);
T(numtriangles).vindices[
1] = v;
T(numtriangles).tindices[
1] = t;
T(numtriangles).nindices[
1] = n;
fscanf(file,
"%u/%u/%u", &v, &t, &n);
T(numtriangles).vindices[
2] = v;
T(numtriangles).tindices[
2] = t;
T(numtriangles).nindices[
2] = n;
group->triangles[group->numtriangles++] = numtriangles;
numtriangles++;
while(fscanf(file,
"%u/%u/%u", &v, &t, &n) >
0) {
#ifdef MATERIAL_BY_FACE
T(numtriangles).material = material;
#endif T(numtriangles).vindices[
0] = T(numtriangles-
1).vindices[
0];
T(numtriangles).tindices[
0] = T(numtriangles-
1).tindices[
0];
T(numtriangles).nindices[
0] = T(numtriangles-
1).nindices[
0];
T(numtriangles).vindices[
1] = T(numtriangles-
1).vindices[
2];
T(numtriangles).tindices[
1] = T(numtriangles-
1).tindices[
2];
T(numtriangles).nindices[
1] = T(numtriangles-
1).nindices[
2];
T(numtriangles).vindices[
2] = v;
T(numtriangles).tindices[
2] = t;
T(numtriangles).nindices[
2] = n;
group->triangles[group->numtriangles++] = numtriangles;
numtriangles++;
}
}
else if (sscanf(buf,
"%u/%u", &v, &t) ==
2) {
T(numtriangles).vindices[
0] = v;
T(numtriangles).tindices[
0] = t;
T(numtriangles).nindices[
0] = -
1;
fscanf(file,
"%u/%u", &v, &t);
T(numtriangles).vindices[
1] = v;
T(numtriangles).tindices[
1] = t;
T(numtriangles).nindices[
1] = -
1;
fscanf(file,
"%u/%u", &v, &t);
T(numtriangles).vindices[
2] = v;
T(numtriangles).tindices[
2] = t;
T(numtriangles).nindices[
2] = -
1;
group->triangles[group->numtriangles++] = numtriangles;
numtriangles++;
while(fscanf(file,
"%u/%u", &v, &t) >
0) {
#ifdef MATERIAL_BY_FACE
T(numtriangles).material = material;
#endif T(numtriangles).vindices[
0] = T(numtriangles-
1).vindices[
0];
T(numtriangles).tindices[
0] = T(numtriangles-
1).tindices[
0];
T(numtriangles).nindices[
0] = T(numtriangles-
1).nindices[
0];
T(numtriangles).vindices[
1] = T(numtriangles-
1).vindices[
2];
T(numtriangles).tindices[
1] = T(numtriangles-
1).tindices[
2];
T(numtriangles).nindices[
1] = T(numtriangles-
1).nindices[
2];
T(numtriangles).vindices[
2] = v;
T(numtriangles).tindices[
2] = t;
T(numtriangles).nindices[
2] = -
1;
group->triangles[group->numtriangles++] = numtriangles;
numtriangles++;
}
}
else {
sscanf(buf,
"%u", &v);
T(numtriangles).vindices[
0] = v;
T(numtriangles).tindices[
0] = -
1;
T(numtriangles).nindices[
0] = -
1;
fscanf(file,
"%u", &v);
T(numtriangles).vindices[
1] = v;
T(numtriangles).tindices[
1] = -
1;
T(numtriangles).nindices[
1] = -
1;
fscanf(file,
"%u", &v);
T(numtriangles).vindices[
2] = v;
T(numtriangles).tindices[
2] = -
1;
T(numtriangles).nindices[
2] = -
1;
group->triangles[group->numtriangles++] = numtriangles;
numtriangles++;
while(fscanf(file,
"%u", &v) >
0) {
#ifdef MATERIAL_BY_FACE
T(numtriangles).material = material;
#endif T(numtriangles).vindices[
0] = T(numtriangles-
1).vindices[
0];
T(numtriangles).tindices[
0] = T(numtriangles-
1).tindices[
0];
T(numtriangles).nindices[
0] = T(numtriangles-
1).nindices[
0];
T(numtriangles).vindices[
1] = T(numtriangles-
1).vindices[
2];
T(numtriangles).tindices[
1] = T(numtriangles-
1).tindices[
2];
T(numtriangles).nindices[
1] = T(numtriangles-
1).nindices[
2];
T(numtriangles).vindices[
2] = v;
T(numtriangles).tindices[
2] = -
1;
T(numtriangles).nindices[
2] = -
1;
group->triangles[group->numtriangles++] = numtriangles;
numtriangles++;
}
}
break;
default:
fgets(buf,
sizeof(buf), file);
break;
}
}
#
if 0 __glmWarning(
" Memory: %d bytes",
numvertices *
3*
sizeof(GLfloat) +
numnormals *
3*
sizeof(GLfloat) * (numnormals ?
1 :
0) +
numtexcoords *
3*
sizeof(GLfloat) * (numtexcoords ?
1 :
0) +
numtriangles *
sizeof(GLMtriangle));
#endif}