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.13 by gwlarson, Wed Jun 17 12:53:07 1998 UTC vs.
Revision 2.14 by gwlarson, Fri Jun 19 12:01:15 1998 UTC

# Line 73 | Line 73 | register RAY  *r;
73          double  cos1, cos2, nratio;
74          COLOR  ctrans;
75          COLOR  talb;
76 +        int  hastexture;
77          double  refl, trans;
78          FVECT  dnorm;
79          double  d1, d2;
# Line 84 | Line 85 | register RAY  *r;
85  
86          raytexture(r, m->omod);                 /* get modifiers */
87  
88 <        cos1 = raynormal(dnorm, r);             /* cosine of theta1 */
88 >        if (hastexture = DOT(r->pert,r->pert) > FTINY*FTINY)
89 >                cos1 = raynormal(dnorm, r);     /* perturb normal */
90 >        else {
91 >                VCOPY(dnorm, r->ron);
92 >                cos1 = r->rod;
93 >        }
94                                                  /* index of refraction */
95          if (m->otype == MAT_DIELECTRIC)
96                  nratio = m->oargs.farg[3] + m->oargs.farg[4]/MLAMBDA;
# Line 92 | Line 98 | register RAY  *r;
98                  nratio = m->oargs.farg[3] / m->oargs.farg[7];
99          
100          if (cos1 < 0.0) {                       /* inside */
101 +                hastexture = -hastexture;
102                  cos1 = -cos1;
103                  dnorm[0] = -dnorm[0];
104                  dnorm[1] = -dnorm[1];
# Line 156 | Line 163 | register RAY  *r;
163                          d1 = nratio*cos1 - cos2;
164                          for (i = 0; i < 3; i++)
165                                  p.rdir[i] = nratio*r->rdir[i] + d1*dnorm[i];
166 <
166 >                                                /* accidental reflection? */
167 >                        if (hastexture &&
168 >                                DOT(p.rdir,r->ron)*hastexture >= -FTINY) {
169 >                                d1 *= (double)hastexture;
170 >                                for (i = 0; i < 3; i++) /* ignore texture */
171 >                                        p.rdir[i] = nratio*r->rdir[i] +
172 >                                                        d1*r->ron[i];
173 >                                normalize(p.rdir);      /* not exact */
174 >                        }
175   #ifdef  DISPERSE
176                          if (m->otype != MAT_DIELECTRIC
177                                          || r->rod > 0.0
# Line 184 | Line 199 | register RAY  *r;
199                                          /* compute reflected ray */
200                  for (i = 0; i < 3; i++)
201                          p.rdir[i] = r->rdir[i] + 2.0*cos1*dnorm[i];
202 +                                        /* accidental penetration? */
203 +                if (hastexture && DOT(p.rdir,r->ron)*hastexture <= FTINY)
204 +                        for (i = 0; i < 3; i++)         /* ignore texture */
205 +                                p.rdir[i] = r->rdir[i] + 2.0*r->rod*r->ron[i];
206  
207                  rayvalue(&p);                   /* reflected ray value */
208  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines