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

Comparing ray/src/rt/ambient.c (file contents):
Revision 2.8 by greg, Thu Jul 16 14:03:27 1992 UTC vs.
Revision 2.9 by greg, Thu Jul 16 15:53:42 1992 UTC

# Line 42 | Line 42 | static AMBTREE  atrunk;                /* our ambient trunk node */
42  
43   static FILE  *ambfp = NULL;     /* ambient file pointer */
44   static char  *afname;           /* ambient file name */
45 static long  ambheadlen;        /* length of ambient file header */
45  
46   #define  AMBFLUSH       (BUFSIZ/AMBVALSIZ)
47  
# Line 74 | Line 73 | int  ar;
73   setambient(afile)                       /* initialize calculation */
74   char  *afile;
75   {
76 +        long  headlen;
77          AMBVAL  amb;
78                                                  /* init ambient limits */
79          setambres(ambres);
# Line 81 | Line 81 | char  *afile;
81          if ((afname = afile) != NULL)
82                  if ((ambfp = fopen(afile, "r+")) != NULL) {
83                          initambfile(0);
84 +                        headlen = ftell(ambfp);
85                          while (readambval(&amb, ambfp))
86                                  avinsert(&amb, &atrunk, thescene.cuorg,
87                                                  thescene.cusize);
88                                                          /* align */
89 <                        fseek(ambfp, -((ftell(ambfp)-ambheadlen)%AMBVALSIZ), 1);
89 >                        fseek(ambfp, -((ftell(ambfp)-headlen)%AMBVALSIZ), 1);
90                  } else if ((ambfp = fopen(afile, "w")) != NULL)
91                          initambfile(1);
92                  else {
# Line 96 | Line 97 | char  *afile;
97   }
98  
99  
99 initambfile(creat)              /* initialize ambient file */
100 int  creat;
101 {
102        extern char  *progname, *octname, VersionID[];
103
104        setbuf(ambfp, bmalloc(BUFSIZ));
105        if (creat) {                    /* new file */
106                fprintf(ambfp, "%s -av %g %g %g -ab %d -aa %g ",
107                                progname, colval(ambval,RED),
108                                colval(ambval,GRN), colval(ambval,BLU),
109                                ambounce, ambacc);
110                fprintf(ambfp, "-ad %d -as %d -ar %d %s\n",
111                                ambdiv, ambssamp, ambres,
112                                octname==NULL ? "" : octname);
113                fprintf(ambfp, "SOFTWARE= %s\n", VersionID);
114                fputformat(AMBFMT, ambfp);
115                putc('\n', ambfp);
116                putambmagic(ambfp);
117                fflush(ambfp);
118        } else if (checkheader(ambfp, AMBFMT, NULL) < 0
119                        || !hasambmagic(ambfp)) {
120                sprintf(errmsg, "\"%s\" is not an ambient file", afname);
121                error(USER, errmsg);
122        }
123        ambheadlen = ftell(ambfp);
124 }
125
126
100   ambnotify(obj)                  /* record new modifier */
101   OBJECT  obj;
102   {
# Line 332 | Line 305 | FVECT  pv, nv;
305  
306  
307   static
308 + initambfile(creat)              /* initialize ambient file */
309 + int  creat;
310 + {
311 +        extern char  *progname, *octname, VersionID[];
312 +
313 +        setbuf(ambfp, bmalloc(BUFSIZ));
314 +        if (creat) {                    /* new file */
315 +                fprintf(ambfp, "%s -av %g %g %g -ab %d -aa %g ",
316 +                                progname, colval(ambval,RED),
317 +                                colval(ambval,GRN), colval(ambval,BLU),
318 +                                ambounce, ambacc);
319 +                fprintf(ambfp, "-ad %d -as %d -ar %d %s\n",
320 +                                ambdiv, ambssamp, ambres,
321 +                                octname==NULL ? "" : octname);
322 +                fprintf(ambfp, "SOFTWARE= %s\n", VersionID);
323 +                fputformat(AMBFMT, ambfp);
324 +                putc('\n', ambfp);
325 +                putambmagic(ambfp);
326 +                fflush(ambfp);
327 +        } else if (checkheader(ambfp, AMBFMT, NULL) < 0
328 +                        || !hasambmagic(ambfp)) {
329 +                sprintf(errmsg, "\"%s\" is not an ambient file", afname);
330 +                error(USER, errmsg);
331 +        }
332 + }
333 +
334 +
335 + static
336   avsave(av)                              /* insert and save an ambient value */
337   AMBVAL  *av;
338   {
# Line 409 | Line 410 | ambsync()                      /* synchronize ambient file */
410          if (fcntl(fileno(ambfp), F_SETLKW, &fls) < 0)
411                  error(SYSTEM, "cannot lock ambient file");
412                                  /* see if file has grown */
413 <        lastpos = lseek(fileno(ambfp), 0L, 2);  /* may move pointer */
414 <        flen = lseek(fileno(ambfp), 0L, 1);     /* new(?) file length */
413 >        lastpos = lseek(fileno(ambfp), 0L, 1);  /* get previous position */
414 >        flen = lseek(fileno(ambfp), 0L, 2);     /* new(?) file length */
415          if (n = (flen - lastpos)%AMBVALSIZ)     /* assure alignment */
416 <                lseek(fileno(ambfp), flen -= n, 0);
416 >                lseek(fileno(ambfp), (long)-n, 1);
417          if (n = (flen - lastpos)/AMBVALSIZ) {   /* file has grown */
418                  if (ambinp == NULL && (ambinp = fopen(afname, "r")) == NULL)
419                          error(SYSTEM, "cannot reopen ambient file");

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines