--- ray/src/common/readmesh.c 2003/03/11 17:08:55 2.1 +++ ray/src/common/readmesh.c 2003/07/16 01:32:53 2.7 @@ -1,14 +1,18 @@ #ifndef lint -static const char RCSid[] = "$Id: readmesh.c,v 2.1 2003/03/11 17:08:55 greg Exp $"; +static const char RCSid[] = "$Id: readmesh.c,v 2.7 2003/07/16 01:32:53 greg Exp $"; #endif /* * Routines for reading a compiled mesh from a file */ +#include + #include "standard.h" +#include "platform.h" #include "octree.h" #include "object.h" #include "mesh.h" +#include "resolu.h" static char *meshfn; /* input file name */ static FILE *meshfp; /* mesh file pointer */ @@ -73,21 +77,22 @@ gettree() /* get a pre-ordered octree */ register int i; switch (getc(meshfp)) { - case OT_EMPTY: - return(EMPTY); - case OT_FULL: - return(getfullnode()); - case OT_TREE: - if ((ot = octalloc()) == EMPTY) - mesherror(SYSTEM, "out of tree space in readmesh"); - for (i = 0; i < 8; i++) - octkid(ot, i) = gettree(); - return(ot); - case EOF: - mesherror(USER, "truncated mesh octree"); - default: - mesherror(USER, "damaged mesh octree"); + case OT_EMPTY: + return(EMPTY); + case OT_FULL: + return(getfullnode()); + case OT_TREE: + if ((ot = octalloc()) == EMPTY) + mesherror(SYSTEM, "out of tree space in readmesh"); + for (i = 0; i < 8; i++) + octkid(ot, i) = gettree(); + return(ot); + case EOF: + mesherror(USER, "truncated mesh octree"); + default: + mesherror(USER, "damaged mesh octree"); } + return NULL; /* pro forma return */ } @@ -130,17 +135,17 @@ register MESHPATCH *pp; pp->nverts = mgetint(2); if (pp->nverts <= 0 || pp->nverts > 256) mesherror(USER, "bad number of patch vertices"); - pp->xyz = (uint4 (*)[3])malloc(pp->nverts*3*sizeof(uint4)); + pp->xyz = (uint32 (*)[3])malloc(pp->nverts*3*sizeof(uint32)); if (pp->xyz == NULL) goto nomem; if (flags & MT_N) { - pp->norm = (int4 *)calloc(pp->nverts, sizeof(int4)); + pp->norm = (int32 *)calloc(pp->nverts, sizeof(int32)); if (pp->norm == NULL) goto nomem; } else pp->norm = NULL; if (flags & MT_UV) { - pp->uv = (uint4 (*)[2])calloc(pp->nverts, 2*sizeof(uint4)); + pp->uv = (uint32 (*)[2])calloc(pp->nverts, 2*sizeof(uint32)); if (pp->uv == NULL) goto nomem; } else @@ -174,6 +179,17 @@ register MESHPATCH *pp; } } else pp->tri = NULL; + /* local triangle material(s) */ + if (mgetint(2) > 1) { + pp->trimat = (int16 *)malloc(pp->ntris*sizeof(int16)); + if (pp->trimat == NULL) + goto nomem; + for (i = 0; i < pp->ntris; i++) + pp->trimat[i] = mgetint(2); + } else { + pp->solemat = mgetint(2); + pp->trimat = NULL; + } /* joiner triangles */ pp->nj1tris = mgetint(2); if (pp->nj1tris < 0 || pp->nj1tris > 512) @@ -187,6 +203,7 @@ register MESHPATCH *pp; pp->j1tri[i].v1j = mgetint(4); pp->j1tri[i].v2 = mgetint(1); pp->j1tri[i].v3 = mgetint(1); + pp->j1tri[i].mat = mgetint(2); } } else pp->j1tri = NULL; @@ -203,6 +220,7 @@ register MESHPATCH *pp; pp->j2tri[i].v1j = mgetint(4); pp->j2tri[i].v2j = mgetint(4); pp->j2tri[i].v3 = mgetint(1); + pp->j2tri[i].mat = mgetint(2); } } else pp->j2tri = NULL; @@ -218,6 +236,7 @@ MESH *mp; char *path; int flags; { + char *err; char sbuf[64]; int i; /* check what's loaded */ @@ -230,9 +249,7 @@ int flags; sprintf(errmsg, "cannot open mesh file \"%s\"", path); error(SYSTEM, errmsg); } -#ifdef MSDOS - setmode(fileno(meshfp), O_BINARY); -#endif + SET_FILE_BINARY(meshfp); /* read header */ checkheader(meshfp, MESHFMT, flags&IO_INFO ? stdout : (FILE *)NULL); /* read format number */ @@ -259,8 +276,11 @@ int flags; mp->mcube.cutree = gettree(); else if (flags & IO_SCENE) skiptree(); - /* read the patches */ + /* read materials and patches */ if (flags & IO_SCENE) { + mp->mat0 = nobjects; + readscene(meshfp, objsize); + mp->nmats = nobjects - mp->mat0; mp->npatches = mgetint(4); mp->patch = (MESHPATCH *)calloc(mp->npatches, sizeof(MESHPATCH)); @@ -272,4 +292,7 @@ int flags; /* clean up */ fclose(meshfp); mp->ldflags |= flags; + /* verify data */ + if ((err = checkmesh(mp)) != NULL) + mesherror(USER, err); }