--- ray/src/common/objutil.c 2020/05/02 00:12:45 2.5 +++ ray/src/common/objutil.c 2020/12/18 00:15:47 2.10 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: objutil.c,v 2.5 2020/05/02 00:12:45 greg Exp $"; +static const char RCSid[] = "$Id: objutil.c,v 2.10 2020/12/18 00:15:47 greg Exp $"; #endif /* * Basic .OBJ scene handling routines. @@ -19,7 +19,7 @@ static const char RCSid[] = "$Id: objutil.c,v 2.5 2020 int findName(const char *nm, const char **nmlist, int n) { - register int i; + int i; for (i = n; i-- > 0; ) if (!strcmp(nmlist[i], nm)) @@ -322,7 +322,7 @@ replace_vertex(Scene *sc, int prev, int repl, double e goto linkerr; /* XXX doesn't allow for multiple references to prev in face */ f->v[j].vid = repl; /* replace vertex itself */ - if (faceArea(sc, f, NULL) <= FTINY) + if (faceArea(sc, f, NULL) <= FTINY*FTINY) f->flags |= FACE_DEGENERATE; if (f->v[j].tid >= 0) /* replace texture if appropriate */ for (i = 0; repl_tex[i] >= 0; i++) { @@ -460,6 +460,8 @@ findDuplicateFaces(Scene *sc) ++nfound; } } + if (verbose) + fprintf(stderr, "Found %d duplicate faces\n", nfound); return(nfound); } @@ -547,6 +549,19 @@ addComment(Scene *sc, const char *comment) sc->descr[sc->ndescr++] = savqstr((char *)comment); } +/* Find index for comment containing the given string (starting from n) */ +int +findComment(Scene *sc, const char *match, int n) +{ + if (n >= sc->ndescr) + return(-1); + n *= (n > 0); + while (n < sc->ndescr) + if (strstr(sc->descr[n], match) != NULL) + return(n); + return(-1); +} + /* Clear comments */ void clearComments(Scene *sc) @@ -690,7 +705,7 @@ addFace(Scene *sc, VNDX vid[], int nv) sc->flist = f; sc->nfaces++; /* check face area */ - if (!(f->flags & FACE_DEGENERATE) && faceArea(sc, f, NULL) <= FTINY) + if (!(f->flags & FACE_DEGENERATE) && faceArea(sc, f, NULL) <= FTINY*FTINY) f->flags |= FACE_DEGENERATE; return(f); } @@ -760,10 +775,14 @@ dupScene(const Scene *osc) return(sc); } +#define MAXAC 100 + /* Transform entire scene */ int xfScene(Scene *sc, int xac, char *xav[]) { + char comm[24+MAXAC*8]; + char *cp; XF myxf; FVECT vec; int i; @@ -786,11 +805,18 @@ xfScene(Scene *sc, int xac, char *xav[]) vec[0] /= myxf.sca; vec[1] /= myxf.sca; vec[2] /= myxf.sca; VCOPY(sc->norm[i], vec); } + /* add comment */ + cp = strcpy(comm, "Transformed by:"); + for (i = 0; i < xac; i++) { + while (*cp) cp++; + *cp++ = ' '; + strcpy(cp, xav[i]); + } + addComment(sc, comm); return(xac); /* all done */ } /* Ditto, using transform string rather than pre-parsed words */ -#define MAXAC 100 int xfmScene(Scene *sc, const char *xfm) {