ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/rtrace.c
Revision: 1.15
Committed: Wed Jun 19 16:36:48 1991 UTC (32 years, 10 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.14: +1 -0 lines
Log Message:
added virtual sources

File Contents

# User Rev Content
1 greg 1.1 /* Copyright (c) 1986 Regents of the University of California */
2    
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ LBL";
5     #endif
6    
7     /*
8     * rtrace.c - program and variables for individual ray tracing.
9     *
10     * 6/11/86
11     */
12    
13     /*
14     * Input is in the form:
15     *
16     * xorg yorg zorg xdir ydir zdir
17     *
18     * The direction need not be normalized. Output is flexible.
19 greg 1.7 * If the direction vector is (0,0,0), then the output is flushed.
20 greg 1.1 * All values default to ascii representation of real
21     * numbers. Binary representations can be selected
22     * with '-ff' for float or '-fd' for double. By default,
23 greg 1.13 * radiance is computed. The '-i' or '-I' options indicate that
24 greg 1.1 * irradiance values are desired.
25     */
26    
27     #include "ray.h"
28    
29 greg 1.11 #include "octree.h"
30    
31 greg 1.1 #include "otypes.h"
32    
33 greg 1.14 int dimlist[MAXDIM]; /* sampling dimensions */
34     int ndims = 0; /* number of sampling dimensions */
35     int samplendx = 0; /* index for this sample */
36    
37 greg 1.13 int imm_irrad = 0; /* compute immediate irradiance? */
38    
39 greg 1.1 int inform = 'a'; /* input format */
40     int outform = 'a'; /* output format */
41     char *outvals = "v"; /* output specification */
42    
43     int hresolu = 0; /* horizontal (scan) size */
44     int vresolu = 0; /* vertical resolution */
45    
46     double dstrsrc = 0.0; /* square source distribution */
47 greg 1.4 double shadthresh = .05; /* shadow threshold */
48 greg 1.5 double shadcert = .5; /* shadow certainty */
49 greg 1.15 int directrelay = 0; /* number of source relays */
50 greg 1.1
51     int maxdepth = 6; /* maximum recursion depth */
52     double minweight = 4e-3; /* minimum ray weight */
53    
54     COLOR ambval = BLKCOLOR; /* ambient value */
55     double ambacc = 0.2; /* ambient accuracy */
56 greg 1.6 int ambres = 32; /* ambient resolution */
57 greg 1.1 int ambdiv = 128; /* ambient divisions */
58     int ambssamp = 0; /* ambient super-samples */
59     int ambounce = 0; /* ambient bounces */
60     char *amblist[128]; /* ambient include/exclude list */
61     int ambincl = -1; /* include == 1, exclude == 0 */
62    
63 greg 1.13 extern OBJREC Lamb; /* a Lambertian surface */
64    
65 greg 1.1 static RAY thisray; /* for our convenience */
66    
67 greg 1.10 static int oputo(), oputd(), oputv(), oputl(),
68 greg 1.1 oputp(), oputn(), oputs(), oputw(), oputm();
69    
70     static int (*ray_out[10])(), (*every_out[10])();
71 greg 1.11 static int castonly;
72 greg 1.1
73 greg 1.10 static int puta(), putf(), putd();
74 greg 1.1
75     static int (*putreal)();
76    
77    
78     quit(code) /* quit program */
79     int code;
80     {
81     exit(code);
82     }
83    
84    
85     rtrace(fname) /* trace rays from file */
86     char *fname;
87     {
88     long vcount = hresolu>1 ? hresolu*vresolu : vresolu;
89     long nextflush = hresolu;
90     FILE *fp;
91 greg 1.2 FVECT orig, direc;
92 greg 1.1 /* set up input */
93     if (fname == NULL)
94     fp = stdin;
95     else if ((fp = fopen(fname, "r")) == NULL) {
96     sprintf(errmsg, "cannot open input file \"%s\"", fname);
97     error(SYSTEM, errmsg);
98     }
99     /* set up output */
100     setoutput(outvals);
101     switch (outform) {
102     case 'a': putreal = puta; break;
103     case 'f': putreal = putf; break;
104     case 'd': putreal = putd; break;
105     }
106     /* process file */
107     while (getvec(orig, inform, fp) == 0 &&
108     getvec(direc, inform, fp) == 0) {
109    
110 greg 1.7 if (normalize(direc) == 0.0) { /* zero ==> flush */
111     fflush(stdout);
112     continue;
113     }
114 greg 1.14 samplendx++;
115 greg 1.1 /* compute and print */
116 greg 1.13 if (imm_irrad)
117 greg 1.1 irrad(orig, direc);
118     else
119 greg 1.13 traceray(orig, direc);
120 greg 1.7 /* flush if time */
121 greg 1.1 if (--nextflush == 0) {
122     fflush(stdout);
123     nextflush = hresolu;
124     }
125     if (ferror(stdout))
126     error(SYSTEM, "write error");
127     if (--vcount == 0) /* check for end */
128     break;
129     }
130     if (vcount > 0)
131     error(USER, "read error");
132     fclose(fp);
133     }
134    
135    
136     setoutput(vs) /* set up output tables */
137     register char *vs;
138     {
139     extern int ourtrace(), (*trace)();
140     register int (**table)() = ray_out;
141    
142 greg 1.11 castonly = 1;
143 greg 1.1 while (*vs)
144     switch (*vs++) {
145     case 't': /* trace */
146     *table = NULL;
147     table = every_out;
148     trace = ourtrace;
149 greg 1.11 castonly = 0;
150 greg 1.1 break;
151     case 'o': /* origin */
152     *table++ = oputo;
153     break;
154     case 'd': /* direction */
155     *table++ = oputd;
156     break;
157     case 'v': /* value */
158     *table++ = oputv;
159 greg 1.11 castonly = 0;
160 greg 1.1 break;
161     case 'l': /* length */
162     *table++ = oputl;
163 greg 1.11 castonly = 0;
164 greg 1.1 break;
165     case 'p': /* point */
166     *table++ = oputp;
167     break;
168     case 'n': /* normal */
169     *table++ = oputn;
170     break;
171     case 's': /* surface */
172     *table++ = oputs;
173     break;
174     case 'w': /* weight */
175     *table++ = oputw;
176     break;
177     case 'm': /* modifier */
178     *table++ = oputm;
179     break;
180     }
181     *table = NULL;
182     }
183    
184    
185 greg 1.13 traceray(org, dir) /* compute and print ray value(s) */
186 greg 1.1 FVECT org, dir;
187     {
188     register int (**tp)();
189    
190     VCOPY(thisray.rorg, org);
191     VCOPY(thisray.rdir, dir);
192     rayorigin(&thisray, NULL, PRIMARY, 1.0);
193 greg 1.11 if (castonly)
194     localhit(&thisray, &thescene) || sourcehit(&thisray);
195     else
196     rayvalue(&thisray);
197 greg 1.1
198     if (ray_out[0] == NULL)
199     return;
200     for (tp = ray_out; *tp != NULL; tp++)
201     (**tp)(&thisray);
202     if (outform == 'a')
203     putchar('\n');
204     }
205    
206    
207 greg 1.13 irrad(org, dir) /* compute immediate irradiance value */
208 greg 1.1 FVECT org, dir;
209     {
210     register int i;
211    
212     for (i = 0; i < 3; i++) {
213     thisray.rorg[i] = org[i] + dir[i];
214     thisray.rdir[i] = -dir[i];
215     }
216     rayorigin(&thisray, NULL, PRIMARY, 1.0);
217     /* pretend we hit surface */
218     thisray.rot = 1.0;
219     thisray.rod = 1.0;
220     VCOPY(thisray.ron, dir);
221     for (i = 0; i < 3; i++) /* fudge factor */
222     thisray.rop[i] = org[i] + 1e-4*dir[i];
223     /* compute and print */
224     (*ofun[Lamb.otype].funp)(&Lamb, &thisray);
225     oputv(&thisray);
226     if (outform == 'a')
227     putchar('\n');
228     }
229    
230    
231     getvec(vec, fmt, fp) /* get a vector from fp */
232     register FVECT vec;
233     int fmt;
234     FILE *fp;
235     {
236     static float vf[3];
237    
238     switch (fmt) {
239     case 'a': /* ascii */
240     if (fscanf(fp, "%lf %lf %lf", vec, vec+1, vec+2) != 3)
241     return(-1);
242     break;
243     case 'f': /* binary float */
244 greg 1.8 if (fread((char *)vf, sizeof(float), 3, fp) != 3)
245 greg 1.1 return(-1);
246     vec[0] = vf[0]; vec[1] = vf[1]; vec[2] = vf[2];
247     break;
248     case 'd': /* binary double */
249 greg 1.8 if (fread((char *)vec, sizeof(double), 3, fp) != 3)
250 greg 1.1 return(-1);
251     break;
252     }
253     return(0);
254     }
255    
256    
257     static
258     ourtrace(r) /* print ray values */
259     RAY *r;
260     {
261     register int (**tp)();
262    
263     if (every_out[0] == NULL)
264     return;
265     tabin(r);
266     for (tp = every_out; *tp != NULL; tp++)
267     (**tp)(r);
268     putchar('\n');
269     }
270    
271    
272     static
273     tabin(r) /* tab in appropriate amount */
274     RAY *r;
275     {
276     register RAY *rp;
277    
278     for (rp = r->parent; rp != NULL; rp = rp->parent)
279     putchar('\t');
280     }
281    
282    
283     static
284     oputo(r) /* print origin */
285     register RAY *r;
286     {
287     (*putreal)(r->rorg[0]);
288     (*putreal)(r->rorg[1]);
289     (*putreal)(r->rorg[2]);
290     }
291    
292    
293     static
294     oputd(r) /* print direction */
295     register RAY *r;
296     {
297     (*putreal)(r->rdir[0]);
298     (*putreal)(r->rdir[1]);
299     (*putreal)(r->rdir[2]);
300     }
301    
302    
303     static
304     oputv(r) /* print value */
305     register RAY *r;
306     {
307     (*putreal)(colval(r->rcol,RED));
308     (*putreal)(colval(r->rcol,GRN));
309     (*putreal)(colval(r->rcol,BLU));
310     }
311    
312    
313     static
314     oputl(r) /* print length */
315     register RAY *r;
316     {
317 greg 1.9 (*putreal)(r->rt);
318 greg 1.1 }
319    
320    
321     static
322     oputp(r) /* print point */
323     register RAY *r;
324     {
325     if (r->rot < FHUGE) {
326     (*putreal)(r->rop[0]);
327     (*putreal)(r->rop[1]);
328     (*putreal)(r->rop[2]);
329     } else {
330     (*putreal)(0.0);
331     (*putreal)(0.0);
332     (*putreal)(0.0);
333     }
334     }
335    
336    
337     static
338     oputn(r) /* print normal */
339     register RAY *r;
340     {
341     if (r->rot < FHUGE) {
342     (*putreal)(r->ron[0]);
343     (*putreal)(r->ron[1]);
344     (*putreal)(r->ron[2]);
345     } else {
346     (*putreal)(0.0);
347     (*putreal)(0.0);
348     (*putreal)(0.0);
349     }
350     }
351    
352    
353     static
354     oputs(r) /* print name */
355     register RAY *r;
356     {
357     if (r->ro != NULL)
358     fputs(r->ro->oname, stdout);
359     else
360     putchar('*');
361     putchar('\t');
362     }
363    
364    
365     static
366     oputw(r) /* print weight */
367     register RAY *r;
368     {
369     (*putreal)(r->rweight);
370     }
371    
372    
373     static
374     oputm(r) /* print modifier */
375     register RAY *r;
376     {
377     if (r->ro != NULL)
378     fputs(objptr(r->ro->omod)->oname, stdout);
379     else
380     putchar('*');
381     putchar('\t');
382     }
383    
384    
385     static
386     puta(v) /* print ascii value */
387     double v;
388     {
389     printf("%e\t", v);
390     }
391    
392    
393     static
394     putd(v) /* print binary double */
395     double v;
396     {
397 greg 1.8 fwrite((char *)&v, sizeof(v), 1, stdout);
398 greg 1.1 }
399    
400    
401     static
402     putf(v) /* print binary float */
403     double v;
404     {
405     float f = v;
406    
407 greg 1.8 fwrite((char *)&f, sizeof(f), 1, stdout);
408 greg 1.1 }