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

Comparing ray/src/util/glareval.c (file contents):
Revision 1.12 by greg, Fri Apr 12 10:28:34 1991 UTC vs.
Revision 2.1 by greg, Tue Nov 12 17:19:21 1991 UTC

# Line 9 | Line 9 | static char SCCSid[] = "$SunId$ LBL";
9   */
10  
11   #include "glare.h"
12 < #include <sys/param.h>
13 <                                        /* compute rtrace buffer size */
14 < #ifndef PIPE_BUF
15 < #define PIPE_BUF        512             /* hyperconservative */
16 < #endif
17 < #define MAXPIX          (PIPE_BUF/(6*sizeof(float)) - 1)
12 > #include "resolu.h"
13 >                                        /* maximum rtrace buffer size */
14 > #define MAXPIX          (4096/(6*sizeof(float)))
15  
16 < #ifndef BSD
20 < #define vfork           fork
21 < #endif
22 <
23 < #define MAXSBUF         524268  /* maximum total size of scanline buffer */
16 > #define MAXSBUF         786432  /* maximum total size of scanline buffer */
17   #define HSIZE           317     /* size of scanline hash table */
18   #define NRETIRE         16      /* number of scanlines to retire at once */
19  
20 < int     rt_pid = -1;            /* process id for rtrace */
28 < int     fd_tort, fd_fromrt;     /* pipe descriptors */
20 > int     rt_pd[3] = {-1,-1,-1};  /* process id & descriptors for rtrace */
21  
22   FILE    *pictfp = NULL;         /* picture file pointer */
23   double  exposure;               /* picture exposure */
# Line 44 | Line 36 | typedef struct scan {
36   #define scandata(sl)    ((COLR *)((sl)+1))
37   #define shash(y)        ((y)%HSIZE)
38  
39 + static int      maxpix;         /* maximum number of pixels to buffer */
40 +
41   static SCAN     *freelist;              /* scanline free list */
42   static SCAN     *hashtab[HSIZE];        /* scanline hash table */
43  
44   static long     ncall = 0L;     /* number of calls to getpictscan */
45   static long     nread = 0L;     /* number of scanlines read */
46 + static long     nrecl = 0L;     /* number of scanlines reclaimed */
47  
48 + static int      wrongformat = 0;
49 +
50   SCAN    *scanretire();
51  
52   extern long     ftell();
# Line 75 | Line 72 | int    y;
72                          if (sl->y == y) {               /* reclaim */
73                                  sl->next = hashtab[hi];
74                                  hashtab[hi] = sl;
75 < #ifdef DEBUG
79 <                                if (verbose)
80 <                                        fprintf(stderr,
81 <                                                "%s: scanline %d reclaimed\n",
82 <                                                        progname, y);
83 < #endif
75 >                                nrecl++;
76                          }
77                          return(sl);
78                  }
# Line 144 | Line 136 | pict_stats()                   /* print out picture read statistics */
136   {
137          static long     lastcall = 0L;  /* ncall at last report */
138          static long     lastread = 0L;  /* nread at last report */
139 +        static long     lastrecl = 0L;  /* nrecl at last report */
140  
141          if (ncall == lastcall)
142                  return;
143 <        fprintf(stderr, "%s: %ld scanlines read in %ld calls\n",
144 <                        progname, nread-lastread, ncall-lastcall);
143 >        fprintf(stderr, "%s: %ld scanlines read (%ld reclaimed) in %ld calls\n",
144 >                progname, nread-lastread, nrecl-lastrecl, ncall-lastcall);
145          lastcall = ncall;
146          lastread = nread;
147 +        lastrecl = nrecl;
148   }
149   #endif
150  
# Line 160 | Line 154 | pict_val(vd)                   /* find picture value for view directio
154   FVECT   vd;
155   {
156          FVECT   pp;
157 <        double  vpx, vpy, vpz;
157 >        FVECT   ip;
158          COLOR   res;
159  
160          if (pictfp == NULL)
# Line 168 | Line 162 | FVECT  vd;
162          pp[0] = pictview.vp[0] + vd[0];
163          pp[1] = pictview.vp[1] + vd[1];
164          pp[2] = pictview.vp[2] + vd[2];
165 <        viewpixel(&vpx, &vpy, &vpz, &pictview, pp);
166 <        if (vpz <= FTINY || vpx < 0. || vpx >= 1. || vpy < 0. || vpy >= 1.)
165 >        viewloc(ip, &pictview, pp);
166 >        if (ip[2] <= FTINY || ip[0] < 0. || ip[0] >= 1. ||
167 >                        ip[1] < 0. || ip[1] >= 1.)
168                  return(-1.0);
169 <        colr_color(res, getpictscan((int)(vpy*pysiz))[(int)(vpx*pxsiz)]);
169 >        colr_color(res, getpictscan((int)(ip[1]*pysiz))[(int)(ip[0]*pxsiz)]);
170          return(luminance(res)/exposure);
171   }
172  
173  
174   double
175 < getviewpix(vh, vv, se)          /* compute single view pixel */
175 > getviewpix(vh, vv)              /* compute single view pixel */
176   int     vh, vv;
182 SPANERR *se;
177   {
178          FVECT   dir;
179 <        float   rt_buf[6];
179 >        float   rt_buf[12];
180          double  res;
181  
182 <        if (compdir(dir, vh, vv, se) < 0)
182 >        if (compdir(dir, vh, vv) < 0)
183                  return(-1.0);
184          npixinvw++;
185          if ((res = pict_val(dir)) >= 0.0)
186                  return(res);
187 <        if (rt_pid == -1) {
187 >        if (rt_pd[0] == -1) {
188                  npixmiss++;
189                  return(-1.0);
190          }
# Line 212 | Line 206 | float  *vb;
206          float   rt_buf[6*MAXPIX];       /* rtrace send/receive buffer */
207          register int    n;              /* number of pixels in buffer */
208          short   buf_vh[MAXPIX];         /* pixel positions */
215        SPANERR sperr;
209          FVECT   dir;
210          register int    vh;
211  
# Line 221 | Line 214 | float  *vb;
214                  fprintf(stderr, "%s: computing view span at %d...\n",
215                                  progname, vv);
216   #endif
224        setspanerr(&sperr, vv);
217          n = 0;
218          for (vh = -hsize; vh <= hsize; vh++) {
219 <                if (compdir(dir, vh, vv, &sperr) < 0) { /* not in view */
219 >                if (compdir(dir, vh, vv) < 0) {         /* not in view */
220                          vb[vh+hsize] = -1.0;
221                          continue;
222                  }
223                  npixinvw++;
224                  if ((vb[vh+hsize] = pict_val(dir)) >= 0.0)
225                          continue;
226 <                if (rt_pid == -1) {             /* missing information */
226 >                if (rt_pd[0] == -1) {           /* missing information */
227                          npixmiss++;
228                          continue;
229                  }
230                                                  /* send to rtrace */
231 <                if (n >= MAXPIX) {                      /* flush */
231 >                if (n >= maxpix) {                      /* flush */
232                          rt_compute(rt_buf, n);
233                          while (n-- > 0)
234                                  vb[buf_vh[n]+hsize] = luminance(rt_buf+3*n);
# Line 265 | Line 257 | rt_compute(pb, np)             /* process buffer through rtrace *
257   float   *pb;
258   int     np;
259   {
268        static float    nbuf[6] = {0.,0.,0.,0.,0.,0.};
269
260   #ifdef DEBUG
261          if (verbose && np > 1)
262                  fprintf(stderr, "%s: sending %d samples to rtrace...\n",
263                                  progname, np);
264   #endif
265 <        if (writebuf(fd_tort,(char *)pb,6*sizeof(float)*np) < 6*sizeof(float)*np
266 <                || writebuf(fd_tort,(char *)nbuf,sizeof(nbuf)) < sizeof(nbuf)) {
267 <                fprintf(stderr, "%s: error writing to rtrace process\n",
265 >        bzero(pb+6*np, 6*sizeof(float));
266 >        if (process(rt_pd, pb, pb, 3*sizeof(float)*np,
267 >                        6*sizeof(float)*(np+1)) < 3*sizeof(float)*np) {
268 >                fprintf(stderr, "%s: rtrace communication error\n",
269                                  progname);
270                  exit(1);
271          }
281        if (readbuf(fd_fromrt, (char *)pb, 3*sizeof(float)*np)
282                        < 3*sizeof(float)*np) {
283                fprintf(stderr, "%s: error reading from rtrace process\n",
284                                progname);
285                exit(1);
286        }
272   }
273  
274  
275   getexpos(s)                     /* get exposure from header line */
276   char    *s;
277   {
278 +        char    fmt[32];
279 +
280          if (isexpos(s))
281                  exposure *= exposval(s);
282 +        else if (isformat(s)) {
283 +                formatval(fmt, s);
284 +                wrongformat = strcmp(fmt, COLRFMT);
285 +        }
286   }
287  
288  
# Line 303 | Line 294 | char   *fn;
294                  exit(1);
295          }
296          exposure = 1.0;
297 <        getheader(pictfp, getexpos);
298 <        if (fgetresolu(&pxsiz, &pysiz, pictfp) != (YMAJOR|YDECR)) {
299 <                fprintf("%s: bad picture resolution\n", fn);
297 >        getheader(pictfp, getexpos, NULL);
298 >        if (wrongformat || !fscnresolu(&pxsiz, &pysiz, pictfp)) {
299 >                fprintf(stderr, "%s: incompatible picture format\n", fn);
300                  exit(1);
301          }
302          initscans();
# Line 325 | Line 316 | close_pict()                   /* done with picture */
316   fork_rtrace(av)                 /* open pipe and start rtrace */
317   char    *av[];
318   {
319 <        int     p0[2], p1[2];
319 >        int     rval;
320  
321 <        if (pipe(p0) < 0 || pipe(p1) < 0) {
321 >        rval = open_process(rt_pd, av);
322 >        if (rval < 0) {
323                  perror(progname);
324                  exit(1);
325          }
326 <        if ((rt_pid = vfork()) == 0) {          /* if child */
327 <                close(p0[1]);
336 <                close(p1[0]);
337 <                if (p0[0] != 0) {       /* connect p0 to stdin */
338 <                        dup2(p0[0], 0);
339 <                        close(p0[0]);
340 <                }
341 <                if (p1[1] != 0) {       /* connect p1 to stdout */
342 <                        dup2(p1[1], 1);
343 <                        close(p1[1]);
344 <                }
345 <                execvp(av[0], av);
346 <                perror(av[0]);
347 <                _exit(127);
348 <        }
349 <        if (rt_pid == -1) {
350 <                perror(progname);
326 >        if (rval == 0) {
327 >                fprintf(stderr, "%s: command not found\n", av[0]);
328                  exit(1);
329          }
330 <        close(p0[0]);
331 <        close(p1[1]);
332 <        fd_tort = p0[1];
333 <        fd_fromrt = p1[0];
330 >        maxpix = rval/(6*sizeof(float));
331 >        if (maxpix > MAXPIX)
332 >                maxpix = MAXPIX;
333 >        maxpix--;
334   }
335  
336  
337   done_rtrace()                   /* wait for rtrace to finish */
338   {
339 <        int     pid, status;
339 >        int     status;
340  
341 <        if (rt_pid == -1)
342 <                return;
366 <        close(fd_tort);
367 <        close(fd_fromrt);
368 <        while ((pid = wait(&status)) != -1 && pid != rt_pid)
369 <                ;
370 <        if (pid == rt_pid && status != 0) {
341 >        status = close_process(rt_pd);
342 >        if (status > 0) {
343                  fprintf(stderr, "%s: bad status (%d) from rtrace\n",
344                                  progname, status);
345                  exit(1);
346          }
347 <        rt_pid = -1;
347 >        rt_pd[0] = -1;
348   }
349  
350  
379 int
380 readbuf(fd, bpos, siz)
381 int     fd;
382 char    *bpos;
383 int     siz;
384 {
385        register int    cc, nrem = siz;
386
387        while (nrem > 0 && (cc = read(fd, bpos, nrem)) > 0) {
388                bpos += cc;
389                nrem -= cc;
390        }
391        if (cc < 0)
392                return(cc);
393        return(siz-nrem);
394 }
395
396
397 int
398 writebuf(fd, bpos, siz)
399 char    *bpos;
400 int     siz;
401 {
402        register int    cc, nrem = siz;
403
404        while (nrem > 0 && (cc = write(fd, bpos, nrem)) > 0) {
405                bpos += cc;
406                nrem -= cc;
407        }
408        if (cc < 0)
409                return(cc);
410        return(siz-nrem);
411 }
412
413
351   SCAN *
352   scanretire()                    /* retire old scanlines to free list */
353   {
# Line 473 | Line 410 | initscans()                            /* initialize scanline buffers */
410                                          /* allocate scanline buffers */
411          scansize = sizeof(SCAN) + pxsiz*sizeof(COLR);
412   #ifdef ALIGN
413 <        scansize = scansize+(sizeof(ALIGN)-1)) & ~(sizeof(ALIGN)-1);
413 >        scansize = scansize+(sizeof(ALIGN)-1) & ~(sizeof(ALIGN)-1);
414   #endif
415          i = MAXSBUF / scansize;         /* compute number to allocate */
416          if (i > HSIZE)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines