--- ray/src/rt/virtuals.c 2012/09/14 13:34:02 2.20 +++ ray/src/rt/virtuals.c 2021/02/12 00:41:19 2.25 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: virtuals.c,v 2.20 2012/09/14 13:34:02 greg Exp $"; +static const char RCSid[] = "$Id: virtuals.c,v 2.25 2021/02/12 00:41:19 greg Exp $"; #endif /* * Routines for simulating virtual light sources @@ -11,19 +11,15 @@ static const char RCSid[] = "$Id: virtuals.c,v 2.20 20 #include "copyright.h" #include "ray.h" - #include "otypes.h" - +#include "otspecial.h" #include "source.h" - #include "random.h" #define MINSAMPLES 16 /* minimum number of pretest samples */ #define STESTMAX 32 /* maximum seeks per sample */ -#define FEQ(a,b) ((a)-(b)+FTINY >= 0 && (b)-(a)+FTINY >= 0) - static OBJECT *vobject; /* virtual source objects */ static int nvobjects = 0; /* number of virtual source objects */ @@ -35,7 +31,7 @@ isident4(MAT4 m) for (i = 4; i--; ) for (j = 4; j--; ) - if (!FEQ(m[i][j], i==j)) + if (!FABSEQ(m[i][j], i==j)) return(0); return(1); } @@ -141,7 +137,7 @@ vsmaterial( /* get virtual source material pointer * OBJREC *m; i = o->omod; - m = findmaterial(objptr(i)); + m = findmaterial(o); if (m == NULL) return(objptr(i)); if (m->otype != MAT_ILLUM || m->oargs.nsargs < 1 || @@ -324,7 +320,7 @@ vstestvis( /* pretest source visibility */ { RAY sr; FVECT onorm; - FVECT offsdir; + double offsdir[3]; SRCINDEX si; double or, d, d1; int stestlim, ssn; @@ -340,8 +336,7 @@ vstestvis( /* pretest source visibility */ /* 32. == heuristic constant */ n = 32.*or2/(thescene.cusize*thescene.cusize)*vspretest + .5; } else { - for (i = 0; i < 3; i++) - offsdir[i] = source[sn].sloc[i] - oc[i]; + VSUB(offsdir, source[sn].sloc, oc); d = DOT(offsdir,offsdir); if (d <= FTINY) n = 2.*PI * vspretest + .5; @@ -377,6 +372,7 @@ vstestvis( /* pretest source visibility */ sr.rorg[i] = oc[i] + offsdir[i] + d*onorm[i]; sr.rdir[i] = -onorm[i]; } + sr.rmax = 0.0; rayorigin(&sr, PRIMARY, NULL, NULL); } while (!(*ofun[o->otype].funp)(o, &sr)); /* check against source */