--- ray/src/rt/virtuals.c 2010/10/28 09:38:46 2.18 +++ 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.18 2010/10/28 09:38:46 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,11 +11,9 @@ static const char RCSid[] = "$Id: virtuals.c,v 2.18 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 */ @@ -26,11 +24,24 @@ static OBJECT *vobject; /* virtual source objects */ static int nvobjects = 0; /* number of virtual source objects */ -extern void +static int +isident4(MAT4 m) +{ + int i, j; + + for (i = 4; i--; ) + for (j = 4; j--; ) + if (!FABSEQ(m[i][j], i==j)) + return(0); + return(1); +} + + +void markvirtuals(void) /* find and mark virtual sources */ { - register OBJREC *o; - register int i; + OBJREC *o; + int i; /* check number of direct relays */ if (directrelay <= 0) return; @@ -69,13 +80,13 @@ markvirtuals(void) /* find and mark virtual sources } -extern void +void addvirtuals( /* add virtuals associated with source */ int sn, int nr ) { - register int i; + int i; /* check relay limit first */ if (nr <= 0) return; @@ -88,15 +99,15 @@ addvirtuals( /* add virtuals associated with source * } -extern void +void vproject( /* create projected source(s) if they exist */ OBJREC *o, int sn, int n ) { - register int i; - register VSMATERIAL *vsmat; + int i; + VSMATERIAL *vsmat; MAT4 proj; int ns; @@ -117,16 +128,16 @@ vproject( /* create projected source(s) if they exist } -extern OBJREC * +OBJREC * vsmaterial( /* get virtual source material pointer */ OBJREC *o ) { - register int i; - register OBJREC *m; + int i; + 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 || @@ -137,10 +148,10 @@ vsmaterial( /* get virtual source material pointer * } -extern int +int makevsrc( /* make virtual source if reasonable */ OBJREC *op, - register int sn, + int sn, MAT4 pm ) { @@ -148,8 +159,10 @@ makevsrc( /* make virtual source if reasonable */ double maxrad2, d; int nsflags; SPOT theirspot, ourspot; - register int i; - + int i; + /* check for no-op */ + if (isident4(pm)) + return(0); nsflags = source[sn].sflags | (SVIRTUAL|SSPOT|SFOLLOW); /* get object center and max. radius */ maxrad2 = getdisk(ocent, op, sn); @@ -263,11 +276,11 @@ memerr: } -extern double +double getdisk( /* get visible object disk */ FVECT oc, OBJREC *op, - register int sn + int sn ) { double rad2, roffs, offs, d, rd, rdoto; @@ -296,23 +309,23 @@ getdisk( /* get visible object disk */ } -extern int +int vstestvis( /* pretest source visibility */ int f, /* virtual source flags */ OBJREC *o, /* relay object */ FVECT oc, /* relay object center */ double or2, /* relay object radius squared */ - register int sn /* target source number */ + int sn /* target source number */ ) { RAY sr; FVECT onorm; - FVECT offsdir; + double offsdir[3]; SRCINDEX si; double or, d, d1; int stestlim, ssn; int nhit, nok; - register int i, n; + int i, n; /* return if pretesting disabled */ if (vspretest <= 0) return(f); @@ -323,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; @@ -360,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 */ @@ -410,14 +423,12 @@ vstestvis( /* pretest source visibility */ #ifdef DEBUG -extern void +void virtverb( /* print verbose description of virtual source */ - register int sn, + int sn, FILE *fp ) { - register int i; - fprintf(fp, "%s virtual source %d in %s %s\n", source[sn].sflags & SDISTANT ? "distant" : "local", sn, ofun[source[sn].so->otype].funame,