--- ray/src/gen/replmarks.c 1991/02/17 22:36:30 1.1 +++ ray/src/gen/replmarks.c 1992/03/03 21:30:03 2.2 @@ -1,4 +1,4 @@ -/* Copyright (c) 1991 Regents of the University of California */ +/* Copyright (c) 1992 Regents of the University of California */ #ifndef lint static char SCCSid[] = "$SunId$ LBL"; @@ -22,24 +22,27 @@ static char SCCSid[] = "$SunId$ LBL"; #define PI 3.14159265358979323846 #endif +#define FEQ(a,b) ((a)-(b) <= 1e-7 && (b)-(a) <= 1e-7) + #define MAXVERT 6 /* maximum number of vertices for markers */ +#define MAXMARK 32 /* maximum number of markers */ typedef struct { short beg, end; /* beginning and ending vertex */ float len2; /* length squared */ } EDGE; /* a marker edge */ -int expand = 0; /* expand commands? */ +struct mrkr { + char *modout; /* output modifier */ + double mscale; /* scale by this to get unit */ + char *modin; /* input modifier indicating marker */ + char *objname; /* output object file or octree */ + int doxform; /* true if xform, false if instance */ +} marker[MAXMARK]; /* array of markers */ +int nmarkers = 0; /* number of markers */ -char *modout = "void"; /* output modifier (for instances) */ +int expand; /* expand commands? */ -double markscale = 0.0; /* scale markers by this to get unit */ - -char *modin = NULL; /* input modifier indicating marker */ - -char *objname = NULL; /* output object file (octree if instance) */ -int doxform; /* true if xform, false if instance */ - char *progname; @@ -51,31 +54,41 @@ char *argv[]; int i, j; progname = argv[0]; - for (i = 1; i < argc && argv[i][0] == '-'; i++) - switch (argv[i][1]) { - case 'i': - doxform = 0; - objname = argv[++i]; - break; - case 'x': - doxform = 1; - objname = argv[++i]; - break; - case 'e': - expand = !expand; - break; - case 'm': - modout = argv[++i]; - break; - case 's': - markscale = atof(argv[++i]); - break; - default: + i = 1; + while (i < argc && argv[i][0] == '-') { + do { + switch (argv[i][1]) { + case 'i': + marker[nmarkers].doxform = 0; + marker[nmarkers].objname = argv[++i]; + break; + case 'x': + marker[nmarkers].doxform = 1; + marker[nmarkers].objname = argv[++i]; + break; + case 'e': + expand = 1; + break; + case 'm': + marker[nmarkers].modout = argv[++i]; + break; + case 's': + marker[nmarkers].mscale = atof(argv[++i]); + break; + default: + goto userr; + } + if (++i >= argc) + goto userr; + } while (argv[i][0] == '-'); + if (marker[nmarkers].objname == NULL) goto userr; - } - if (i < argc) - modin = argv[i++]; - if (objname == NULL || modin == NULL) + marker[nmarkers++].modin = argv[i++]; + if (nmarkers >= MAXMARK) + break; + marker[nmarkers].mscale = marker[nmarkers-1].mscale; + } + if (nmarkers == 0) goto userr; /* simple header */ putchar('#'); @@ -98,7 +111,7 @@ char *argv[]; exit(0); userr: fprintf(stderr, -"Usage: %s [-e][-s size][-m modout] {-x objfile|-i octree} modname [file ..]\n", +"Usage: %s [-e][-s size][-m modout] {-x objfile|-i octree} modname .. [file ..]\n", progname); exit(1); } @@ -158,14 +171,17 @@ char *fname; FILE *fin; { char buf[128], typ[16], nam[128]; - int i, j, n; + int i, n; + register int j; if (fscanf(fin, "%s %s %s", buf, typ, nam) != 3) goto readerr; - if (!strcmp(buf, modin) && !strcmp(typ, "polygon")) { - replace(fname, nam, fin); - return; - } + if (!strcmp(typ, "polygon")) + for (j = 0; j < nmarkers; j++) + if (!strcmp(buf, marker[j].modin)) { + replace(fname, &marker[j], nam, fin); + return; + } printf("\n%s %s %s\n", buf, typ, nam); if (!strcmp(typ, "alias")) { /* alias special case */ if (fscanf(fin, "%s", buf) != 1) @@ -193,29 +209,33 @@ readerr: } -replace(fname, mark, fin) /* replace marker */ -char *fname, *mark; +replace(fname, m, mark, fin) /* replace marker */ +char *fname; +register struct mrkr *m; +char *mark; FILE *fin; { int n; char buf[256]; - if (doxform) { + if (m->doxform) { sprintf(buf, "xform -e -n %s", mark); - if (buildxf(buf+strlen(buf), fin) < 0) + if (m->modout != NULL) + sprintf(buf+strlen(buf), " -m %s", m->modout); + if (buildxf(buf+strlen(buf), m->mscale, fin) < 0) goto badxf; - sprintf(buf+strlen(buf), " %s", objname); + sprintf(buf+strlen(buf), " %s", m->objname); if (expand) { fflush(stdout); system(buf); } else printf("\n!%s\n", buf); } else { - if ((n = buildxf(buf, fin)) < 0) + if ((n = buildxf(buf, m->mscale, fin)) < 0) goto badxf; - printf("\n%s instance %s\n", modout, mark); - printf("%d %s%s\n", n+1, objname, buf); - printf("\n0\n0\n"); + printf("\n%s instance %s\n", + m->modout==NULL?"void":m->modout, mark); + printf("%d %s%s\n0\n0\n", n+1, m->objname, buf); } return; badxf: @@ -237,8 +257,9 @@ EDGE *e1, *e2; int -buildxf(xf, fin) /* build transform for marker */ +buildxf(xf, markscale, fin) /* build transform for marker */ char *xf; +double markscale; FILE *fin; { static FVECT vlist[MAXVERT]; @@ -321,12 +342,27 @@ addrot(xf, xp, yp, zp) /* compute rotation (x,y,z) => char *xf; FVECT xp, yp, zp; { - double tx, ty, tz; + int n; + double theta; - tx = atan2(yp[2], zp[2]); - ty = asin(-xp[2]); - tz = atan2(xp[1], xp[0]); - sprintf(xf, " -rx %f -ry %f -rz %f", tx*(180./PI), - ty*(180./PI), tz*(180./PI)); - return(6); + n = 0; + theta = atan2(yp[2], zp[2]); + if (!FEQ(theta,0.0)) { + sprintf(xf, " -rx %f", theta*(180./PI)); + xf += strlen(xf); + n += 2; + } + theta = asin(-xp[2]); + if (!FEQ(theta,0.0)) { + sprintf(xf, " -ry %f", theta*(180./PI)); + xf += strlen(xf); + n += 2; + } + theta = atan2(xp[1], xp[0]); + if (!FEQ(theta,0.0)) { + sprintf(xf, " -rz %f", theta*(180./PI)); + /* xf += strlen(xf); */ + n += 2; + } + return(n); }