--- ray/src/rt/ambient.c 2016/04/24 16:21:32 2.102 +++ ray/src/rt/ambient.c 2018/01/09 05:01:15 2.105 @@ -1,4 +1,4 @@ -static const char RCSid[] = "$Id: ambient.c,v 2.102 2016/04/24 16:21:32 greg Exp $"; +static const char RCSid[] = "$Id: ambient.c,v 2.105 2018/01/09 05:01:15 greg Exp $"; /* * ambient.c - routines dealing with ambient (inter-reflected) component. * @@ -12,8 +12,10 @@ static const char RCSid[] = "$Id: ambient.c,v 2.102 20 #include "platform.h" #include "ray.h" #include "otypes.h" +#include "otspecial.h" #include "resolu.h" #include "ambient.h" +#include "source.h" #include "random.h" #include "pmapamb.h" @@ -276,7 +278,7 @@ multambient( /* compute ambient component & multiply { static int rdepth = 0; /* ambient recursion */ COLOR acol, caustic; - int ok; + int i, ok; double d, l; /* PMAP: Factor in ambient from photon map, if enabled and ray is @@ -302,13 +304,27 @@ multambient( /* compute ambient component & multiply goto dumbamb; if (ambacc <= FTINY) { /* no ambient storage */ + FVECT uvd[2]; + float dgrad[2], *dgp = NULL; + + if (nrm != r->ron && DOT(nrm,r->ron) < 0.9999) + dgp = dgrad; /* compute rotational grad. */ copycolor(acol, aval); rdepth++; ok = doambient(acol, r, r->rweight, - NULL, NULL, NULL, NULL, NULL); + uvd, NULL, NULL, dgp, NULL); rdepth--; if (!ok) goto dumbamb; + if ((ok > 0) & (dgp != NULL)) { /* apply texture */ + FVECT v1; + VCROSS(v1, r->ron, nrm); + d = 1.0; + for (i = 3; i--; ) + d += v1[i] * (dgp[0]*uvd[0][i] + dgp[1]*uvd[1][i]); + if (d >= 0.05) + scalecolor(acol, d); + } copycolor(aval, acol); /* PMAP: add in caustic */ @@ -401,7 +417,8 @@ plugaleak(RAY *r, AMBVAL *ap, FVECT anorm, double ang) VSUM(rtst.rdir, vdif, anorm, t[1]); /* further dist. > plane */ rtst.rmax = normalize(rtst.rdir); /* short ray test */ while (localhit(&rtst, &thescene)) { /* check for occluder */ - if (rtst.ro->omod != OVOID && + OBJREC *m = findmaterial(rtst.ro); + if (m != NULL && !istransp(m->otype) && !isBSDFproxy(m) && (rtst.clipset == NULL || !inset(rtst.clipset, rtst.ro->omod))) return(1); /* plug light leak */ @@ -1313,10 +1330,10 @@ ambsync(void) /* synchronize ambient file */ if ((flen = lseek(fileno(ambfp), (off_t)0, SEEK_END)) < 0) goto seekerr; if ((n = flen - lastpos) > 0) { /* file has grown */ - if (ambinp == NULL) { /* use duplicate filedes */ - ambinp = fdopen(dup(fileno(ambfp)), "r"); + if (ambinp == NULL) { /* get new file pointer */ + ambinp = fopen(ambfile, "rb"); if (ambinp == NULL) - error(SYSTEM, "fdopen failed in ambsync"); + error(SYSTEM, "fopen failed in ambsync"); } if (fseek(ambinp, lastpos, SEEK_SET) < 0) goto seekerr; @@ -1331,24 +1348,18 @@ ambsync(void) /* synchronize ambient file */ avstore(&avs); n -= AMBVALSIZ; } - lastpos = flen - n; - /*** seek always as safety measure - if (n) ***/ /* alignment */ - if (lseek(fileno(ambfp), (off_t)lastpos, SEEK_SET) < 0) - goto seekerr; + lastpos = flen - n; /* check alignment */ + if (n && lseek(fileno(ambfp), (off_t)lastpos, SEEK_SET) < 0) + goto seekerr; } n = fflush(ambfp); /* calls write() at last */ - if (n != EOF) - lastpos += (long)nunflshed*AMBVALSIZ; - else if ((lastpos = lseek(fileno(ambfp), (off_t)0, SEEK_CUR)) < 0) - goto seekerr; - + lastpos += (long)nunflshed*AMBVALSIZ; aflock(F_UNLCK); /* release file */ nunflshed = 0; return(n); seekerr: error(SYSTEM, "seek failed in ambsync"); - return -1; /* pro forma return */ + return(EOF); /* pro forma return */ } #else /* ! F_SETLKW */