--- ray/src/util/glarendx.c 1995/06/04 10:58:38 2.5 +++ ray/src/util/glarendx.c 2018/04/02 16:45:41 2.12 @@ -1,9 +1,6 @@ -/* Copyright (c) 1991 Regents of the University of California */ - #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: glarendx.c,v 2.12 2018/04/02 16:45:41 greg Exp $"; #endif - /* * Compute Glare Index given by program name or -t option: * @@ -21,19 +18,48 @@ static char SCCSid[] = "$SunId$ LBL"; * 12 April 1991 Greg Ward EPFL * 19 April 1993 R. Compagnon EPFL (added dgi, brs_gi, ugr) */ - + +#include + #include "standard.h" #include "view.h" - - -double posindex(); - -double direct(), guth_dgr(), guth_vcp(), cie_cgi(), - indirect(), total(), dgi(), brs_gi(), ugr(); - + + +struct glare_src { + FVECT dir; /* source direction */ + double dom; /* solid angle */ + double lum; /* average luminance */ + struct glare_src *next; +} *all_srcs = NULL; + +struct glare_dir { + double ang; /* angle (in radians) */ + double indirect; /* indirect illuminance */ + struct glare_dir *next; +} *all_dirs = NULL; + +typedef double gdfun(struct glare_dir *gd); + +static gdfun dgi; +static gdfun brs_gi; +static gdfun ugr; +static gdfun guth_dgr; +static gdfun guth_vcp; +static gdfun cie_cgi; +static gdfun direct; +static gdfun indirect; +static gdfun total; + +static gethfunc headline; +static void init(void); +static void read_input(void); +static void print_values(gdfun *func); +static double posindex(FVECT sd, FVECT vd, FVECT vu); + + struct named_func { char *name; - double (*func)(); + gdfun *func; char *descrip; } all_funcs[] = { {"dgi", dgi, "Daylight Glare Index"}, @@ -47,41 +73,29 @@ struct named_func { {"vert_ind", indirect, "Indirect Vertical Illuminance"}, {NULL} }; - -struct glare_src { - FVECT dir; /* source direction */ - double dom; /* solid angle */ - double lum; /* average luminance */ - struct glare_src *next; -} *all_srcs = NULL; - -struct glare_dir { - double ang; /* angle (in radians) */ - double indirect; /* indirect illuminance */ - struct glare_dir *next; -} *all_dirs = NULL; - + #define newp(type) (type *)malloc(sizeof(type)) - + char *progname; int print_header = 1; - + VIEW midview = STDVIEW; - + int wrongformat = 0; - - -main(argc, argv) -int argc; -char *argv[]; + + +int +main( + int argc, + char *argv[] +) { - extern char *rindex(); struct named_func *funp; char *progtail; int i; /* get program name */ progname = argv[0]; - progtail = rindex(progname, '/'); /* final component */ + progtail = strrchr(progname, '/'); /* final component */ if (progtail == NULL) progtail = progname; else @@ -125,13 +139,16 @@ userr: fprintf(stderr, "\t%12s\t%s\n", funp->name, funp->descrip); exit(1); } - - -headline(s) /* get line from header */ -char *s; + + +static int +headline( /* get line from header */ + char *s, + void *p +) { char fmt[32]; - + if (print_header) /* copy to output */ fputs(s, stdout); if (isview(s)) @@ -140,10 +157,12 @@ char *s; formatval(fmt, s); wrongformat = strcmp(fmt, "ascii"); } + return(0); } - - -init() /* initialize calculation */ + + +static void +init(void) /* initialize calculation */ { /* read header */ getheader(stdin, headline, NULL); @@ -158,18 +177,19 @@ init() /* initialize calculation */ exit(1); } } - - -read_input() /* read glare sources from stdin */ + + +static void +read_input(void) /* read glare sources from stdin */ { #define S_SEARCH 0 #define S_SOURCE 1 #define S_DIREC 2 int state = S_SEARCH; char buf[128]; - register struct glare_src *gs; - register struct glare_dir *gd; - + struct glare_src *gs; + struct glare_dir *gd; + while (fgets(buf, sizeof(buf), stdin) != NULL) switch (state) { case S_SEARCH: @@ -185,9 +205,10 @@ read_input() /* read glare sources from stdin */ } if ((gs = newp(struct glare_src)) == NULL) goto memerr; - if (sscanf(buf, "%lf %lf %lf %lf %lf", - &gs->dir[0], &gs->dir[1], &gs->dir[2], - &gs->dom, &gs->lum) != 5) + if (sscanf(buf, FVFORMAT, &gs->dir[0], &gs->dir[1], + &gs->dir[2]) != 3 || + sscanf(sskip2(buf, 3), "%lf %lf", + &gs->dom, &gs->lum) != 2) goto readerr; normalize(gs->dir); gs->next = all_srcs; @@ -219,26 +240,29 @@ readerr: #undef S_SOURCE #undef S_DIREC } - - -print_values(funp) /* print out calculations */ -double (*funp)(); + + +static void +print_values( /* print out calculations */ + gdfun *func +) { - register struct glare_dir *gd; - + struct glare_dir *gd; + for (gd = all_dirs; gd != NULL; gd = gd->next) - printf("%f\t%f\n", gd->ang*(180.0/PI), (*funp)(gd)); + printf("%f\t%f\n", gd->ang*(180.0/PI), (*func)(gd)); } - - -double -direct(gd) /* compute direct vertical illuminance */ -struct glare_dir *gd; + + +static double +direct( /* compute direct vertical illuminance */ + struct glare_dir *gd +) { FVECT mydir; double d, dval; - register struct glare_src *gs; - + struct glare_src *gs; + spinvector(mydir, midview.vdir, midview.vup, gd->ang); dval = 0.0; for (gs = all_srcs; gs != NULL; gs = gs->next) { @@ -248,24 +272,26 @@ struct glare_dir *gd; } return(dval); } - - -double -indirect(gd) /* return indirect vertical illuminance */ -struct glare_dir *gd; + + +static double +indirect( /* return indirect vertical illuminance */ + struct glare_dir *gd +) { return(gd->indirect); } - - -double -total(gd) /* return total vertical illuminance */ -struct glare_dir *gd; + + +static double +total( /* return total vertical illuminance */ + struct glare_dir *gd +) { return(direct(gd)+gd->indirect); } - - + + /* * posindex - compute glare position index from: * @@ -279,14 +305,17 @@ struct glare_dir *gd; * This calculation presumes the view direction and up vectors perpendicular. * We return a value less than zero for improper positions. */ - -double -posindex(sd, vd, vu) /* compute position index */ -FVECT sd, vd, vu; + +static double +posindex( /* compute position index */ + FVECT sd, + FVECT vd, + FVECT vu +) { double sigma, tau; double d; - + d = DOT(sd,vd); if (d <= 0.0) return(-1.0); @@ -302,17 +331,18 @@ FVECT sd, vd, vu; + sigma*(21. + tau*(.26667 + tau*-.002963))*1e-5 ) ) ); } - - -double -dgi(gd) /* compute Daylight Glare Index */ -struct glare_dir *gd; + + +static double +dgi( /* compute Daylight Glare Index */ + struct glare_dir *gd +) { - register struct glare_src *gs; + struct glare_src *gs; FVECT mydir,testdir[7],vhor; - double r,omega,p[7],sum; + double r,posn,omega,p[7],sum; int i,n; - + spinvector(mydir, midview.vdir, midview.vup, gd->ang); sum = 0.0; n = 0; for (gs = all_srcs; gs != NULL; gs = gs->next) { @@ -332,8 +362,11 @@ struct glare_dir *gd; fvsum(testdir[4],testdir[4],midview.vup,-0.866*r); for (i = 0; i < 7; i++) { normalize(testdir[i]); - p[i] = pow(posindex(testdir[i],mydir,midview.vup),-2.0); - if (p[i] <= FTINY) p[i] = 0.0; + posn = posindex(testdir[i],mydir,midview.vup); + if (posn <= FTINY) + p[i] = 0.0; + else + p[i] = 1./(posn*posn); } r = 1-gs->dom/2./PI; omega = gs->dom*p[0]; @@ -341,7 +374,7 @@ struct glare_dir *gd; omega += (2*PI-r*PI*(1+1/r/r))*(-p[0]-0.1667*(p[1]+p[3]) +0.3334*(p[2]+p[4]+p[5]+p[6])); - sum += pow(gs->lum,1.6) * pow(omega,0.8) / + sum += pow(gs->lum,1.6) * pow(omega,0.8) / (gd->indirect/PI + 0.07*sqrt(gs->dom)*gs->lum); n++; } @@ -349,17 +382,18 @@ struct glare_dir *gd; return(0.0); return( 10*log10(0.478*sum) ); } - -double -brs_gi(gd) /* compute BRS Glare Index */ -struct glare_dir *gd; + +static double +brs_gi( /* compute BRS Glare Index */ + struct glare_dir *gd +) { - register struct glare_src *gs; + struct glare_src *gs; FVECT mydir; double p; double sum; - + spinvector(mydir, midview.vdir, midview.vup, gd->ang); sum = 0.0; for (gs = all_srcs; gs != NULL; gs = gs->next) { @@ -375,18 +409,19 @@ struct glare_dir *gd; } -double -guth_dgr(gd) /* compute Guth discomfort glare rating */ -struct glare_dir *gd; +static double +guth_dgr( /* compute Guth discomfort glare rating */ + struct glare_dir *gd +) { #define q(w) (20.4*w+1.52*pow(w,.2)-.075) - register struct glare_src *gs; + struct glare_src *gs; FVECT mydir; double p; double sum; double wtot, brsum; int n; - + spinvector(mydir, midview.vdir, midview.vup, gd->ang); sum = wtot = brsum = 0.0; n = 0; for (gs = all_srcs; gs != NULL; gs = gs->next) { @@ -404,39 +439,41 @@ struct glare_dir *gd; pow((double)n, -.0914) ) ); #undef q } - - + + #ifndef M_SQRT2 #define M_SQRT2 1.41421356237309504880 #endif - + #define norm_integral(z) (1.-.5*erfc((z)/M_SQRT2)) - - -double -guth_vcp(gd) /* compute Guth visual comfort probability */ -struct glare_dir *gd; + + +static double +guth_vcp( /* compute Guth visual comfort probability */ + struct glare_dir *gd +) { extern double erfc(); double dgr; - + dgr = guth_dgr(gd); if (dgr <= FTINY) return(100.0); return(100.*norm_integral(6.374-1.3227*log(dgr))); } - - -double -cie_cgi(gd) /* compute CIE Glare Index */ -struct glare_dir *gd; + + +static double +cie_cgi( /* compute CIE Glare Index */ + struct glare_dir *gd +) { - register struct glare_src *gs; + struct glare_src *gs; FVECT mydir; double dillum; double p; double sum; - + spinvector(mydir, midview.vdir, midview.vup, gd->ang); sum = 0.0; for (gs = all_srcs; gs != NULL; gs = gs->next) { @@ -452,15 +489,16 @@ struct glare_dir *gd; } -double -ugr(gd) /* compute Unified Glare Rating */ -struct glare_dir *gd; +static double +ugr( /* compute Unified Glare Rating */ + struct glare_dir *gd +) { - register struct glare_src *gs; + struct glare_src *gs; FVECT mydir; double p; double sum; - + spinvector(mydir, midview.vdir, midview.vup, gd->ang); sum = 0.0; for (gs = all_srcs; gs != NULL; gs = gs->next) {