| 1 | – | /* Copyright (c) 1991 Regents of the University of California */ | 
| 2 | – |  | 
| 1 |  | #ifndef lint | 
| 2 | < | static char SCCSid[] = "$SunId$ LBL"; | 
| 2 | > | static const char RCSid[] = "$Id$"; | 
| 3 |  | #endif | 
| 6 | – |  | 
| 4 |  | /* | 
| 5 |  | * Routines to print mkillum objects | 
| 6 |  | */ | 
| 7 |  |  | 
| 8 |  | #include  "mkillum.h" | 
| 9 | + | #include  "paths.h" | 
| 10 |  |  | 
| 11 | < | #define  brt(col)       (.295*(col)[0] + .635*(col)[1] + .070*(col)[2]) | 
| 11 | > | #define  brt(col)       (.263*(col)[0]+.655*(col)[1]+.082*(col)[2]) | 
| 12 |  |  | 
| 13 |  | char    DATORD[] = "RGB";               /* data ordering */ | 
| 14 |  | char    DATSUF[] = ".dat";              /* data file suffix */ | 
| 15 |  | char    DSTSUF[] = ".dist";             /* distribution suffix */ | 
| 16 |  | char    FNCFNM[] = "illum.cal";         /* function file name */ | 
| 17 |  |  | 
| 18 | + | void compinv(COLORV *rinv, COLORV *rp, int m); | 
| 19 | + | void colorout(int p, COLORV *da, int n, int m, double mult, FILE *fp); | 
| 20 | + | void fputnum(double d, FILE *fp); | 
| 21 | + | void brightout(COLORV *da, int n, int m, double mult, FILE *fp); | 
| 22 | + | void fputeol(FILE *fp); | 
| 23 | + | void compavg(COLOR col, COLORV *da, int n); | 
| 24 | + | char * dfname(struct illum_args *il, int c); | 
| 25 | + | FILE * dfopen(struct illum_args *il, int c); | 
| 26 |  |  | 
| 27 | < | printobj(mod, obj)              /* print out an object */ | 
| 28 | < | char  *mod; | 
| 29 | < | register OBJREC  *obj; | 
| 27 | > |  | 
| 28 | > | void | 
| 29 | > | printobj(               /* print out an object */ | 
| 30 | > | char  *mod, | 
| 31 | > | register OBJREC  *obj | 
| 32 | > | ) | 
| 33 |  | { | 
| 34 |  | register int  i; | 
| 35 |  |  | 
| 36 | + | if (issurface(obj->otype) && !strcmp(mod, VOIDID)) | 
| 37 | + | return;         /* don't print void surfaces */ | 
| 38 |  | printf("\n%s %s %s", mod, ofun[obj->otype].funame, obj->oname); | 
| 39 |  | printf("\n%d", obj->oargs.nsargs); | 
| 40 |  | for (i = 0; i < obj->oargs.nsargs; i++) | 
| 57 |  |  | 
| 58 |  |  | 
| 59 |  | char * | 
| 60 | < | dfname(il, c)                   /* return data file name */ | 
| 61 | < | struct illum_args  *il; | 
| 62 | < | int  c; | 
| 60 | > | dfname(                 /* return data file name */ | 
| 61 | > | struct illum_args  *il, | 
| 62 | > | int  c | 
| 63 | > | ) | 
| 64 |  | { | 
| 53 | – | extern char  *getpath(), *strcpy(); | 
| 65 |  | char  fname[MAXSTR]; | 
| 66 |  | register char  *s; | 
| 67 |  |  | 
| 78 |  |  | 
| 79 |  |  | 
| 80 |  | FILE * | 
| 81 | < | dfopen(il, c)                   /* open data file */ | 
| 82 | < | register struct illum_args  *il; | 
| 83 | < | int  c; | 
| 81 | > | dfopen(                 /* open data file */ | 
| 82 | > | register struct illum_args  *il, | 
| 83 | > | int  c | 
| 84 | > | ) | 
| 85 |  | { | 
| 86 |  | char  *fn; | 
| 87 |  | FILE  *fp; | 
| 99 |  | } | 
| 100 |  |  | 
| 101 |  |  | 
| 102 | < | flatout(il, da, n, m, u, v, w)          /* write hemispherical distribution */ | 
| 103 | < | struct illum_args  *il; | 
| 104 | < | float  *da; | 
| 105 | < | int  n, m; | 
| 106 | < | FVECT  u, v, w; | 
| 102 | > | extern void | 
| 103 | > | flatout(                /* write hemispherical distribution */ | 
| 104 | > | struct illum_args  *il, | 
| 105 | > | COLORV  *da, | 
| 106 | > | int  n, | 
| 107 | > | int  m, | 
| 108 | > | FVECT  u, | 
| 109 | > | FVECT  v, | 
| 110 | > | FVECT  w | 
| 111 | > | ) | 
| 112 |  | { | 
| 113 | + | COLORV  *Ninv; | 
| 114 |  | FILE  *dfp; | 
| 115 |  | int  i; | 
| 116 |  |  | 
| 117 | + | if ((Ninv = (COLORV *)malloc(3*m*sizeof(COLORV))) == NULL) | 
| 118 | + | error(SYSTEM, "out of memory in flatout"); | 
| 119 | + | compinv(Ninv, da, m); | 
| 120 |  | if (il->flags & IL_COLDST) { | 
| 121 |  | printf("\n%s %s %s%s", VOIDID, ofun[PAT_CDATA].funame, | 
| 122 |  | il->matname, DSTSUF); | 
| 124 |  | for (i = 0; i < 3; i++) { | 
| 125 |  | dfp = dfopen(il, DATORD[i]); | 
| 126 |  | fprintf(dfp, "2\n%f %f %d\n%f %f %d\n", | 
| 127 | < | 1.-.5/n, .5/n, n, | 
| 127 | > | 1.+.5/n, .5/n, n+1, | 
| 128 |  | 0., 2.*PI, m+1); | 
| 129 | + | colorout(i, Ninv, 1, m, 1./il->nsamps/il->col[i], dfp); | 
| 130 |  | colorout(i, da, n, m, 1./il->nsamps/il->col[i], dfp); | 
| 131 | + | fputeol(dfp); | 
| 132 |  | fclose(dfp); | 
| 133 |  | printf(" %s", dfname(il, DATORD[i])); | 
| 134 |  | } | 
| 135 |  | } else { | 
| 136 |  | printf("\n%s %s %s%s", VOIDID, ofun[PAT_BDATA].funame, | 
| 137 |  | il->matname, DSTSUF); | 
| 138 | < | printf("\n5 noop"); | 
| 138 | > | printf("\n5 noneg"); | 
| 139 |  | dfp = dfopen(il, 0); | 
| 140 | < | fprintf(dfp, "2\n%f %f %d\n%f %f %d\n", 1.-.5/n, .5/n, n, | 
| 140 | > | fprintf(dfp, "2\n%f %f %d\n%f %f %d\n", | 
| 141 | > | 1.+.5/n, .5/n, n+1, | 
| 142 |  | 0., 2.*PI, m+1); | 
| 143 | + | brightout(Ninv, 1, m, 1./il->nsamps/brt(il->col), dfp); | 
| 144 |  | brightout(da, n, m, 1./il->nsamps/brt(il->col), dfp); | 
| 145 | + | fputeol(dfp); | 
| 146 |  | fclose(dfp); | 
| 147 |  | printf(" %s", dfname(il, 0)); | 
| 148 |  | } | 
| 152 |  | printf("\t%f\t%f\t%f\n", v[0], v[1], v[2]); | 
| 153 |  | printf("\t%f\t%f\t%f\n", w[0], w[1], w[2]); | 
| 154 |  | il->dfnum++; | 
| 155 | + | free(Ninv); | 
| 156 |  | } | 
| 157 |  |  | 
| 158 |  |  | 
| 159 | < | roundout(il, da, n, m)                  /* write spherical distribution */ | 
| 160 | < | struct illum_args  *il; | 
| 161 | < | float  *da; | 
| 162 | < | int  n, m; | 
| 159 | > | extern void | 
| 160 | > | roundout(                       /* write spherical distribution */ | 
| 161 | > | struct illum_args  *il, | 
| 162 | > | COLORV  *da, | 
| 163 | > | int  n, | 
| 164 | > | int  m | 
| 165 | > | ) | 
| 166 |  | { | 
| 167 | + | COLORV  *Ninv, *Sinv; | 
| 168 |  | FILE  *dfp; | 
| 169 |  | int  i; | 
| 170 |  |  | 
| 171 | + | if ((Ninv = (COLORV *)malloc(3*m*sizeof(COLORV))) == NULL || | 
| 172 | + | (Sinv = (COLORV *)malloc(3*m*sizeof(COLORV))) == NULL) | 
| 173 | + | error(SYSTEM, "out of memory in roundout"); | 
| 174 | + | compinv(Ninv, da, m); | 
| 175 | + | compinv(Sinv, da+3*m*(n-1), m); | 
| 176 |  | if (il->flags & IL_COLDST) { | 
| 177 |  | printf("\n%s %s %s%s", VOIDID, ofun[PAT_CDATA].funame, | 
| 178 |  | il->matname, DSTSUF); | 
| 180 |  | for (i = 0; i < 3; i++) { | 
| 181 |  | dfp = dfopen(il, DATORD[i]); | 
| 182 |  | fprintf(dfp, "2\n%f %f %d\n%f %f %d\n", | 
| 183 | < | 1.-1./n, -1.+1./n, n, | 
| 183 | > | 1.+1./n, -1.-1./n, n+2, | 
| 184 |  | 0., 2.*PI, m+1); | 
| 185 | + | colorout(i, Ninv, 1, m, 1./il->nsamps/il->col[i], dfp); | 
| 186 |  | colorout(i, da, n, m, 1./il->nsamps/il->col[i], dfp); | 
| 187 | + | colorout(i, Sinv, 1, m, 1./il->nsamps/il->col[i], dfp); | 
| 188 | + | fputeol(dfp); | 
| 189 |  | fclose(dfp); | 
| 190 |  | printf(" %s", dfname(il, DATORD[i])); | 
| 191 |  | } | 
| 192 |  | } else { | 
| 193 |  | printf("\n%s %s %s%s", VOIDID, ofun[PAT_BDATA].funame, | 
| 194 |  | il->matname, DSTSUF); | 
| 195 | < | printf("\n5 noop"); | 
| 195 | > | printf("\n5 noneg"); | 
| 196 |  | dfp = dfopen(il, 0); | 
| 197 | < | fprintf(dfp, "2\n%f %f %d\n%f %f %d\n", 1.-1./n, -1.+1./n, n, | 
| 197 | > | fprintf(dfp, "2\n%f %f %d\n%f %f %d\n", | 
| 198 | > | 1.+1./n, -1.-1./n, n+2, | 
| 199 |  | 0., 2.*PI, m+1); | 
| 200 | + | brightout(Ninv, 1, m, 1./il->nsamps/brt(il->col), dfp); | 
| 201 |  | brightout(da, n, m, 1./il->nsamps/brt(il->col), dfp); | 
| 202 | + | brightout(Sinv, 1, m, 1./il->nsamps/brt(il->col), dfp); | 
| 203 | + | fputeol(dfp); | 
| 204 |  | fclose(dfp); | 
| 205 |  | printf(" %s", dfname(il, 0)); | 
| 206 |  | } | 
| 207 |  | printf("\n\t%s il_alt il_azi", FNCFNM); | 
| 208 |  | printf("\n0\n0\n"); | 
| 209 |  | il->dfnum++; | 
| 210 | + | free(Ninv); | 
| 211 | + | free(Sinv); | 
| 212 |  | } | 
| 213 |  |  | 
| 214 |  |  | 
| 215 | < | illumout(il, ob)                /* print illum object */ | 
| 216 | < | register struct illum_args  *il; | 
| 217 | < | OBJREC  *ob; | 
| 215 | > | extern void | 
| 216 | > | illumout(               /* print illum object */ | 
| 217 | > | register struct illum_args  *il, | 
| 218 | > | OBJREC  *ob | 
| 219 | > | ) | 
| 220 |  | { | 
| 221 |  | double  cout[3]; | 
| 222 |  |  | 
| 243 |  | } | 
| 244 |  |  | 
| 245 |  |  | 
| 246 | < | average(il, da, n)              /* compute average value for distribution */ | 
| 247 | < | register struct illum_args  *il; | 
| 248 | < | register float  *da; | 
| 249 | < | int  n; | 
| 246 | > | void | 
| 247 | > | compavg(                /* compute average for set of data values */ | 
| 248 | > | COLOR  col, | 
| 249 | > | register COLORV  *da, | 
| 250 | > | int  n | 
| 251 | > | ) | 
| 252 |  | { | 
| 253 |  | register int  i; | 
| 254 |  |  | 
| 255 | < | il->col[0] = il->col[1] = il->col[2] = 0.; | 
| 255 | > | setcolor(col, 0.0, 0.0, 0.0); | 
| 256 |  | i = n; | 
| 257 |  | while (i-- > 0) { | 
| 258 | < | il->col[0] += *da++; | 
| 259 | < | il->col[1] += *da++; | 
| 211 | < | il->col[2] += *da++; | 
| 258 | > | addcolor(col, da); | 
| 259 | > | da += 3; | 
| 260 |  | } | 
| 261 | < | for (i = 0; i < 3; i++) | 
| 262 | < | il->col[i] /= (double)n*il->nsamps; | 
| 261 | > | scalecolor(col, 1./(double)n); | 
| 262 | > | } | 
| 263 |  |  | 
| 264 | + |  | 
| 265 | + | void | 
| 266 | + | compinv(                /* compute other side of row average */ | 
| 267 | + | register COLORV  *rinv, | 
| 268 | + | register COLORV  *rp, | 
| 269 | + | int  m | 
| 270 | + | ) | 
| 271 | + | { | 
| 272 | + | COLOR  avg; | 
| 273 | + |  | 
| 274 | + | compavg(avg, rp, m);            /* row average */ | 
| 275 | + | while (m-- > 0) { | 
| 276 | + | *rinv++ = 2.*avg[0] - *rp++; | 
| 277 | + | *rinv++ = 2.*avg[1] - *rp++; | 
| 278 | + | *rinv++ = 2.*avg[2] - *rp++; | 
| 279 | + | } | 
| 280 | + | } | 
| 281 | + |  | 
| 282 | + |  | 
| 283 | + | extern int | 
| 284 | + | average(                /* evaluate average value for distribution */ | 
| 285 | + | register struct illum_args  *il, | 
| 286 | + | COLORV  *da, | 
| 287 | + | int  n | 
| 288 | + | ) | 
| 289 | + | { | 
| 290 | + | compavg(il->col, da, n);        /* average */ | 
| 291 | + | if (il->nsamps > 1) { | 
| 292 | + | il->col[0] /= (double)il->nsamps; | 
| 293 | + | il->col[1] /= (double)il->nsamps; | 
| 294 | + | il->col[2] /= (double)il->nsamps; | 
| 295 | + | } | 
| 296 | + | /* brighter than minimum? */ | 
| 297 |  | return(brt(il->col) > il->minbrt+FTINY); | 
| 298 |  | } | 
| 299 |  |  | 
| 300 |  |  | 
| 301 |  | static int      colmcnt = 0;    /* count of columns written */ | 
| 302 |  |  | 
| 303 | < | fputnum(d, fp)                  /* put out a number to fp */ | 
| 304 | < | double  d; | 
| 305 | < | FILE  *fp; | 
| 303 | > | void | 
| 304 | > | fputnum(                        /* put out a number to fp */ | 
| 305 | > | double  d, | 
| 306 | > | FILE  *fp | 
| 307 | > | ) | 
| 308 |  | { | 
| 309 | < | if (colmcnt++ % 6 == 0) | 
| 309 | > | if (colmcnt++ % 5 == 0) | 
| 310 |  | putc('\n', fp); | 
| 311 |  | fprintf(fp, " %11e", d); | 
| 312 |  | } | 
| 313 |  |  | 
| 314 |  |  | 
| 315 | < | fputeol(fp)                     /* write end of line to fp */ | 
| 316 | < | register FILE  *fp; | 
| 315 | > | void | 
| 316 | > | fputeol(                        /* write end of line to fp */ | 
| 317 | > | register FILE  *fp | 
| 318 | > | ) | 
| 319 |  | { | 
| 320 |  | putc('\n', fp); | 
| 321 |  | colmcnt = 0; | 
| 322 |  | } | 
| 323 |  |  | 
| 324 |  |  | 
| 325 | < | colorout(p, da, n, m, mult, fp) /* put out color distribution data */ | 
| 326 | < | int  p; | 
| 327 | < | register float  *da; | 
| 328 | < | int  n, m; | 
| 329 | < | double  mult; | 
| 330 | < | FILE  *fp; | 
| 325 | > | void | 
| 326 | > | colorout(       /* put out color distribution data */ | 
| 327 | > | int  p, | 
| 328 | > | register COLORV  *da, | 
| 329 | > | int  n, | 
| 330 | > | int  m, | 
| 331 | > | double  mult, | 
| 332 | > | FILE  *fp | 
| 333 | > | ) | 
| 334 |  | { | 
| 335 |  | register int  i, j; | 
| 336 |  |  | 
| 341 |  | } | 
| 342 |  | fputnum(mult*da[p-3*m], fp);    /* wrap phi */ | 
| 343 |  | } | 
| 256 | – | fputeol(fp); | 
| 344 |  | } | 
| 345 |  |  | 
| 346 |  |  | 
| 347 | < | brightout(da, n, m, mult, fp)   /* put out brightness distribution data */ | 
| 348 | < | register float  *da; | 
| 349 | < | int  n, m; | 
| 350 | < | double  mult; | 
| 351 | < | FILE  *fp; | 
| 347 | > | void | 
| 348 | > | brightout(      /* put out brightness distribution data */ | 
| 349 | > | register COLORV  *da, | 
| 350 | > | int  n, | 
| 351 | > | int  m, | 
| 352 | > | double  mult, | 
| 353 | > | FILE  *fp | 
| 354 | > | ) | 
| 355 |  | { | 
| 356 |  | register int  i, j; | 
| 357 |  |  | 
| 362 |  | } | 
| 363 |  | fputnum(mult*brt(da-3*m), fp);  /* wrap phi */ | 
| 364 |  | } | 
| 275 | – | fputeol(fp); | 
| 365 |  | } |