home *** CD-ROM | disk | FTP | other *** search
/ Garbo / Garbo.cdr / mac / util / raytracr.sit / refract.c.bin / refract.c
Encoding:
C/C++ Source or Header  |  1988-11-15  |  2.9 KB  |  133 lines  |  [TEXT/KAHL]

  1. #define _MC68881_
  2.  
  3. #include <math.h>
  4. #include "rtd.h"
  5. #include "macros.h"
  6. #include "extern.h"
  7.  
  8. int    rlev;
  9. int     refract (r, bll)
  10. struct ray *r;
  11. struct ball *bll;
  12. {
  13.     struct vector   new,
  14.                     norm;
  15.     struct mat  trans;
  16.     struct ray  ir;
  17.     double  l,
  18.             refk (), getcapt (), capt, inside ();
  19.     double  stupid;
  20.     struct sphere   ss;
  21.  
  22.     SV (norm, r -> org, bll -> s.cent);
  23.     norm.l = bll-> s.rad;
  24.  
  25.     capt = getcapt (&norm, &(r -> dir), bll -> ior);
  26.  
  27.  
  28. /* get the addition factor for the normal for refraction*/
  29.     stupid = refk (&(norm), &(r -> dir), bll -> ior);
  30.     SCMLT (stupid, norm);
  31.  
  32.     AV (ir.dir, r -> dir, norm);
  33.     MV (r -> org.x, r -> org.y, r -> org.z, ir.org);
  34.  
  35. /* now get it for reflection */
  36.     SV (norm, r -> org, bll -> s.cent);
  37.     norm.l = bll -> s.rad;
  38.     SCMLT (1.0 / norm.l, norm);
  39.     stupid = 2.0 * DOT (norm, r -> dir);
  40.     SCMLT (stupid, norm);
  41.     SV (r -> dir, r -> dir, norm);
  42.  
  43.     return ((int) ((1.0 - capt) * (double) shade (r) + ((capt) * inside (&ir, bll))));
  44. }
  45.  
  46. double  inside (r, bll)
  47. struct ray *r;
  48. struct ball *bll;
  49. {
  50.     struct vector   new,
  51.                     norm;
  52.     struct mat  trans;
  53.     struct ray  er;
  54.     double  findo (), lght, l, refk (), getcapt (), capt;
  55.     double  stupid;
  56.     struct sphere   ss;
  57.  
  58.  
  59.     if (++rlev < RLEV) {
  60.     r -> dir.l = LEN (r -> dir);
  61.     r -> dir.xzl = XZL (r -> dir);
  62.     mt (&(r -> dir), &trans);
  63.     ss.rad = bll -> s.rad;
  64.     SV (ss.cent, bll -> s.cent, r -> org);
  65.  
  66.     l = findo (&trans, &ss);
  67.     MV (l * trans.x.x, l * trans.x.y, l * trans.x.z, new);
  68.     AV (er.org, r -> org, new);
  69.     AV (r -> org, r -> org, new);
  70.     SV (norm, er.org, bll -> s.cent);
  71.  
  72.     norm.l = bll -> s.rad;
  73.     capt = getcapt (&norm, &(r -> dir), 1.0 / bll -> ior);
  74.  
  75.     stupid = refk (&norm, &(r -> dir), 1.0 / bll -> ior);
  76.     SCMLT (stupid, norm);
  77.     AV (er.dir, norm, r -> dir);
  78.  
  79.     SCMLT (1.0 / norm.l, norm);
  80.     stupid = 2.0 * DOT (norm, r -> dir);
  81.     SCMLT (stupid, norm);
  82.     SV (r -> dir, r -> dir, norm);
  83.     lght = (1.0 - capt) * inside (r, bll) + (capt * (double) shade (&er));
  84.     }
  85.     else
  86.     lght = 0.0;
  87.     rlev--;
  88.      if (lght<0.0) lght=0.0;
  89.      if (lght>255.0) lght=255.0;
  90.     return (lght);
  91. }
  92.  
  93.  
  94.  
  95. double  refk (nrm, in, ior)
  96. struct vector  *nrm,
  97.                *in;
  98. double  ior;
  99. {
  100.     double  dt,
  101.             ln,
  102.             li,
  103.             ret;
  104.  
  105.     ior = ior * ior;
  106.     dt = DOT ((*nrm), (*in));
  107.     ln = LN2 ((*nrm));
  108.     li = LN2 ((*in));
  109.     if (dt < 0)
  110.     ret = (-dt - sqrt (dt * dt - ln * li * (1 - ior))) / ln;
  111.     else
  112.     ret = (-dt + sqrt (dt * dt - ln * li * (1 - ior))) / ln;
  113.     return (ret);
  114. }
  115.  
  116. double  getcapt (nrm, dr, ior)
  117. struct vector  *nrm,
  118.                *dr;
  119. double  ior;
  120. {
  121.     double  dt,
  122.             cs1,
  123.             cs2,
  124.             p,
  125.             s;
  126.     dt = DOT ((*nrm), (*dr));
  127.     dt = dt * dt / LN2 ((*nrm)) / LN2 ((*dr));
  128.     cs1 = sqrt (dt);
  129.     cs2 = sqrt (1.0 - (1.0 - dt) / ior);
  130.     p = cs1 / (cs1 + ior * cs2);
  131.     s = cs1 / (ior * cs1 + cs2);
  132.     return (2.0 * (p * p + s * s));
  133. }