ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/rtrace.c
Revision: 1.6
Committed: Mon Jul 10 15:21:28 1989 UTC (34 years, 9 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.5: +1 -1 lines
Log Message:
Reduced default ambient resolution

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