--- ray/src/rt/rtrace.c 1990/01/04 11:16:05 1.7 +++ ray/src/rt/rtrace.c 1991/07/18 14:43:03 1.18 @@ -20,14 +20,22 @@ static char SCCSid[] = "$SunId$ LBL"; * All values default to ascii representation of real * numbers. Binary representations can be selected * with '-ff' for float or '-fd' for double. By default, - * radiance is computed. The '-i' option indicates that + * radiance is computed. The '-i' or '-I' options indicate that * irradiance values are desired. */ #include "ray.h" +#include "octree.h" + #include "otypes.h" +int dimlist[MAXDIM]; /* sampling dimensions */ +int ndims = 0; /* number of sampling dimensions */ +int samplendx = 0; /* index for this sample */ + +int imm_irrad = 0; /* compute immediate irradiance? */ + int inform = 'a'; /* input format */ int outform = 'a'; /* output format */ char *outvals = "v"; /* output specification */ @@ -38,6 +46,9 @@ int vresolu = 0; /* vertical resolution */ double dstrsrc = 0.0; /* square source distribution */ double shadthresh = .05; /* shadow threshold */ double shadcert = .5; /* shadow certainty */ +int directrelay = 0; /* number of source relays */ +int vspretest = 512; /* virtual source pretest density */ +int directinvis = 0; /* sources invisible? */ int maxdepth = 6; /* maximum recursion depth */ double minweight = 4e-3; /* minimum ray weight */ @@ -51,14 +62,17 @@ int ambounce = 0; /* ambient bounces */ char *amblist[128]; /* ambient include/exclude list */ int ambincl = -1; /* include == 1, exclude == 0 */ +extern OBJREC Lamb; /* a Lambertian surface */ + 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)(); @@ -99,11 +113,12 @@ char *fname; fflush(stdout); continue; } + samplendx++; /* compute and print */ - if (outvals[0] == 'i') + if (imm_irrad) irrad(orig, direc); else - radiance(orig, direc); + traceray(orig, direc); /* flush if time */ if (--nextflush == 0) { fflush(stdout); @@ -126,12 +141,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; @@ -141,9 +158,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; @@ -165,7 +184,7 @@ register char *vs; } -radiance(org, dir) /* compute radiance value */ +traceray(org, dir) /* compute and print ray value(s) */ FVECT org, dir; { register int (**tp)(); @@ -173,7 +192,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; @@ -184,14 +206,9 @@ FVECT org, dir; } -irrad(org, dir) /* compute irradiance value */ +irrad(org, dir) /* compute immediate irradiance value */ FVECT org, dir; { - static double Lambfa[5] = {PI, PI, PI, 0.0, 0.0}; - static OBJREC Lamb = { - OVOID, MAT_PLASTIC, "Lambertian", - {0, 5, NULL, Lambfa}, NULL, -1, - }; register int i; for (i = 0; i < 3; i++) { @@ -226,12 +243,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; } @@ -299,10 +316,7 @@ static oputl(r) /* print length */ register RAY *r; { - if (r->rot < FHUGE) - (*putreal)(r->rot); - else - (*putreal)(0.0); + (*putreal)(r->rt); } @@ -382,7 +396,7 @@ static putd(v) /* print binary double */ double v; { - fwrite(&v, sizeof(v), 1, stdout); + fwrite((char *)&v, sizeof(v), 1, stdout); } @@ -392,5 +406,5 @@ double v; { float f = v; - fwrite(&f, sizeof(f), 1, stdout); + fwrite((char *)&f, sizeof(f), 1, stdout); }