--- ray/src/rt/rtrace.c 1989/06/13 10:57:43 1.5 +++ ray/src/rt/rtrace.c 1990/08/18 10:34:47 1.11 @@ -16,6 +16,7 @@ static char SCCSid[] = "$SunId$ LBL"; * xorg yorg zorg xdir ydir zdir * * The direction need not be normalized. Output is flexible. + * If the direction vector is (0,0,0), then the output is flushed. * All values default to ascii representation of real * numbers. Binary representations can be selected * with '-ff' for float or '-fd' for double. By default, @@ -25,6 +26,8 @@ static char SCCSid[] = "$SunId$ LBL"; #include "ray.h" +#include "octree.h" + #include "otypes.h" int inform = 'a'; /* input format */ @@ -43,7 +46,7 @@ double minweight = 4e-3; /* minimum ray weight */ COLOR ambval = BLKCOLOR; /* ambient value */ double ambacc = 0.2; /* ambient accuracy */ -int ambres = 128; /* ambient resolution */ +int ambres = 32; /* ambient resolution */ int ambdiv = 128; /* ambient divisions */ int ambssamp = 0; /* ambient super-samples */ int ambounce = 0; /* ambient bounces */ @@ -52,12 +55,13 @@ int ambincl = -1; /* include == 1, exclude == 0 */ static RAY thisray; /* for our convenience */ -extern int oputo(), oputd(), oputv(), oputl(), +static int oputo(), oputd(), oputv(), oputl(), oputp(), oputn(), oputs(), oputw(), oputm(); static int (*ray_out[10])(), (*every_out[10])(); +static int castonly; -extern int puta(), putf(), putd(); +static int puta(), putf(), putd(); static int (*putreal)(); @@ -94,14 +98,16 @@ char *fname; while (getvec(orig, inform, fp) == 0 && getvec(direc, inform, fp) == 0) { - if (normalize(direc) == 0.0) - error(USER, "zero direction vector"); + if (normalize(direc) == 0.0) { /* zero ==> flush */ + fflush(stdout); + continue; + } /* compute and print */ if (outvals[0] == 'i') irrad(orig, direc); else radiance(orig, direc); - /* flush if requested */ + /* flush if time */ if (--nextflush == 0) { fflush(stdout); nextflush = hresolu; @@ -123,12 +129,14 @@ register char *vs; extern int ourtrace(), (*trace)(); register int (**table)() = ray_out; + castonly = 1; while (*vs) switch (*vs++) { case 't': /* trace */ *table = NULL; table = every_out; trace = ourtrace; + castonly = 0; break; case 'o': /* origin */ *table++ = oputo; @@ -138,9 +146,11 @@ register char *vs; break; case 'v': /* value */ *table++ = oputv; + castonly = 0; break; case 'l': /* length */ *table++ = oputl; + castonly = 0; break; case 'p': /* point */ *table++ = oputp; @@ -170,7 +180,10 @@ FVECT org, dir; VCOPY(thisray.rorg, org); VCOPY(thisray.rdir, dir); rayorigin(&thisray, NULL, PRIMARY, 1.0); - rayvalue(&thisray); + if (castonly) + localhit(&thisray, &thescene) || sourcehit(&thisray); + else + rayvalue(&thisray); if (ray_out[0] == NULL) return; @@ -223,12 +236,12 @@ FILE *fp; return(-1); break; case 'f': /* binary float */ - if (fread(vf, sizeof(float), 3, fp) != 3) + if (fread((char *)vf, sizeof(float), 3, fp) != 3) return(-1); vec[0] = vf[0]; vec[1] = vf[1]; vec[2] = vf[2]; break; case 'd': /* binary double */ - if (fread(vec, sizeof(double), 3, fp) != 3) + if (fread((char *)vec, sizeof(double), 3, fp) != 3) return(-1); break; } @@ -296,10 +309,7 @@ static oputl(r) /* print length */ register RAY *r; { - if (r->rot < FHUGE) - (*putreal)(r->rot); - else - (*putreal)(0.0); + (*putreal)(r->rt); } @@ -379,7 +389,7 @@ static putd(v) /* print binary double */ double v; { - fwrite(&v, sizeof(v), 1, stdout); + fwrite((char *)&v, sizeof(v), 1, stdout); } @@ -389,5 +399,5 @@ double v; { float f = v; - fwrite(&f, sizeof(f), 1, stdout); + fwrite((char *)&f, sizeof(f), 1, stdout); }