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

  1. /* Copyright (c) 1986 Regents of the University of California */
  2.  
  3. /* SCCSid "@(#)source.h 2.1 11/12/91 LBL" */
  4.  
  5. /*
  6.  *  source.h - header file for ray tracing sources.
  7.  *
  8.  *     8/20/85
  9.  */
  10.  
  11. #define  AIMREQT    100        /* required aim success/failure */
  12.  
  13. #define  SDISTANT    01        /* source distant flag */
  14. #define  SSKIP        02        /* source skip flag */
  15. #define  SPROX        04        /* source proximity flag */
  16. #define  SSPOT        010        /* source spotlight flag */
  17. #define  SVIRTUAL    020        /* source virtual flag */
  18. #define  SFLAT        040        /* source flat flag */
  19. #define  SCYL        0100        /* source cylindrical flag */
  20. #define  SFOLLOW    0200        /* source follow path flag */
  21.  
  22. typedef struct {
  23.     FVECT  aim;        /* aim direction or center */
  24.     float  siz;        /* output solid angle or area */
  25.     float  flen;        /* focal length */
  26. } SPOT;            /* spotlight */
  27.  
  28. typedef struct {
  29.     int  sflags;        /* source flags */
  30.     FVECT  sloc;        /* direction or position of source */
  31.     FVECT  ss[3];        /* source dimension vectors, U, V, and W */
  32.     float  srad;        /* maximum source radius */
  33.     float  ss2;        /* solid angle or projected area */
  34.     struct {
  35.         float  prox;        /* proximity */
  36.         SPOT  *s;        /* spot */
  37.     } sl;            /* localized source information */
  38.     union {
  39.         int  success;        /* successes - AIMREQT*failures */
  40.         struct {
  41.             short  pn;        /* projection number */
  42.             short  sn;        /* next source to aim for */
  43.         }  sv;            /* virtual source */
  44.     } sa;            /* source aiming information */
  45.     long  ntests, nhits;    /* shadow tests and hits */
  46.     OBJREC  *so;        /* source destination object */
  47. }  SRCREC;        /* light source */
  48.  
  49. #define MAXSPART    64        /* maximum partitions per source */
  50.  
  51. #define SU        0        /* U vector or partition */
  52. #define SV        1        /* V vector or partition */
  53. #define SW        2        /* W vector or partition */
  54. #define S0        3        /* leaf partition */
  55.  
  56. #define snorm        ss[SW]        /* normal vector for flat source */
  57.  
  58. typedef struct {
  59.     int  sn;                /* source number */
  60.     short  np;                /* number of partitions */
  61.     short  sp;                /* this partition number */
  62.     double  dom;                /* solid angle of partition */
  63.     unsigned char  spt[MAXSPART/2];        /* source partitioning */
  64. }  SRCINDEX;        /* source index structure */
  65.  
  66. #define initsrcindex(s)    ((s)->sn = (s)->sp = -1, (s)->np = 0)
  67.  
  68. #define clrpart(pt)    bzero((char *)(pt), MAXSPART/2)
  69. #define setpart(pt,i,v)    ((pt)[(i)>>2] |= (v)<<(((i)&3)<<1))
  70. #define spart(pt,pi)    ((pt)[(pi)>>2] >> (((pi)&3)<<1) & 3)
  71.  
  72. /*
  73.  * Special support functions for sources
  74.  */
  75.  
  76. /*
  77.  * Virtual source materials must define the following.
  78.  *
  79.  *    vproj(pm, op, sp, i)    Compute i'th virtual projection
  80.  *                of source sp in object op and assign
  81.  *                the 4x4 transformation matrix pm.
  82.  *                Return 1 on success, 0 if no i'th projection.
  83.  *
  84.  *    nproj            The number of projections.  The value of
  85.  *                i passed to vproj runs from 0 to nproj-1.
  86.  */
  87.  
  88. typedef struct {
  89.     int  (*vproj)();    /* project virtual sources */
  90.     int  nproj;        /* number of possible projections */
  91. } VSMATERIAL;        /* virtual source material functions */
  92.  
  93. typedef struct {
  94.     int    (*setsrc)();    /* set light source for object */
  95.     int    (*partit)();    /* partition light source object */
  96.     double  (*getpleq)();    /* plane equation for surface */
  97.     double  (*getdisk)();    /* maximum disk for surface */
  98. } SOBJECT;        /* source object functions */
  99.  
  100. typedef union {
  101.     VSMATERIAL  *mf;    /* material functions */
  102.     SOBJECT  *of;        /* object functions */
  103. } SRCFUNC;        /* source functions */
  104.  
  105. extern SRCFUNC  sfun[];            /* source dispatch table */
  106.  
  107. extern SRCREC  *source;            /* our source list */
  108. extern int  nsources;            /* the number of sources */
  109.  
  110. extern int  srcvalue();            /* compute source value w/o shadows */
  111. extern double  nextssamp();        /* get next source sample location */
  112. extern double  scylform();        /* cosine to axis of cylinder */
  113.  
  114. #define  sflatform(sn,dir)    -DOT(source[sn].snorm, dir)
  115.  
  116. extern OBJREC  *vsmaterial();        /* virtual source material */
  117.  
  118. extern double  intercircle();        /* intersect two circles */
  119. extern double  spotdisk();        /* intersecting disk for spot */
  120. extern double  beamdisk();        /* intersecting disk for beam */
  121.  
  122. extern SPOT  *makespot();        /* make spotlight */
  123.  
  124. extern double  dstrsrc;            /* source distribution amount */
  125. extern double  shadthresh;        /* relative shadow threshold */
  126. extern double  shadcert;        /* shadow testing certainty */
  127. extern double  srcsizerat;        /* max. ratio of source size/dist. */
  128. extern int  directrelay;        /* maximum number of source relays */
  129. extern int  vspretest;            /* virtual source pretest density */
  130. extern int  directinvis;        /* sources invisible? */
  131.  
  132. #define  getplaneq(c,o)        (*sfun[(o)->otype].of->getpleq)(c,o)
  133. #define  getmaxdisk(c,o)    (*sfun[(o)->otype].of->getdisk)(c,o)
  134. #define  setsource(s,o)        (*sfun[(o)->otype].of->setsrc)(s,o)
  135.