From 11dc9e5855e2dff4a69242a98b9da23c85405ffb Mon Sep 17 00:00:00 2001 From: taw27 Date: Sun, 27 Jul 2008 23:09:13 +0000 Subject: Extend model format to include vertex normals git-svn-id: svn://cook.msm.cam.ac.uk:745/thrust3d/thrust3d@187 84d2e878-0bd5-11dd-ad15-13eda11d74c5 --- src/model.c | 21 +++++++++++++++++++-- src/obj2model.c | 11 +++++++---- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/model.c b/src/model.c index bf5512e..1e43297 100644 --- a/src/model.c +++ b/src/model.c @@ -226,9 +226,12 @@ static int model_load(ModelContext *ctx, const char *name, RenderContext *render char line[1024]; GLfloat x, y, z; GLfloat r, g, b; + GLfloat nx, ny, nz; + int have_normals; GLfloat texx, texy, forget; texx = 0.0; texy = 0.0; /* Default texture coordinates */ + have_normals = 0; /* Calculate the normals by default */ fgets(line, 1023, fh); @@ -262,20 +265,34 @@ static int model_load(ModelContext *ctx, const char *name, RenderContext *render texx = x; texy = y; } + if ( sscanf(line, "%f %f %f %f %f %f %f %f", &forget, &forget, &forget, &forget, &forget, + &nx, &ny, &nz) == 8 ) { + have_normals = 1; + } + if ( sscanf(line, "%f %f %f", &x, &y, &z) == 3 ) { vertices[3*num_vertices+0] = x; vertices[3*num_vertices+1] = y; vertices[3*num_vertices+2] = z; texcoords[2*num_vertices+0] = texx; texcoords[2*num_vertices+1] = texy; + if ( have_normals ) { + normals[3*num_vertices+0] = nx; + normals[3*num_vertices+1] = ny; + normals[3*num_vertices+2] = nz; + } num_vertices++; if ( (type == PRIMITIVE_QUADS) && ((num_vertices % 4)==0) ) { - model_calculate_normals(vertices, normals, num_vertices-4, num_vertices-1, + if ( !have_normals ) { + model_calculate_normals(vertices, normals, num_vertices-4, num_vertices-1, num_vertices-4, num_vertices-3, num_vertices-2); + } } if ( (type == PRIMITIVE_TRIANGLES) && ((num_vertices % 3)==0) ) { - model_calculate_normals(vertices, normals, num_vertices-3, num_vertices-1, + if ( !have_normals ) { + model_calculate_normals(vertices, normals, num_vertices-3, num_vertices-1, num_vertices-3, num_vertices-2, num_vertices-1); + } } if ( num_vertices > MAX_VERTICES ) { fprintf(stderr, "Too many vertices in primitive\n"); diff --git a/src/obj2model.c b/src/obj2model.c index dd2621a..2e54b09 100644 --- a/src/obj2model.c +++ b/src/obj2model.c @@ -133,8 +133,10 @@ int main(int argc, char *argv[]) { fprintf(stderr, "Normal index is too high (%i/%i)\n", nnum, n_vntmp); continue; } - fprintf(out, "%+8.3f %+8.3f %+8.3f\n", vtmp[3*vnum+0], vtmp[3*vnum+1], - vtmp[3*vnum+2]); + fprintf(out, "%+8.3f %+8.3f %+8.3f %8.3f %8.3f %+8.3f %+8.3f %+8.3f\n", + vtmp[3*vnum+0], vtmp[3*vnum+1], vtmp[3*vnum+2], + 0.0, 0.0, + vntmp[3*nnum+0], vntmp[3*nnum+1], vntmp[3*nnum+2]); free(sp[0]); free(sp[1]); free(sp[2]); @@ -144,8 +146,9 @@ int main(int argc, char *argv[]) { int vnum; vnum = atoi(bits[i]); - fprintf(out, "%+8.3f %+8.3f %+8.3f\n", vtmp[3*vnum+0], vtmp[3*vnum+1], - vtmp[3*vnum+2]); + fprintf(out, "%+8.3f %+8.3f %+8.3f %8.3f %8.3f\n", + vtmp[3*vnum+0], vtmp[3*vnum+1], vtmp[3*vnum+2], + 0.0, 0.0); } -- cgit v1.2.3