--- ray/src/util/findglare.c 1991/04/22 08:21:01 1.20 +++ ray/src/util/findglare.c 1992/05/12 09:36:14 2.2 @@ -12,11 +12,11 @@ static char SCCSid[] = "$SunId$ LBL"; #include "glare.h" -#define FEQ(a,b) ((a)-(b)<=FTINY&&(a)-(b)<=FTINY) +#define FEQ(a,b) ((a)-(b)<=FTINY&&(b)-(a)<=FTINY) #define VEQ(v1,v2) (FEQ((v1)[0],(v2)[0])&&FEQ((v1)[1],(v2)[1]) \ &&FEQ((v1)[2],(v2)[2])) -char *rtargv[32] = {"rtrace", "-h", "-ov", "-fff"}; +char *rtargv[32] = {"rtrace", "-h-", "-ov", "-fff"}; int rtargc = 4; VIEW ourview = STDVIEW; /* our view */ @@ -106,6 +106,7 @@ char *argv[]; break; case 'd': case 'l': + case 's': rtargv[rtargc++] = argv[i]; rtargv[rtargc++] = argv[++i]; break; @@ -190,7 +191,7 @@ char *argv[]; fputs(VIEWSTR, stdout); fprintview(&ourview, stdout); printf("\n"); - fputformat("ASCII", stdout); + fputformat("ascii", stdout); printf("\n"); printsources(); /* print glare sources */ printillum(); /* print illuminances */ @@ -203,6 +204,23 @@ userr: } +int +angcmp(ap1, ap2) /* compare two angles */ +ANGLE *ap1, *ap2; +{ + register int a1, a2; + + a1 = *ap1; + a2 = *ap2; + if (a1 == a2) { + fprintf(stderr, "%s: duplicate glare angle (%d)\n", + progname, a1); + exit(1); + } + return(a1-a2); +} + + init() /* initialize global variables */ { double d; @@ -214,8 +232,9 @@ init() /* initialize global variables */ /* set direction vectors */ for (i = 0; glarang[i] != AEND; i++) ; - if (i > 0 && (glarang[0] <= 0 || glarang[i-1] >= 180)) { - fprintf(stderr, "%s: glare angles must be between 1 and 179\n", + qsort(glarang, i, sizeof(ANGLE), angcmp); + if (i > 0 && (glarang[0] <= 0 || glarang[i-1] > 180)) { + fprintf(stderr, "%s: glare angles must be between 1 and 180\n", progname); exit(1); } @@ -300,14 +319,20 @@ int x, y; FVECT org; /* dummy variable */ hl = hlim(y); - if (x <= -hl) /* left region */ + if (x <= -hl) { /* left region */ + if (x <= -hl-sampdens) + return(-1); return(viewray(org, vd, &leftview, (double)(x+hl)/(2*sampdens)+.5, (double)y/(2*sampdens)+.5)); - if (x >= hl) /* right region */ + } + if (x >= hl) { /* right region */ + if (x >= hl+sampdens) + return(-1); return(viewray(org, vd, &rightview, (double)(x-hl)/(2*sampdens)+.5, (double)y/(2*sampdens)+.5)); + } /* central region */ if (viewray(org, vd, &ourview, .5, (double)y/(2*sampdens)+.5) < 0) return(-1);