ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/mkillum3.c
(Generate patch)

Comparing ray/src/gen/mkillum3.c (file contents):
Revision 1.6 by greg, Mon Aug 26 10:16:59 1991 UTC vs.
Revision 2.12 by greg, Thu Sep 13 17:52:35 2007 UTC

# Line 1 | Line 1
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++)
# Line 46 | Line 57 | register OBJREC  *obj;
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  
# Line 67 | Line 78 | int  c;
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;
# Line 87 | Line 99 | int  c;
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);
# Line 103 | Line 124 | FVECT  u, v, w;
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          }
# Line 126 | Line 152 | FVECT  u, v, w;
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((void *)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);
# Line 144 | Line 180 | int  n, m;
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((void *)Ninv);
211 +        free((void *)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  
# Line 196 | Line 243 | OBJREC  *ob;
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  
# Line 253 | Line 341 | FILE  *fp;
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  
# Line 272 | Line 362 | FILE  *fp;
362                  }
363                  fputnum(mult*brt(da-3*m), fp);  /* wrap phi */
364          }
275        fputeol(fp);
365   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines