ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/dielectric.c
(Generate patch)

Comparing ray/src/rt/dielectric.c (file contents):
Revision 2.18 by schorsch, Tue Mar 30 16:13:01 2004 UTC vs.
Revision 2.20 by greg, Tue Apr 19 01:15:06 2005 UTC

# Line 74 | Line 74 | m_dielectric(  /* color a ray which hit a dielectric in
74          COLOR  ctrans;
75          COLOR  talb;
76          int  hastexture;
77 +        double  transdist, transtest=0;
78 +        double  mirdist, mirtest=0;
79 +        int     flatsurface;
80          double  refl, trans;
81          FVECT  dnorm;
82          double  d1, d2;
# Line 91 | Line 94 | m_dielectric(  /* color a ray which hit a dielectric in
94                  VCOPY(dnorm, r->ron);
95                  cos1 = r->rod;
96          }
97 +        flatsurface = !hastexture && r->ro != NULL && isflat(r->ro->otype);
98 +
99                                                  /* index of refraction */
100          if (m->otype == MAT_DIELECTRIC)
101                  nratio = m->oargs.farg[3] + m->oargs.farg[4]/MLAMBDA;
# Line 159 | Line 164 | m_dielectric(  /* color a ray which hit a dielectric in
164  
165                  trans *= nratio*nratio;         /* solid angle ratio */
166  
167 <                if (rayorigin(&p, r, REFRACTED, trans) == 0) {
167 >                setcolor(p.rcoef, trans, trans, trans);
168  
169 +                if (rayorigin(&p, REFRACTED, r, p.rcoef) == 0) {
170 +
171                                                  /* compute refracted ray */
172                          d1 = nratio*cos1 - cos2;
173                          for (i = 0; i < 3; i++)
# Line 187 | Line 194 | m_dielectric(  /* color a ray which hit a dielectric in
194                                  copycolor(p.cext, ctrans);
195                                  copycolor(p.albedo, talb);
196                                  rayvalue(&p);
197 <                                scalecolor(p.rcol, trans);
197 >                                multcolor(p.rcol, p.rcoef);
198                                  addcolor(r->rcol, p.rcol);
199 <                                if (nratio >= 1.0-FTINY && nratio <= 1.0+FTINY)
200 <                                        r->rt = r->rot + p.rt;
199 >                                                /* virtual distance */
200 >                                if (flatsurface ||
201 >                                        (1.-FTINY <= nratio &&
202 >                                                nratio <= 1.+FTINY)) {
203 >                                        transtest = 2*bright(p.rcol);
204 >                                        transdist = r->rot + p.rt;
205 >                                }
206                          }
207                  }
208          }
209 <                
209 >        setcolor(p.rcoef, refl, refl, refl);
210 >
211          if (!(r->crtype & SHADOW) &&
212 <                        rayorigin(&p, r, REFLECTED, refl) == 0) {
212 >                        rayorigin(&p, REFLECTED, r, p.rcoef) == 0) {
213  
214                                          /* compute reflected ray */
215                  for (i = 0; i < 3; i++)
# Line 208 | Line 221 | m_dielectric(  /* color a ray which hit a dielectric in
221  
222                  rayvalue(&p);                   /* reflected ray value */
223  
224 <                scalecolor(p.rcol, refl);       /* color contribution */
224 >                multcolor(p.rcol, p.rcoef);     /* color contribution */
225                  addcolor(r->rcol, p.rcol);
226 +                                                /* virtual distance */
227 +                if (flatsurface) {
228 +                        mirtest = 2*bright(p.rcol);
229 +                        mirdist = r->rot + p.rt;
230 +                }
231          }
232 +                                /* check distance to return */
233 +        d1 = bright(r->rcol);
234 +        if (transtest > d1)
235 +                r->rt = transdist;
236 +        else if (mirtest > d1)
237 +                r->rt = mirdist;
238                                  /* rayvalue() computes absorption */
239          return(1);
240   }
# Line 228 | Line 252 | disperse(  /* check light sources for dispersion */
252          COLOR  abt
253   )
254   {
255 <        RAY  sray, *entray;
255 >        RAY  sray;
256 >        const RAY  *entray;
257          FVECT  v1, v2, n1, n2;
258          FVECT  dv, v2Xdv;
259          double  v2Xdvv2Xdv;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines