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

Comparing ray/src/hd/rholo2.c (file contents):
Revision 3.4 by gregl, Mon Dec 1 16:34:36 1997 UTC vs.
Revision 3.14 by gwlarson, Mon Nov 23 17:50:26 1998 UTC

# Line 1 | Line 1
1 < /* Copyright (c) 1997 Silicon Graphics, Inc. */
1 > /* Copyright (c) 1998 Silicon Graphics, Inc. */
2  
3   #ifndef lint
4   static char SCCSid[] = "$SunId$ SGI";
# Line 9 | Line 9 | static char SCCSid[] = "$SunId$ SGI";
9   */
10  
11   #include "rholo.h"
12 + #include "paths.h"
13   #include "random.h"
14  
15  
16   packrays(rod, p)                /* pack ray origins and directions */
17 < register float  *rod;
17 > float   *rod;
18   register PACKET *p;
19   {
20 <        static FVECT    ro, rd;
20 >        static int      nmh = 0;
21 >        static int      *mhtab;
22 >        FVECT   ro, rd;
23 >        register BEAM   *bp;
24          GCOORD  gc[2];
25 <        int     ila[2], hsh;
25 >        int     ila[4], offset;
26          double  d, sl[4];
27 <        register int    i;
27 >        register int    i, j, k;
28  
29          if (!hdbcoord(gc, hdlist[p->hd], p->bi))
30                  error(CONSISTENCY, "bad beam index in packrays");
31 +                                                        /* uniqueness hash */
32 +        if ((bp = hdgetbeam(hdlist[p->hd], p->bi)) != NULL) {
33 +                if (2*bp->nrm > nmh) {
34 +                        if (nmh) free((char *)mhtab);
35 +                        nmh = 2*bp->nrm + 1;
36 +                        mhtab = (int *)malloc(nmh*sizeof(int));
37 +                        if (mhtab == NULL)
38 +                                error(SYSTEM, "out of memory in packrays");
39 +                }
40 +                for (k = nmh; k--; )
41 +                        mhtab[k] = -1;
42 +                for (i = bp->nrm; i--; ) {
43 +                        ila[0] = hdbray(bp)[i].r[0][0];
44 +                        ila[1] = hdbray(bp)[i].r[0][1];
45 +                        ila[2] = hdbray(bp)[i].r[1][0];
46 +                        ila[3] = hdbray(bp)[i].r[1][1];
47 +                        for (k = ilhash(ila,4); mhtab[k%nmh] >= 0; k++)
48 +                                ;
49 +                        mhtab[k%nmh] = i;
50 +                }
51 +        }
52 +                                                        /* init each ray */
53          ila[0] = p->hd; ila[1] = p->bi;
54 <        hsh = ilhash(ila,2) + p->nc;
54 >        offset = ilhash(ila,2) + p->nc;
55          for (i = 0; i < p->nr; i++) {
56 <                multisamp(sl, 4, urand(hsh+i));
57 <                p->ra[i].r[0][0] = sl[0] * 256.;
58 <                p->ra[i].r[0][1] = sl[1] * 256.;
59 <                p->ra[i].r[1][0] = sl[2] * 256.;
60 <                p->ra[i].r[1][1] = sl[3] * 256.;
56 >                do {                                    /* next unique ray */
57 >                        multisamp(sl, 4, urand(offset+i));
58 >                        p->ra[i].r[0][0] = ila[0] = sl[0] * 256.;
59 >                        p->ra[i].r[0][1] = ila[1] = sl[1] * 256.;
60 >                        p->ra[i].r[1][0] = ila[2] = sl[2] * 256.;
61 >                        p->ra[i].r[1][1] = ila[3] = sl[3] * 256.;
62 >                        if (bp == NULL)
63 >                                break;
64 >                        for (k = ilhash(ila,4); (j = mhtab[k%nmh]) >= 0; k++)
65 >                                if (hdbray(bp)[j].r[0][0] ==
66 >                                                        p->ra[i].r[0][0] &&
67 >                                                hdbray(bp)[j].r[0][1] ==
68 >                                                        p->ra[i].r[0][1] &&
69 >                                                hdbray(bp)[j].r[1][0] ==
70 >                                                        p->ra[i].r[1][0] &&
71 >                                                hdbray(bp)[j].r[1][1] ==
72 >                                                        p->ra[i].r[1][1]) {
73 >                                        offset += bp->nrm - j;
74 >                                        break;
75 >                                }
76 >                } while (j >= 0);
77                  d = hdray(ro, rd, hdlist[p->hd], gc, p->ra[i].r);
78 +                if (!vdef(OBSTRUCTIONS))
79 +                        d *= frandom();                 /* random offset */
80                  if (p->offset != NULL) {
81 <                        VSUM(ro, ro, rd, d);            /* exterior only */
81 >                        VSUM(ro, ro, rd, d);            /* advance ray */
82                          p->offset[i] = d;
83                  }
84                  VCOPY(rod, ro);
# Line 61 | Line 105 | register float *rvl;
105                  rvl += 4;
106          }
107          p->nc += p->nr;
108 + }
109 +
110 +
111 + int
112 + done_rtrace()                   /* clean up and close rtrace calculation */
113 + {
114 +        int     status;
115 +                                        /* already closed? */
116 +        if (!nprocs)
117 +                return;
118 +                                        /* flush beam queue */
119 +        done_packets(flush_queue());
120 +                                        /* sync holodeck */
121 +        hdsync(NULL, 1);
122 +                                        /* close rtrace */
123 +        if ((status = end_rtrace()))
124 +                error(WARNING, "bad exit status from rtrace");
125 +        if (vdef(REPORT)) {             /* report time */
126 +                eputs("rtrace process closed\n");
127 +                report(0);
128 +        }
129 +        return(status);                 /* return status */
130 + }
131 +
132 +
133 + new_rtrace()                    /* restart rtrace calculation */
134 + {
135 +        char    combuf[128];
136 +
137 +        if (nprocs > 0)                 /* already running? */
138 +                return;
139 +        starttime = time(NULL);         /* reset start time and counts */
140 +        npacksdone = nraysdone = 0L;
141 +        if (vdef(TIME))                 /* reset end time */
142 +                endtime = starttime + vflt(TIME)*3600. + .5;
143 +        if (vdef(RIF)) {                /* rerun rad to update octree */
144 +                sprintf(combuf, "rad -v 0 -s -w %s", vval(RIF));
145 +                if (system(combuf))
146 +                        error(WARNING, "error running rad");
147 +        }
148 +        if (start_rtrace() < 1)         /* start rtrace */
149 +                error(WARNING, "cannot restart rtrace");
150 +        else if (vdef(REPORT)) {
151 +                eputs("rtrace process restarted\n");
152 +                report(0);
153 +        }
154 + }
155 +
156 +
157 + getradfile()                    /* run rad and get needed variables */
158 + {
159 +        static short    mvar[] = {OCTREE,EYESEP,-1};
160 +        static char     tf1[] = TEMPLATE;
161 +        char    tf2[64];
162 +        char    combuf[256];
163 +        char    *pippt;
164 +        register int    i;
165 +        register char   *cp;
166 +                                        /* check if rad file specified */
167 +        if (!vdef(RIF))
168 +                return(0);
169 +                                        /* create rad command */
170 +        mktemp(tf1);
171 +        sprintf(tf2, "%s.rif", tf1);
172 +        sprintf(combuf,
173 +                "rad -v 0 -s -e -w %s OPTFILE=%s | egrep '^[ \t]*(NOMATCH",
174 +                        vval(RIF), tf1);
175 +        cp = combuf;
176 +        while (*cp){
177 +                if (*cp == '|') pippt = cp;
178 +                cp++;
179 +        }                               /* match unset variables */
180 +        for (i = 0; mvar[i] >= 0; i++)
181 +                if (!vdef(mvar[i])) {
182 +                        *cp++ = '|';
183 +                        strcpy(cp, vnam(mvar[i]));
184 +                        while (*cp) cp++;
185 +                        pippt = NULL;
186 +                }
187 +        if (pippt != NULL)
188 +                strcpy(pippt, "> /dev/null");   /* nothing to match */
189 +        else
190 +                sprintf(cp, ")[ \t]*=' > %s", tf2);
191 + #ifdef DEBUG
192 +        wputs(combuf); wputs("\n");
193 + #endif
194 +        system(combuf);                         /* ignore exit code */
195 +        if (pippt == NULL) {
196 +                loadvars(tf2);                  /* load variables */
197 +                unlink(tf2);
198 +        }
199 +        rtargc += wordfile(rtargv+rtargc, tf1); /* get rtrace options */
200 +        unlink(tf1);                    /* clean up */
201 +        return(1);
202 + }
203 +
204 +
205 + report(t)                       /* report progress so far */
206 + time_t  t;
207 + {
208 +        static time_t   seconds2go = 1000000;
209 +
210 +        if (t == 0L)
211 +                t = time(NULL);
212 +        sprintf(errmsg, "%ld packets (%ld rays) done after %.2f hours\n",
213 +                        npacksdone, nraysdone, (t-starttime)/3600.);
214 +        eputs(errmsg);
215 +        if (seconds2go == 1000000)
216 +                seconds2go = vdef(REPORT) ? (long)(vflt(REPORT)*60. + .5) : 0L;
217 +        if (seconds2go)
218 +                reporttime = t + seconds2go;
219   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines