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.3 by greg, Thu Jul 25 12:52:21 1991 UTC vs.
Revision 2.13 by greg, Mon Aug 15 19:48:06 2011 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] + .636*(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 <        average(il, da, n*m);
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);
123                  printf("\n9 red green blue");
124                  for (i = 0; i < 3; i++) {
125                          dfp = dfopen(il, DATORD[i]);
126 <                        fprintf(dfp, "2\n1 0 %d\n0 %f %d\n", n, 2.*PI, m);
127 <                        colorout(i, da, n*m, 1./il->nsamps/il->col[i], dfp);
126 >                        fprintf(dfp, "2\n%f %f %d\n%f %f %d\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\n1 0 %d\n0 %f %d\n", n, 2.*PI, m);
141 <                brightout(da, n*m, 1./il->nsamps/brt(il->col), dfp);
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 124 | 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(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 <        average(il, da, n*m);
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);
179                  printf("\n9 red green blue");
180                  for (i = 0; i < 3; i++) {
181                          dfp = dfopen(il, DATORD[i]);
182 <                        fprintf(dfp, "2\n1 -1 %d\n0 %f %d\n", n, 2.*PI, m);
183 <                        colorout(i, da, n*m, 1./il->nsamps/il->col[i], dfp);
182 >                        fprintf(dfp, "2\n%f %f %d\n%f %f %d\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\n1 -1 %d\n0 %f %d\n", n, 2.*PI, m);
198 <                brightout(da, n*m, 1./il->nsamps/brt(il->col), dfp);
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  
223 <        printf("\n%s%s %s %s", il->matname, DSTSUF,
224 <                        ofun[il->flags&IL_LIGHT?MAT_LIGHT:MAT_ILLUM].funame,
223 >        if (il->sampdens <= 0)
224 >                printf("\n%s ", VOIDID);
225 >        else
226 >                printf("\n%s%s ", il->matname, DSTSUF);
227 >        printf("%s %s", ofun[il->flags&IL_LIGHT?MAT_LIGHT:MAT_ILLUM].funame,
228                          il->matname);
229          if (il->flags & IL_LIGHT || !strcmp(il->altmat,VOIDID))
230                  printf("\n0");
# Line 189 | 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++;
204 <                il->col[2] += *da++;
258 >                addcolor(col, da);
259 >                da += 3;
260          }
261 <        for (i = 0; i < 3; i++)
207 <                il->col[i] /= (double)n*il->nsamps;
261 >        scalecolor(col, 1./(double)n);
262   }
263  
264  
265 < colorout(p, da, n, mult, fp)    /* put out color distribution data */
266 < int  p;
267 < register float  *da;
268 < int  n;
269 < double  mult;
270 < FILE  *fp;
265 > void
266 > compinv(                /* compute other side of row average */
267 >        register COLORV  *rinv,
268 >        register COLORV  *rp,
269 >        int  m
270 > )
271   {
272 <        register int  i;
272 >        COLOR  avg;
273  
274 <        for (i = 0; i < n; i++) {
275 <                if (i%6 == 0)
276 <                        putc('\n', fp);
277 <                fprintf(fp, " %11e", mult*da[p]);
278 <                da += 3;
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 + void
304 + fputnum(                        /* put out a number to fp */
305 +        double  d,
306 +        FILE  *fp
307 + )
308 + {
309 +        if (colmcnt++ % 5 == 0)
310 +                putc('\n', fp);
311 +        fprintf(fp, " %11e", d);
312 + }
313 +
314 +
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 < brightout(da, n, mult, fp)      /* put out brightness distribution data */
326 < register float  *da;
327 < int  n;
328 < double  mult;
329 < 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;
335 >        register int  i, j;
336  
337          for (i = 0; i < n; i++) {
338 <                if (i%6 == 0)
339 <                        putc('\n', fp);
340 <                fprintf(fp, " %11e", mult*brt(da));
341 <                da += 3;
338 >                for (j = 0; j < m; j++) {
339 >                        fputnum(mult*da[p], fp);
340 >                        da += 3;
341 >                }
342 >                fputnum(mult*da[p-3*m], fp);    /* wrap phi */
343          }
344 <        putc('\n', fp);
344 > }
345 >
346 >
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 >
358 >        for (i = 0; i < n; i++) {
359 >                for (j = 0; j < m; j++) {
360 >                        fputnum(mult*brt(da), fp);
361 >                        da += 3;
362 >                }
363 >                fputnum(mult*brt(da-3*m), fp);  /* wrap phi */
364 >        }
365   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines