ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/hd/rholo2.c
Revision: 3.14
Committed: Mon Nov 23 17:50:26 1998 UTC (25 years, 5 months ago) by gwlarson
Content type: text/plain
Branch: MAIN
Changes since 3.13: +51 -10 lines
Log Message:
added duplicate ray checking

File Contents

# Content
1 /* Copyright (c) 1998 Silicon Graphics, Inc. */
2
3 #ifndef lint
4 static char SCCSid[] = "$SunId$ SGI";
5 #endif
6
7 /*
8 * Rtrace support routines for holodeck rendering
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 float *rod;
18 register PACKET *p;
19 {
20 static int nmh = 0;
21 static int *mhtab;
22 FVECT ro, rd;
23 register BEAM *bp;
24 GCOORD gc[2];
25 int ila[4], offset;
26 double d, sl[4];
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 offset = ilhash(ila,2) + p->nc;
55 for (i = 0; i < p->nr; i++) {
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); /* advance ray */
82 p->offset[i] = d;
83 }
84 VCOPY(rod, ro);
85 rod += 3;
86 VCOPY(rod, rd);
87 rod += 3;
88 }
89 }
90
91
92 donerays(p, rvl) /* encode finished ray computations */
93 register PACKET *p;
94 register float *rvl;
95 {
96 double d;
97 register int i;
98
99 for (i = 0; i < p->nr; i++) {
100 setcolr(p->ra[i].v, rvl[0], rvl[1], rvl[2]);
101 d = rvl[3];
102 if (p->offset != NULL)
103 d += p->offset[i];
104 p->ra[i].d = hdcode(hdlist[p->hd], d);
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 }