--- ray/src/rt/rtrace.c 1997/01/14 19:54:27 2.23 +++ ray/src/rt/rtrace.c 1997/10/17 10:14:37 2.25 @@ -1,7 +1,7 @@ -/* Copyright (c) 1995 Regents of the University of California */ +/* Copyright (c) 1997 Silicon Graphics, Inc. */ #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static char SCCSid[] = "$SunId$ SGI"; #endif /* @@ -37,6 +37,7 @@ int ndims = 0; /* number of sampling dimensions */ int samplendx = 0; /* index for this sample */ int imm_irrad = 0; /* compute immediate irradiance? */ +int lim_dist = 0; /* limit distance? */ int inform = 'a'; /* input format */ int outform = 'a'; /* output format */ @@ -82,7 +83,9 @@ char *amblist[128]; /* ambient include/exclude list int ambincl = -1; /* include == 1, exclude == 0 */ extern OBJREC Lamb; /* a Lambertian surface */ +extern OBJREC Aftplane; /* aft clipping object */ + static RAY thisray; /* for our convenience */ static int oputo(), oputd(), oputv(), oputl(), oputL(), @@ -128,6 +131,7 @@ char *fname; long vcount = hresolu>1 ? hresolu*vresolu : vresolu; long nextflush = hresolu; FILE *fp; + double d; FVECT orig, direc; /* set up input */ if (fname == NULL) @@ -162,20 +166,25 @@ char *fname; while (getvec(orig, inform, fp) == 0 && getvec(direc, inform, fp) == 0) { - if (normalize(direc) == 0.0) { /* zero ==> flush */ - fflush(stdout); - continue; - } - samplendx++; + d = normalize(direc); + if (d == 0.0) { /* zero ==> flush */ + bogusray(); + if (--nextflush <= 0) { + fflush(stdout); + nextflush = hresolu; + } + } else { + samplendx++; /* compute and print */ - if (imm_irrad) - irrad(orig, direc); - else - rad(orig, direc); + if (imm_irrad) + irrad(orig, direc); + else + rad(orig, direc, lim_dist ? d : 0.0); /* flush if time */ - if (--nextflush == 0) { - fflush(stdout); - nextflush = hresolu; + if (--nextflush == 0) { + fflush(stdout); + nextflush = hresolu; + } } if (ferror(stdout)) error(SYSTEM, "write error"); @@ -246,16 +255,31 @@ register char *vs; } -rad(org, dir) /* compute and print ray value(s) */ +bogusray() /* print out empty record */ +{ + thisray.rorg[0] = thisray.rorg[1] = thisray.rorg[2] = + thisray.rdir[0] = thisray.rdir[1] = thisray.rdir[2] = 0.0; + rayorigin(&thisray, NULL, PRIMARY, 1.0); + printvals(&thisray); +} + + +rad(org, dir, dmax) /* compute and print ray value(s) */ FVECT org, dir; +double dmax; { VCOPY(thisray.rorg, org); VCOPY(thisray.rdir, dir); - thisray.rmax = 0.0; + thisray.rmax = dmax; rayorigin(&thisray, NULL, PRIMARY, 1.0); - if (castonly) - localhit(&thisray, &thescene) || sourcehit(&thisray); - else + if (castonly) { + if (!localhit(&thisray, &thescene)) + if (thisray.ro == &Aftplane) { /* clipped */ + thisray.ro = NULL; + thisray.rot = FHUGE; + } else + sourcehit(&thisray); + } else rayvalue(&thisray); printvals(&thisray); }