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

Comparing ray/src/hd/rhoptimize.c (file contents):
Revision 3.5 by gwlarson, Thu Nov 12 15:07:49 1998 UTC vs.
Revision 3.14 by schorsch, Mon Jul 21 22:30:18 2003 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1998 Silicon Graphics, Inc. */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ SGI";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   * Optimize holodeck for quick access.
6   *
7   *      11/4/98         Greg Ward Larson
8   */
9  
13 #include "holo.h"
14
10   #include <signal.h>
11 + #include <string.h>
12  
13 + #include "rtprocess.h" /* getpid() */
14 + #include "holo.h"
15 +
16   #ifndef BKBSIZE
17   #define BKBSIZE         256             /* beam clump size (kilobytes) */
18   #endif
19  
20   char    *progname;
21   char    tempfile[128];
22 + int     dupchecking = 0;
23  
24 extern char     *rindex();
25 extern int      quit();
24   extern long     rhinitcopy();
25  
26  
# Line 35 | Line 33 | char   *argv[];
33          long    nextipos, lastopos, thisopos;
34  
35          progname = argv[0];
36 <        if (argc < 2 | argc > 3) {
37 <                fprintf(stderr, "Usage: %s input.hdk [output.hdk]\n", progname);
36 >        argv++; argc--;                 /* duplicate checking flag? */
37 >        if (argc > 1 && !strcmp(argv[0], "-u")) {
38 >                dupchecking++;
39 >                argv++; argc--;
40 >        }
41 >        if (argc < 1 | argc > 2) {
42 >                fprintf(stderr, "Usage: %s [-u] input.hdk [output.hdk]\n",
43 >                                progname);
44                  exit(1);
45          }
46 <        inpname = argv[1];
47 <        if (argc == 3)                  /* use given output file */
48 <                outname = argv[2];
46 >        inpname = argv[0];              /* get input file */
47 >        argv++; argc--;
48 >        if (argc == 1)                  /* use given output file */
49 >                outname = argv[0];
50          else {                          /* else use temporary file */
51                  if (access(inpname, R_OK|W_OK) < 0) {   /* check permissions */
52                          sprintf(errmsg, "cannot access \"%s\"", inpname);
53                          error(SYSTEM, errmsg);
54                  }
55                  strcpy(tempfile, inpname);
56 <                if ((outname = rindex(tempfile, '/')) != NULL)
56 >                if ((outname = strrchr(tempfile, '/')) != NULL)
57                          outname++;
58                  else
59                          outname = tempfile;
# Line 60 | Line 65 | char   *argv[];
65          lastopos = 0L;                  /* copy sections one by one */
66          while (nextipos != 0L) {
67                                          /* set input position; get next */
68 <                lseek(hdfd[0], nextipos, 0);
68 >                lseek(hdfd[0], (off_t)nextipos, 0);
69                  read(hdfd[0], (char *)&nextipos, sizeof(nextipos));
70                                          /* get output position; set last */
71 <                thisopos = lseek(hdfd[1], 0L, 2);
71 >                thisopos = lseek(hdfd[1], (off_t)0, 2);
72                  if (lastopos > 0L) {
73 <                        lseek(hdfd[1], lastopos, 0);
73 >                        lseek(hdfd[1], (off_t)lastopos, 0);
74                          write(hdfd[1], (char *)&thisopos, sizeof(thisopos));
75 <                        lseek(hdfd[1], 0L, 2);
75 >                        lseek(hdfd[1], (off_t)0, 2);
76                  }
77                  lastopos = thisopos;
78                  thisopos = 0L;          /* write place holder */
# Line 99 | Line 104 | char   *infn, *outfn;
104                  sprintf(errmsg, "cannot open \"%s\" for reading", infn);
105                  error(SYSTEM, errmsg);
106          }
107 +        if (access(outfn, F_OK) == 0) {
108 +                sprintf(errmsg, "output file \"%s\" already exists!", outfn);
109 +                error(USER, errmsg);
110 +        }
111          if ((outfp = fopen(outfn, "w+")) == NULL) {
112                  sprintf(errmsg, "cannot open \"%s\" for writing", outfn);
113                  error(SYSTEM, errmsg);
# Line 133 | Line 142 | char   *infn, *outfn;
142   }
143  
144  
145 + int
146 + nuniq(rva, n)                   /* sort unique rays to front of beam list */
147 + register RAYVAL *rva;
148 + int     n;
149 + {
150 +        register int    i, j;
151 +        RAYVAL  rtmp;
152 +
153 +        for (j = 0; j < n; j++)
154 +                for (i = j+1; i < n; i++)
155 +                        if ( rva[i].d == rva[j].d &&
156 +                                        rva[i].r[0][0]==rva[j].r[0][0] &&
157 +                                        rva[i].r[0][1]==rva[j].r[0][1] &&
158 +                                        rva[i].r[1][0]==rva[j].r[1][0] &&
159 +                                        rva[i].r[1][1]==rva[j].r[1][1] ) {
160 +                                n--;            /* swap duplicate with end */
161 +                                rtmp = *(rva+n);
162 +                                *(rva+n) = *(rva+i);
163 +                                *(rva+i) = rtmp;
164 +                                i--;            /* recheck one we swapped */
165 +                        }
166 +        return(n);
167 + }
168 +
169 +
170   static BEAMI    *beamdir;
171  
172   static int
173   bpcmp(b1p, b2p)                 /* compare beam positions on disk */
174   int     *b1p, *b2p;
175   {
176 <        register long   pdif = beamdir[*b1p].fo - beamdir[*b2p].fo;
176 >        register off_t  pdif = beamdir[*b1p].fo - beamdir[*b2p].fo;
177  
144        if (pdif > 0L) return(1);
178          if (pdif < 0L) return(-1);
179 <        return(0);
179 >        return(pdif > 0L);
180   }
181  
182   static HOLO     *hout;
# Line 155 | Line 188 | int    *bq, nb;
188   {
189          register int    i;
190          register BEAM   *bp;
191 +        int     n;
192  
193          beamdir = hp->bi;               /* sort based on file position */
194 <        qsort((char *)bq, nb, sizeof(*bq), bpcmp);
194 >        qsort((void *)bq, nb, sizeof(*bq), bpcmp);
195                                          /* transfer and free each beam */
196          for (i = 0; i < nb; i++) {
197                  bp = hdgetbeam(hp, bq[i]);
198 <                bcopy((char *)hdbray(bp), (char *)hdnewrays(hout,bq[i],bp->nrm),
199 <                                bp->nrm*sizeof(RAYVAL));
198 >                DCHECK(bp==NULL, CONSISTENCY, "empty beam in xferclump");
199 >                n = dupchecking ? nuniq(hdbray(bp),bp->nrm) : bp->nrm;
200 >                memcpy((void *)hdnewrays(hout,bq[i],n),(void *)hdbray(bp),
201 >                                n*sizeof(RAYVAL));
202                  hdfreebeam(hp, bq[i]);
203          }
204 <        hdflush(hout);                  /* write & free clump */
204 >        hdfreebeam(hout, 0);            /* write & free clump */
205          return(0);
206   }
207  
# Line 185 | Line 221 | int    ifd, ofd;
221   }
222  
223  
224 + void
225   eputs(s)                        /* put error message to stderr */
226   register char  *s;
227   {
# Line 204 | Line 241 | register char  *s;
241   }
242  
243  
244 + void
245   quit(code)                      /* exit the program gracefully */
246   int     code;
247   {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines