--- ray/src/util/findglare.c 1991/03/18 12:15:38 1.1 +++ ray/src/util/findglare.c 1991/03/19 17:21:34 1.8 @@ -19,7 +19,7 @@ static char SCCSid[] = "$SunId$ LBL"; char *rtargv[32] = {"rtrace", "-h", "-ov", "-fff"}; int rtargc = 4; -VIEW ourview; /* our view */ +VIEW ourview = STDVIEW; /* our view */ VIEW pictview = STDVIEW; /* picture view */ VIEW leftview, rightview; /* leftmost and rightmost views */ @@ -29,8 +29,12 @@ char *octree = NULL; /* octree file name */ int verbose = 0; /* verbose reporting */ char *progname; /* global argv[0] */ +double threshold = 0.; /* glare threshold */ + +int sampdens = SAMPDENS; /* sample density */ ANGLE glarang[180] = {AEND}; /* glare calculation angles */ int nglarangs = 0; +double maxtheta; /* maximum angle (in radians) */ int hsize; /* horizontal size */ int hlim; /* central limit of horizontal */ @@ -55,6 +59,12 @@ char *argv[]; continue; } switch (argv[i][1]) { + case 't': + threshold = atof(argv[++i]); + break; + case 'r': + sampdens = atoi(argv[++i])/2; + break; case 'v': if (argv[i][2] == '\0') { verbose++; @@ -163,7 +173,8 @@ char *argv[]; exit(1); } init(); /* initialize program */ - comp_thresh(); /* compute glare threshold */ + if (threshold <= FTINY) + comp_thresh(); /* compute glare threshold */ analyze(); /* analyze view */ cleanup(); /* tidy up */ /* print header */ @@ -193,26 +204,29 @@ init() /* initialize global variables */ /* set direction vectors */ for (i = 0; glarang[i] != AEND; i++) ; - if (glarang[0] <= 0 || glarang[i-1] >= 180) { + if (i > 0 && glarang[0] <= 0 || glarang[i-1] >= 180) { fprintf(stderr, "%s: glare angles must be between 1 and 179\n", progname); exit(1); } nglarangs = i; /* nglardirs = 2*nglarangs + 1; */ - /* maxtheta = (PI/180.)*glarang[nglarangs-1]; */ - /* vsize = SAMPDENS; */ - hlim = SAMPDENS*maxtheta; - hsize = SAMPDENS + hlim; - if (hsize > (int)(PI*SAMPDENS)) - hsize = PI*SAMPDENS; + /* vsize = sampdens - 1; */ + if (nglarangs > 0) + maxtheta = (PI/180.)*glarang[nglarangs-1]; + else + maxtheta = 0.0; + hlim = sampdens*maxtheta; + hsize = hlim + sampdens - 1; + if (hsize > (int)(PI*sampdens)) + hsize = PI*sampdens; indirect = (struct illum *)calloc(nglardirs, sizeof(struct illum)); if (indirect == NULL) memerr("indirect illuminances"); copystruct(&leftview, &ourview); copystruct(&rightview, &ourview); - spinvector(leftview.vdir, ourview.vdir, ourview.vup, -maxtheta); - spinvector(rightview.vdir, ourview.vdir, ourview.vup, maxtheta); + spinvector(leftview.vdir, ourview.vdir, ourview.vup, maxtheta); + spinvector(rightview.vdir, ourview.vdir, ourview.vup, -maxtheta); setview(&leftview); setview(&rightview); indirect[nglarangs].lcos = @@ -273,43 +287,24 @@ int x, y; if (x <= -hlim) /* left region */ return(viewray(org, vd, &leftview, - (x+hlim)/(2.*SAMPDENS)+.5, - y/(2.*SAMPDENS)+.5)); + (x+hlim)/(2.*sampdens)+.5, + y/(2.*sampdens)+.5)); if (x >= hlim) /* right region */ return(viewray(org, vd, &rightview, - (x-hlim)/(2.*SAMPDENS)+.5, - y/(2.*SAMPDENS)+.5)); + (x-hlim)/(2.*sampdens)+.5, + y/(2.*sampdens)+.5)); /* central region */ - if (viewray(org, vd, &ourview, .5, y/(2.*SAMPDENS)+.5) < 0) + if (viewray(org, vd, &ourview, .5, y/(2.*sampdens)+.5) < 0) return(-1); spinvector(vd, vd, ourview.vup, h_theta(x)); return(0); } -spinvector(vres, vorig, vnorm, theta) /* rotate vector around normal */ -FVECT vres, vorig, vnorm; -double theta; -{ - extern double sin(), cos(); - double sint, cost, dotp; - FVECT vperp; - register int i; - - sint = sin(theta); - cost = cos(theta); - dotp = DOT(vorig, vnorm); - fcross(vperp, vnorm, vorig); - for (i = 0; i < 3; i++) - vres[i] = vnorm[i]*dotp*(1.-cost) + - vorig[i]*cost + vperp[i]*sint; -} - - memerr(s) /* malloc failure */ char *s; { - fprintf(stderr, "%s: out of memory for %s\n", s); + fprintf(stderr, "%s: out of memory for %s\n", progname, s); exit(1); } @@ -333,7 +328,7 @@ printillum() /* print out indirect illuminances */ printf("BEGIN indirect illuminance\n"); for (i = 0; i < nglardirs; i++) - printf("\t%f\t%f\n", (180.0/PI)*indirect[i].theta, + printf("\t%.0f\t%f\n", (180.0/PI)*indirect[i].theta, PI * indirect[i].sum / (double)indirect[i].n); - printf("END indirect illuminances\n"); + printf("END indirect illuminance\n"); }