home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 8 / CDASC08.ISO / NEWS / RADIANCE / SRC / RT / MX_FUNC.C < prev    next >
C/C++ Source or Header  |  1993-10-07  |  1KB  |  61 lines

  1. /* Copyright (c) 1991 Regents of the University of California */
  2.  
  3. #ifndef lint
  4. static char SCCSid[] = "@(#)mx_func.c 2.2 11/25/91 LBL";
  5. #endif
  6.  
  7. /*
  8.  *  mx_func.c - routine for mixture functions.
  9.  *
  10.  *     11/2/88
  11.  */
  12.  
  13. #include  "ray.h"
  14.  
  15. #include  "func.h"
  16.  
  17. /*
  18.  *    A mixture function is specified:
  19.  *
  20.  *    modifier mixfunc name
  21.  *    4+ foremod backmod varname vfname xf
  22.  *    0
  23.  *    n A1 A2 ..
  24.  *
  25.  *  Vfname is the name of the file where the variable definition
  26.  *  can be found.  The list of real arguments can be accessed by
  27.  *  definitions in the file.  The xf is a transformation
  28.  *  to get from the original coordinates to the current coordinates.
  29.  */
  30.  
  31.  
  32. mx_func(m, r)            /* compute mixture function */
  33. register OBJREC  *m;
  34. RAY  *r;
  35. {
  36.     register int  i;
  37.     double  coef;
  38.     OBJECT  mod[2];
  39.     register MFUNC  *mf;
  40.  
  41.     if (m->oargs.nsargs < 4)
  42.         objerror(m, USER, "bad # arguments");
  43.     for (i = 0; i < 2; i++)
  44.         if (!strcmp(m->oargs.sarg[i], VOIDID))
  45.             mod[i] = OVOID;
  46.         else if ((mod[i] = modifier(m->oargs.sarg[i])) == OVOID) {
  47.             sprintf(errmsg, "undefined modifier \"%s\"",
  48.                     m->oargs.sarg[i]);
  49.             objerror(m, USER, errmsg);
  50.         }
  51.     mf = getfunc(m, 3, 0x4, 0);
  52.     setfunc(m, r);
  53.     errno = 0;
  54.     coef = evalue(mf->ep[0]);
  55.     if (errno) {
  56.         objerror(m, WARNING, "compute error");
  57.         return;
  58.     }
  59.     raymixture(r, mod[0], mod[1], coef);
  60. }
  61.