ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/hd/rholo2.c
Revision: 3.16
Committed: Tue Nov 24 17:05:36 1998 UTC (25 years, 4 months ago) by gwlarson
Content type: text/plain
Branch: MAIN
Changes since 3.15: +54 -20 lines
Log Message:
added eyepoint vicinity restriction for interactive samples

File Contents

# User Rev Content
1 gwlarson 3.12 /* Copyright (c) 1998 Silicon Graphics, Inc. */
2 gregl 3.1
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 gregl 3.5 #include "paths.h"
13 gregl 3.1 #include "random.h"
14    
15    
16 gwlarson 3.16 VIEWPOINT myeye; /* target view position */
17    
18    
19 gregl 3.1 packrays(rod, p) /* pack ray origins and directions */
20 gwlarson 3.15 register float *rod;
21 gregl 3.1 register PACKET *p;
22     {
23 gwlarson 3.16 short packord[RPACKSIZ];
24     float packdc[RPACKSIZ];
25     int iterleft = 3*p->nr;
26     BYTE rpos[2][2];
27     FVECT ro, rd, rp1;
28 gregl 3.3 GCOORD gc[2];
29 gwlarson 3.16 double d, dc, meandist;
30     int i;
31     register int ii;
32 gregl 3.1
33     if (!hdbcoord(gc, hdlist[p->hd], p->bi))
34     error(CONSISTENCY, "bad beam index in packrays");
35 gwlarson 3.16 for (i = 0, meandist = 0.; i < p->nr || meandist > myeye.rng+FTINY; ) {
36     rpos[0][0] = frandom() * 256.;
37     rpos[0][1] = frandom() * 256.;
38     rpos[1][0] = frandom() * 256.;
39     rpos[1][1] = frandom() * 256.;
40     d = hdray(ro, rd, hdlist[p->hd], gc, rpos);
41     if (myeye.rng > FTINY) { /* check eyepoint */
42     register int nexti;
43    
44     VSUM(rp1, ro, rd, d);
45     dc = sqrt(dist2line(myeye.vpt, ro, rp1)) / p->nr;
46     if (i == p->nr) { /* packet full */
47     nexti = packord[i-1];
48     if (!iterleft--)
49     break; /* tried enough! */
50     if (dc >= packdc[nexti])
51     continue; /* worse than worst */
52     meandist -= packdc[nexti];
53     } else
54     nexti = i++;
55     meandist += packdc[nexti] = dc; /* new distance */
56     for (ii = i; --ii; ) { /* insertion sort */
57     if (dc > packdc[packord[ii-1]])
58     break;
59     packord[ii] = packord[ii-1];
60     }
61     packord[ii] = nexti;
62     ii = nexti; /* put it here */
63     } else
64     ii = i++;
65 gregl 3.1 if (p->offset != NULL) {
66 gwlarson 3.16 if (!vdef(OBSTRUCTIONS))
67     d *= frandom(); /* random offset */
68 gregl 3.8 VSUM(ro, ro, rd, d); /* advance ray */
69 gwlarson 3.16 p->offset[ii] = d;
70 gregl 3.1 }
71 gwlarson 3.16 p->ra[ii].r[0][0] = rpos[0][0];
72     p->ra[ii].r[0][1] = rpos[0][1];
73     p->ra[ii].r[1][0] = rpos[1][0];
74     p->ra[ii].r[1][1] = rpos[1][1];
75     VCOPY(rod+6*ii, ro);
76     VCOPY(rod+6*ii+3, rd);
77 gregl 3.1 }
78 gwlarson 3.16 #ifdef DEBUG
79     fprintf(stderr, "%f mean distance for target %f (%d iterations)\n",
80     meandist, myeye.rng, 3*p->nr - iterleft);
81     #endif
82 gregl 3.1 }
83    
84    
85     donerays(p, rvl) /* encode finished ray computations */
86     register PACKET *p;
87     register float *rvl;
88     {
89     double d;
90     register int i;
91    
92     for (i = 0; i < p->nr; i++) {
93     setcolr(p->ra[i].v, rvl[0], rvl[1], rvl[2]);
94     d = rvl[3];
95     if (p->offset != NULL)
96     d += p->offset[i];
97     p->ra[i].d = hdcode(hdlist[p->hd], d);
98     rvl += 4;
99     }
100 gregl 3.4 p->nc += p->nr;
101 gregl 3.5 }
102    
103    
104     int
105     done_rtrace() /* clean up and close rtrace calculation */
106     {
107     int status;
108     /* already closed? */
109     if (!nprocs)
110     return;
111     /* flush beam queue */
112     done_packets(flush_queue());
113 gregl 3.7 /* sync holodeck */
114     hdsync(NULL, 1);
115 gregl 3.5 /* close rtrace */
116     if ((status = end_rtrace()))
117     error(WARNING, "bad exit status from rtrace");
118 gregl 3.9 if (vdef(REPORT)) { /* report time */
119 gregl 3.10 eputs("rtrace process closed\n");
120 gregl 3.5 report(0);
121 gregl 3.9 }
122 gregl 3.5 return(status); /* return status */
123     }
124    
125    
126     new_rtrace() /* restart rtrace calculation */
127     {
128     char combuf[128];
129    
130     if (nprocs > 0) /* already running? */
131     return;
132 gregl 3.6 starttime = time(NULL); /* reset start time and counts */
133     npacksdone = nraysdone = 0L;
134     if (vdef(TIME)) /* reset end time */
135     endtime = starttime + vflt(TIME)*3600. + .5;
136 gregl 3.5 if (vdef(RIF)) { /* rerun rad to update octree */
137     sprintf(combuf, "rad -v 0 -s -w %s", vval(RIF));
138     if (system(combuf))
139     error(WARNING, "error running rad");
140     }
141     if (start_rtrace() < 1) /* start rtrace */
142     error(WARNING, "cannot restart rtrace");
143 gregl 3.9 else if (vdef(REPORT)) {
144     eputs("rtrace process restarted\n");
145 gregl 3.5 report(0);
146 gregl 3.9 }
147 gregl 3.5 }
148    
149    
150     getradfile() /* run rad and get needed variables */
151     {
152 gwlarson 3.12 static short mvar[] = {OCTREE,EYESEP,-1};
153 gregl 3.5 static char tf1[] = TEMPLATE;
154     char tf2[64];
155     char combuf[256];
156     char *pippt;
157     register int i;
158     register char *cp;
159     /* check if rad file specified */
160     if (!vdef(RIF))
161 gregl 3.11 return(0);
162 gregl 3.5 /* create rad command */
163     mktemp(tf1);
164     sprintf(tf2, "%s.rif", tf1);
165     sprintf(combuf,
166     "rad -v 0 -s -e -w %s OPTFILE=%s | egrep '^[ \t]*(NOMATCH",
167     vval(RIF), tf1);
168     cp = combuf;
169     while (*cp){
170     if (*cp == '|') pippt = cp;
171     cp++;
172     } /* match unset variables */
173     for (i = 0; mvar[i] >= 0; i++)
174     if (!vdef(mvar[i])) {
175     *cp++ = '|';
176     strcpy(cp, vnam(mvar[i]));
177     while (*cp) cp++;
178     pippt = NULL;
179     }
180     if (pippt != NULL)
181     strcpy(pippt, "> /dev/null"); /* nothing to match */
182     else
183     sprintf(cp, ")[ \t]*=' > %s", tf2);
184 gwlarson 3.13 #ifdef DEBUG
185     wputs(combuf); wputs("\n");
186     #endif
187     system(combuf); /* ignore exit code */
188 gregl 3.5 if (pippt == NULL) {
189     loadvars(tf2); /* load variables */
190     unlink(tf2);
191     }
192     rtargc += wordfile(rtargv+rtargc, tf1); /* get rtrace options */
193     unlink(tf1); /* clean up */
194 gregl 3.11 return(1);
195 gregl 3.6 }
196    
197    
198     report(t) /* report progress so far */
199     time_t t;
200     {
201     static time_t seconds2go = 1000000;
202    
203     if (t == 0L)
204     t = time(NULL);
205     sprintf(errmsg, "%ld packets (%ld rays) done after %.2f hours\n",
206     npacksdone, nraysdone, (t-starttime)/3600.);
207     eputs(errmsg);
208     if (seconds2go == 1000000)
209     seconds2go = vdef(REPORT) ? (long)(vflt(REPORT)*60. + .5) : 0L;
210     if (seconds2go)
211     reporttime = t + seconds2go;
212 gregl 3.1 }