--- ray/src/common/jitteraperture.c 2021/12/15 01:38:50 2.2 +++ ray/src/common/jitteraperture.c 2022/01/14 22:57:40 2.3 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: jitteraperture.c,v 2.2 2021/12/15 01:38:50 greg Exp $"; +static const char RCSid[] = "$Id: jitteraperture.c,v 2.3 2022/01/14 22:57:40 greg Exp $"; #endif /* * jitteraperture.c - routine to sample depth-of-field @@ -24,7 +24,7 @@ double dia ) { RREAL df[2]; - double vc; + double adj; int i; /* are we even needed? */ if (dia <= FTINY) @@ -33,32 +33,40 @@ double dia square2disk(df, frandom(), frandom()); df[0] *= .5*dia; df[1] *= .5*dia; + if ((v->type == VT_PER) | (v->type == VT_PAR)) { - double adj = 1.0; /* basic view cases */ + adj = 1.0; /* basic view cases */ if (v->type == VT_PER) adj /= DOT(direc, v->vdir); df[0] /= sqrt(v->hn2); df[1] /= sqrt(v->vn2); for (i = 3; i--; ) { - vc = v->vp[i] + adj*v->vdist*direc[i]; - orig[i] += df[0]*v->hvec[i] + + orig[i] = v->vp[i] + df[0]*v->hvec[i] + df[1]*v->vvec[i] ; - direc[i] = vc - orig[i]; + direc[i] = v->vp[i] + adj*v->vdist*direc[i] + - orig[i]; } } else { /* difficult view cases */ - double dfd = PI/4.*dia*(.5 - frandom()); + adj = PI/4.*dia*(.5 - frandom()); if ((v->type != VT_ANG) & (v->type != VT_PLS)) { if (v->type != VT_CYL) df[0] /= sqrt(v->hn2); df[1] /= sqrt(v->vn2); } for (i = 3; i--; ) { - vc = v->vp[i] + v->vdist*direc[i]; - orig[i] += df[0]*v->hvec[i] + + orig[i] = v->vp[i] + df[0]*v->hvec[i] + df[1]*v->vvec[i] + - dfd*v->vdir[i] ; - direc[i] = vc - orig[i]; + adj*v->vdir[i] ; + direc[i] = v->vp[i] + v->vdist*direc[i] + - orig[i]; } } - return(normalize(direc) != 0.0); + if (normalize(direc) == 0.0) + return(0); + if ((adj = v->vfore) <= FTINY) + return(1); + if (v->type == VT_PER) + adj /= DOT(direc, v->vdir); + VSUM(orig, orig, direc, adj); + return(1); }