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

Comparing ray/src/rt/rv2.c (file contents):
Revision 2.14 by greg, Fri Dec 11 17:56:22 1992 UTC vs.
Revision 2.18 by greg, Wed Aug 25 14:13:51 1993 UTC

# Line 1 | Line 1
1 < /* Copyright (c) 1992 Regents of the University of California */
1 > /* Copyright (c) 1993 Regents of the University of California */
2  
3   #ifndef lint
4   static char SCCSid[] = "$SunId$ LBL";
# Line 30 | Line 30 | static char SCCSid[] = "$SunId$ LBL";
30   #define  sscanvec(s,v)  (sscanf(s,"%lf %lf %lf",v,v+1,v+2)==3)
31   #endif
32  
33 + extern char  *atos();
34  
35 + extern char  rifname[];                 /* rad input file name */
36 +
37   extern char  VersionID[];
38   extern char  *progname;
39   extern char  *octname;
# Line 85 | Line 88 | char  *s;
88                  fputs(progname, fp);
89                  fprintview(&ourview, fp);
90                  fputs(sskip(s), fp);
91 <                fputs("\n", fp);
91 >                putc('\n', fp);
92                  fclose(fp);
93                  return;
94          }
# Line 183 | Line 186 | char  *s;
186   }
187  
188  
189 + saveview(s)                             /* save view to rad file */
190 + char  *s;
191 + {
192 +        char  view[64];
193 +        char  *fname;
194 +        FILE  *fp;
195 +
196 +        if (*atos(view, sizeof(view), s))
197 +                s = sskip(s);
198 +        if (sscanf(s, "%s", rifname) != 1 && rifname[0] == '\0') {
199 +                error(COMMAND, "no previous rad file");
200 +                return;
201 +        }
202 +        if ((fname = getpath(rifname, NULL, 0)) == NULL ||
203 +                        (fp = fopen(fname, "a")) == NULL) {
204 +                sprintf(errmsg, "cannot open \"%s\"", rifname);
205 +                error(COMMAND, errmsg);
206 +                return;
207 +        }
208 +        fputs("view= ", fp);
209 +        fputs(view, fp);
210 +        fprintview(&ourview, fp);
211 +        putc('\n', fp);
212 +        fclose(fp);
213 + }
214 +
215 +
216 + loadview(s)                             /* load view from rad file */
217 + char  *s;
218 + {
219 +        char  buf[512];
220 +        char  *fname;
221 +        FILE  *fp;
222 +        VIEW  nv;
223 +
224 +        strcpy(buf, "rad -n -s -V -v ");
225 +        if (sscanf(s, "%s", buf+strlen(buf)) == 1)
226 +                s = sskip(s);
227 +        else
228 +                strcat(buf, "1");
229 +        if (sscanf(s, "%s", rifname) != 1 && rifname[0] == '\0') {
230 +                error(COMMAND, "no previous rad file");
231 +                return;
232 +        }
233 +        fname = getpath(rifname, NULL, 0);
234 +        if (fname == NULL || access(fname, R_OK) == -1) {
235 +                sprintf(errmsg, "cannot access \"%s\"", rifname);
236 +                error(COMMAND, errmsg);
237 +                return;
238 +        }
239 +        sprintf(buf+strlen(buf), " %s", fname);
240 +        if ((fp = popen(buf, "r")) == NULL) {
241 +                error(COMMAND, "cannot run rad");
242 +                return;
243 +        }
244 +        buf[0] = '\0';
245 +        fgets(buf, sizeof(buf), fp);
246 +        pclose(fp);
247 +        copystruct(&nv, &stdview);
248 +        if (!sscanview(&nv, buf)) {
249 +                error(COMMAND, "rad error -- no such view?");
250 +                return;
251 +        }
252 +        newview(&nv);
253 + }
254 +
255 +
256   getaim(s)                               /* aim camera */
257   char  *s;
258   {
# Line 263 | Line 333 | char  *s;
333   {
334          char  buf[128];
335          register char  *cp;
266        register PNODE  *p;
336          RECT  r;
337          int  x, y;
338 <        double  e;
339 <
338 >        register PNODE  *p = &ptrunk;
339 >        int  adapt = 0;
340 >        double  e = 1.0;
341 > start:
342          for (cp = s; isspace(*cp); cp++)
343                  ;
344 +        if (*cp == '@') {
345 +                adapt++;
346 +                goto start;
347 +        }
348          if (*cp == '\0') {              /* normalize to point */
349                  if (dev->getcur == NULL)
350                          return;
# Line 279 | Line 354 | char  *s;
354                  r.l = r.d = 0;
355                  r.r = hresolu; r.u = vresolu;
356                  p = findrect(x, y, &ptrunk, &r, -1);
282                e = 1.0;
357          } else {
358                  if (*cp == '=') {       /* absolute setting */
359                          p = NULL;
# Line 287 | Line 361 | char  *s;
361                          for (cp++; isspace(*cp); cp++)
362                                  ;
363                          if (*cp == '\0') {      /* interactive */
364 <                                sprintf(buf, "exposure (%lf): ", exposure);
364 >                                sprintf(buf, "exposure (%f): ", exposure);
365                                  (*dev->comout)(buf);
366                                  (*dev->comin)(buf, NULL);
367                                  for (cp = buf; isspace(*cp); cp++)
# Line 295 | Line 369 | char  *s;
369                                  if (*cp == '\0')
370                                          return;
371                          }
298                } else {                /* normalize to average */
299                        p = &ptrunk;
300                        e = 1.0;
372                  }
373                  if (*cp == '+' || *cp == '-')   /* f-stops */
374                          e *= pow(2.0, atof(cp));
# Line 309 | Line 380 | char  *s;
380                          error(COMMAND, "cannot normalize to zero");
381                          return;
382                  }
383 <                e *= 0.5 / bright(p->v);
383 >                if (adapt)
384 >                        e *= 106./pow(1.219+pow(luminance(p->v)/exposure,.4),2.5)/exposure;
385 >                else
386 >                        e *= 0.5 / bright(p->v);
387          }
388          if (e <= FTINY || fabs(1.0 - e) <= FTINY)
389                  return;
# Line 458 | Line 532 | register char  *s;
532                          getparam(s+2, "ambient value", 'C', (COLOR *)ambval);
533                          break;
534                  case 'a':                       /* accuracy */
535 <                        getparam(s+2, "ambient accuracy", 'r', &ambacc);
535 >                        if (getparam(s+2, "ambient accuracy", 'r', &ambacc))
536 >                                setambacc(ambacc);
537                          break;
538                  case 'd':                       /* divisions */
539                          getparam(s+2, "ambient divisions", 'i', &ambdiv);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines