Back to index

radiance  4R0+20100331
Defines | Functions | Variables
glass.c File Reference
#include "copyright.h"
#include "ray.h"
#include "otypes.h"
#include "rtotypes.h"

Go to the source code of this file.

Defines

#define RINDEX   1.52 /* refractive index of glass */

Functions

int m_glass (OBJREC *m, register RAY *r)

Variables

static const char RCSid [] = "$Id: glass.c,v 2.17 2005/06/21 15:06:50 greg Exp $"

Define Documentation

#define RINDEX   1.52 /* refractive index of glass */

Definition at line 41 of file glass.c.


Function Documentation

int m_glass ( OBJREC m,
register RAY r 
)

Definition at line 45 of file glass.c.

{
       COLOR  mcolor;
       double  pdot;
       FVECT  pnorm;
       double  rindex, cos2;
       COLOR  trans, refl;
       int  hastexture, hastrans;
       double  d, r1e, r1m;
       double  transtest, transdist;
       double  mirtest, mirdist;
       RAY  p;
       register int  i;
                                          /* check arguments */
       if (m->oargs.nfargs == 3)
              rindex = RINDEX;            /* default value of n */
       else if (m->oargs.nfargs == 4)
              rindex = m->oargs.farg[3];  /* use their value */
       else
              objerror(m, USER, "bad arguments");
                                          /* check transmission */
       setcolor(mcolor, m->oargs.farg[0], m->oargs.farg[1], m->oargs.farg[2]);
       if ((hastrans = (intens(mcolor) > 1e-15))) {
              for (i = 0; i < 3; i++)
                     if (colval(mcolor,i) < 1e-15)
                            colval(mcolor,i) = 1e-15;
       } else if (r->crtype & SHADOW)
              return(1);
                                          /* get modifiers */
       raytexture(r, m->omod);
       if (r->rod < 0.0)                  /* reorient if necessary */
              flipsurface(r);
       mirtest = transtest = 0;
       mirdist = transdist = r->rot;
                                          /* perturb normal */
       if ( (hastexture = (DOT(r->pert,r->pert) > FTINY*FTINY)) ) {
              pdot = raynormal(pnorm, r);
       } else {
              VCOPY(pnorm, r->ron);
              pdot = r->rod;
       }
                                          /* angular transmission */
       cos2 = sqrt( (1.0-1.0/(rindex*rindex)) +
                   pdot*pdot/(rindex*rindex) );
       if (hastrans)
              setcolor(mcolor, pow(colval(mcolor,RED), 1.0/cos2),
                             pow(colval(mcolor,GRN), 1.0/cos2),
                             pow(colval(mcolor,BLU), 1.0/cos2));

                                          /* compute reflection */
       r1e = (pdot - rindex*cos2) / (pdot + rindex*cos2);
       r1e *= r1e;
       r1m = (1.0/pdot - rindex/cos2) / (1.0/pdot + rindex/cos2);
       r1m *= r1m;
                                          /* compute transmission */
       if (hastrans) {
              for (i = 0; i < 3; i++) {
                     d = colval(mcolor, i);
                     colval(trans,i) = .5*(1.0-r1e)*(1.0-r1e)*d /
                                                 (1.0-r1e*r1e*d*d);
                     colval(trans,i) += .5*(1.0-r1m)*(1.0-r1m)*d /
                                                 (1.0-r1m*r1m*d*d);
              }
              multcolor(trans, r->pcol);  /* modify by pattern */
                                          /* transmitted ray */
              if (rayorigin(&p, TRANS, r, trans) == 0) {
                     if (!(r->crtype & SHADOW) && hastexture) {
                            for (i = 0; i < 3; i++)     /* perturb direction */
                                   p.rdir[i] = r->rdir[i] +
                                          2.*(1.-rindex)*r->pert[i];
                            if (normalize(p.rdir) == 0.0) {
                                   objerror(m, WARNING, "bad perturbation");
                                   VCOPY(p.rdir, r->rdir);
                            }
                     } else {
                            VCOPY(p.rdir, r->rdir);
                            transtest = 2;
                     }
                     rayvalue(&p);
                     multcolor(p.rcol, p.rcoef);
                     addcolor(r->rcol, p.rcol);
                     transtest *= bright(p.rcol);
                     transdist = r->rot + p.rt;
              }
       }
       if (r->crtype & SHADOW) {          /* skip reflected ray */
              r->rt = transdist;
              return(1);
       }
                                          /* compute reflectance */
       for (i = 0; i < 3; i++) {
              d = colval(mcolor, i);
              d *= d;
              colval(refl,i) = .5*r1e*(1.0+(1.0-2.0*r1e)*d)/(1.0-r1e*r1e*d);
              colval(refl,i) += .5*r1m*(1.0+(1.0-2.0*r1m)*d)/(1.0-r1m*r1m*d);
       }
                                          /* reflected ray */
       if (rayorigin(&p, REFLECTED, r, refl) == 0) {
              for (i = 0; i < 3; i++)
                     p.rdir[i] = r->rdir[i] + 2.0*pdot*pnorm[i];
              rayvalue(&p);
              multcolor(p.rcol, p.rcoef);
              addcolor(r->rcol, p.rcol);
              if (!hastexture && r->ro != NULL && isflat(r->ro->otype)) {
                     mirtest = 2.0*bright(p.rcol);
                     mirdist = r->rot + p.rt;
              }
       }
                                        /* check distance */
       d = bright(r->rcol);
       if (transtest > d)
              r->rt = transdist;
       else if (mirtest > d)
              r->rt = mirdist;
       return(1);
}

Here is the call graph for this function:


Variable Documentation

const char RCSid[] = "$Id: glass.c,v 2.17 2005/06/21 15:06:50 greg Exp $" [static]

Definition at line 2 of file glass.c.