| 1 | 
< | 
/* Copyright (c) 1986 Regents of the University of California */ | 
| 2 | 
< | 
 | 
| 3 | 
< | 
/* SCCSid "$SunId$ LBL" */ | 
| 4 | 
< | 
 | 
| 1 | 
> | 
/* RCSid: $Id$ */ | 
| 2 | 
  | 
/* | 
| 3 | 
  | 
 *  source.h - header file for ray tracing sources. | 
| 4 | 
  | 
 * | 
| 5 | 
< | 
 *     8/20/85 | 
| 5 | 
> | 
 *  Include after ray.h | 
| 6 | 
  | 
 */ | 
| 7 | 
  | 
 | 
| 8 | 
+ | 
/* ==================================================================== | 
| 9 | 
+ | 
 * The Radiance Software License, Version 1.0 | 
| 10 | 
+ | 
 * | 
| 11 | 
+ | 
 * Copyright (c) 1990 - 2002 The Regents of the University of California, | 
| 12 | 
+ | 
 * through Lawrence Berkeley National Laboratory.   All rights reserved. | 
| 13 | 
+ | 
 * | 
| 14 | 
+ | 
 * Redistribution and use in source and binary forms, with or without | 
| 15 | 
+ | 
 * modification, are permitted provided that the following conditions | 
| 16 | 
+ | 
 * are met: | 
| 17 | 
+ | 
 * | 
| 18 | 
+ | 
 * 1. Redistributions of source code must retain the above copyright | 
| 19 | 
+ | 
 *         notice, this list of conditions and the following disclaimer. | 
| 20 | 
+ | 
 * | 
| 21 | 
+ | 
 * 2. Redistributions in binary form must reproduce the above copyright | 
| 22 | 
+ | 
 *       notice, this list of conditions and the following disclaimer in | 
| 23 | 
+ | 
 *       the documentation and/or other materials provided with the | 
| 24 | 
+ | 
 *       distribution. | 
| 25 | 
+ | 
 * | 
| 26 | 
+ | 
 * 3. The end-user documentation included with the redistribution, | 
| 27 | 
+ | 
 *           if any, must include the following acknowledgment: | 
| 28 | 
+ | 
 *             "This product includes Radiance software | 
| 29 | 
+ | 
 *                 (http://radsite.lbl.gov/) | 
| 30 | 
+ | 
 *                 developed by the Lawrence Berkeley National Laboratory | 
| 31 | 
+ | 
 *               (http://www.lbl.gov/)." | 
| 32 | 
+ | 
 *       Alternately, this acknowledgment may appear in the software itself, | 
| 33 | 
+ | 
 *       if and wherever such third-party acknowledgments normally appear. | 
| 34 | 
+ | 
 * | 
| 35 | 
+ | 
 * 4. The names "Radiance," "Lawrence Berkeley National Laboratory" | 
| 36 | 
+ | 
 *       and "The Regents of the University of California" must | 
| 37 | 
+ | 
 *       not be used to endorse or promote products derived from this | 
| 38 | 
+ | 
 *       software without prior written permission. For written | 
| 39 | 
+ | 
 *       permission, please contact [email protected]. | 
| 40 | 
+ | 
 * | 
| 41 | 
+ | 
 * 5. Products derived from this software may not be called "Radiance", | 
| 42 | 
+ | 
 *       nor may "Radiance" appear in their name, without prior written | 
| 43 | 
+ | 
 *       permission of Lawrence Berkeley National Laboratory. | 
| 44 | 
+ | 
 * | 
| 45 | 
+ | 
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | 
| 46 | 
+ | 
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | 
| 47 | 
+ | 
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 
| 48 | 
+ | 
 * DISCLAIMED.   IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR | 
| 49 | 
+ | 
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
| 50 | 
+ | 
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
| 51 | 
+ | 
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | 
| 52 | 
+ | 
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 
| 53 | 
+ | 
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | 
| 54 | 
+ | 
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | 
| 55 | 
+ | 
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 
| 56 | 
+ | 
 * SUCH DAMAGE. | 
| 57 | 
+ | 
 * ==================================================================== | 
| 58 | 
+ | 
 * | 
| 59 | 
+ | 
 * This software consists of voluntary contributions made by many | 
| 60 | 
+ | 
 * individuals on behalf of Lawrence Berkeley National Laboratory.   For more | 
| 61 | 
+ | 
 * information on Lawrence Berkeley National Laboratory, please see | 
| 62 | 
+ | 
 * <http://www.lbl.gov/>. | 
| 63 | 
+ | 
 */ | 
| 64 | 
+ | 
 | 
| 65 | 
  | 
#define  AIMREQT        100             /* required aim success/failure */ | 
| 66 | 
  | 
 | 
| 67 | 
  | 
#define  SDISTANT       01              /* source distant flag */ | 
| 70 | 
  | 
#define  SSPOT          010             /* source spotlight flag */ | 
| 71 | 
  | 
#define  SVIRTUAL       020             /* source virtual flag */ | 
| 72 | 
  | 
#define  SFLAT          040             /* source flat flag */ | 
| 73 | 
< | 
#define  SFOLLOW        0100            /* source follow path flag */ | 
| 73 | 
> | 
#define  SCYL           0100            /* source cylindrical flag */ | 
| 74 | 
> | 
#define  SFOLLOW        0200            /* source follow path flag */ | 
| 75 | 
  | 
 | 
| 76 | 
  | 
typedef struct { | 
| 77 | 
  | 
        FVECT  aim;             /* aim direction or center */ | 
| 78 | 
  | 
        float  siz;             /* output solid angle or area */ | 
| 79 | 
< | 
        float  flen;            /* focal length */ | 
| 79 | 
> | 
        float  flen;            /* focal length (negative if distant source) */ | 
| 80 | 
  | 
} SPOT;                 /* spotlight */ | 
| 81 | 
  | 
 | 
| 82 | 
  | 
typedef struct { | 
| 83 | 
  | 
        int  sflags;            /* source flags */ | 
| 84 | 
  | 
        FVECT  sloc;            /* direction or position of source */ | 
| 85 | 
< | 
        FVECT  snorm;           /* surface normal of flat source */ | 
| 86 | 
< | 
        float  ss;              /* tangent or disk radius */ | 
| 87 | 
< | 
        float  ss2;             /* domega or projected area */ | 
| 85 | 
> | 
        FVECT  ss[3];           /* source dimension vectors, U, V, and W */ | 
| 86 | 
> | 
        float  srad;            /* maximum source radius */ | 
| 87 | 
> | 
        float  ss2;             /* solid angle or projected area */ | 
| 88 | 
  | 
        struct { | 
| 89 | 
  | 
                float  prox;            /* proximity */ | 
| 90 | 
  | 
                SPOT  *s;               /* spot */ | 
| 91 | 
  | 
        } sl;                   /* localized source information */ | 
| 92 | 
  | 
        union { | 
| 93 | 
< | 
                int  success;           /* successes - AIMREQT*failures */ | 
| 94 | 
< | 
                int  svnext;            /* next source to aim for */ | 
| 93 | 
> | 
                long  success;          /* successes - AIMREQT*failures */ | 
| 94 | 
> | 
                struct { | 
| 95 | 
> | 
                        short  pn;              /* projection number */ | 
| 96 | 
> | 
                        int  sn;                /* next source to aim for */ | 
| 97 | 
> | 
                }  sv;                  /* virtual source */ | 
| 98 | 
  | 
        } sa;                   /* source aiming information */ | 
| 99 | 
  | 
        long  ntests, nhits;    /* shadow tests and hits */ | 
| 100 | 
  | 
        OBJREC  *so;            /* source destination object */ | 
| 101 | 
  | 
}  SRCREC;              /* light source */ | 
| 102 | 
  | 
 | 
| 103 | 
+ | 
#define MAXSPART        64              /* maximum partitions per source */ | 
| 104 | 
+ | 
 | 
| 105 | 
+ | 
#define SU              0               /* U vector or partition */ | 
| 106 | 
+ | 
#define SV              1               /* V vector or partition */ | 
| 107 | 
+ | 
#define SW              2               /* W vector or partition */ | 
| 108 | 
+ | 
#define S0              3               /* leaf partition */ | 
| 109 | 
+ | 
 | 
| 110 | 
+ | 
#define snorm           ss[SW]          /* normal vector for flat source */ | 
| 111 | 
+ | 
 | 
| 112 | 
  | 
typedef struct { | 
| 113 | 
< | 
        FVECT  dir;             /* source direction */ | 
| 114 | 
< | 
        float  dom;             /* domega for source */ | 
| 115 | 
< | 
        COLOR  val;             /* contribution */ | 
| 116 | 
< | 
}  CONTRIB;             /* direct contribution */ | 
| 113 | 
> | 
        int  sn;                                /* source number */ | 
| 114 | 
> | 
        short  np;                              /* number of partitions */ | 
| 115 | 
> | 
        short  sp;                              /* this partition number */ | 
| 116 | 
> | 
        double  dom;                            /* solid angle of partition */ | 
| 117 | 
> | 
        unsigned char  spt[MAXSPART/2];         /* source partitioning */ | 
| 118 | 
> | 
}  SRCINDEX;            /* source index structure */ | 
| 119 | 
  | 
 | 
| 120 | 
+ | 
#define initsrcindex(s) ((s)->sn = (s)->sp = -1, (s)->np = 0) | 
| 121 | 
+ | 
 | 
| 122 | 
+ | 
#define clrpart(pt)     bzero((char *)(pt), MAXSPART/2) | 
| 123 | 
+ | 
#define setpart(pt,i,v) ((pt)[(i)>>2] |= (v)<<(((i)&3)<<1)) | 
| 124 | 
+ | 
#define spart(pt,pi)    ((pt)[(pi)>>2] >> (((pi)&3)<<1) & 3) | 
| 125 | 
+ | 
 | 
| 126 | 
+ | 
/* | 
| 127 | 
+ | 
 * Special support functions for sources | 
| 128 | 
+ | 
 */ | 
| 129 | 
+ | 
 | 
| 130 | 
+ | 
/* | 
| 131 | 
+ | 
 * Virtual source materials must define the following. | 
| 132 | 
+ | 
 * | 
| 133 | 
+ | 
 *      vproj(pm, op, sp, i)    Compute i'th virtual projection | 
| 134 | 
+ | 
 *                              of source sp in object op and assign | 
| 135 | 
+ | 
 *                              the 4x4 transformation matrix pm. | 
| 136 | 
+ | 
 *                              Return 1 on success, 0 if no i'th projection. | 
| 137 | 
+ | 
 * | 
| 138 | 
+ | 
 *      nproj                   The number of projections.  The value of | 
| 139 | 
+ | 
 *                              i passed to vproj runs from 0 to nproj-1. | 
| 140 | 
+ | 
 */ | 
| 141 | 
+ | 
 | 
| 142 | 
  | 
typedef struct { | 
| 143 | 
< | 
        int  sno;               /* source number */ | 
| 144 | 
< | 
        float  brt;             /* brightness (for comparison) */ | 
| 145 | 
< | 
}  CNTPTR;              /* contribution pointer */ | 
| 143 | 
> | 
        int  (*vproj)();        /* project virtual sources */ | 
| 144 | 
> | 
        int  nproj;             /* number of possible projections */ | 
| 145 | 
> | 
} VSMATERIAL;           /* virtual source material functions */ | 
| 146 | 
  | 
 | 
| 147 | 
+ | 
typedef struct { | 
| 148 | 
+ | 
        void    (*setsrc)();    /* set light source for object */ | 
| 149 | 
+ | 
        void    (*partit)();    /* partition light source object */ | 
| 150 | 
+ | 
        double  (*getpleq)();   /* plane equation for surface */ | 
| 151 | 
+ | 
        double  (*getdisk)();   /* maximum disk for surface */ | 
| 152 | 
+ | 
} SOBJECT;              /* source object functions */ | 
| 153 | 
+ | 
 | 
| 154 | 
+ | 
typedef union { | 
| 155 | 
+ | 
        VSMATERIAL  *mf;        /* material functions */ | 
| 156 | 
+ | 
        SOBJECT  *of;           /* object functions */ | 
| 157 | 
+ | 
} SRCFUNC;              /* source functions */ | 
| 158 | 
+ | 
 | 
| 159 | 
+ | 
extern SRCFUNC  sfun[];                 /* source dispatch table */ | 
| 160 | 
+ | 
 | 
| 161 | 
  | 
extern SRCREC  *source;                 /* our source list */ | 
| 162 | 
  | 
extern int  nsources;                   /* the number of sources */ | 
| 163 | 
  | 
 | 
| 164 | 
< | 
extern double  srcray();                /* ray to source */ | 
| 164 | 
> | 
#define  sflatform(sn,dir)      -DOT(source[sn].snorm, dir) | 
| 165 | 
  | 
 | 
| 166 | 
< | 
extern SPOT  *makespot();               /* make spotlight */ | 
| 166 | 
> | 
#define  getplaneq(c,o)         (*sfun[(o)->otype].of->getpleq)(c,o) | 
| 167 | 
> | 
#define  getmaxdisk(c,o)        (*sfun[(o)->otype].of->getdisk)(c,o) | 
| 168 | 
> | 
#define  setsource(s,o)         (*sfun[(o)->otype].of->setsrc)(s,o) | 
| 169 | 
  | 
 | 
| 170 | 
< | 
extern SRCREC  *newsource();            /* allocate new source */ | 
| 170 | 
> | 
#ifdef NOPROTO | 
| 171 | 
> | 
 | 
| 172 | 
> | 
extern void     marksources(); | 
| 173 | 
> | 
extern void     freesources(); | 
| 174 | 
> | 
extern int      srcray(); | 
| 175 | 
> | 
extern void     srcvalue(); | 
| 176 | 
> | 
extern int      sourcehit(); | 
| 177 | 
> | 
extern void     direct(); | 
| 178 | 
> | 
extern void     srcscatter(); | 
| 179 | 
> | 
extern int      m_light(); | 
| 180 | 
> | 
extern double   nextssamp(); | 
| 181 | 
> | 
extern int      skipparts(); | 
| 182 | 
> | 
extern void     nopart(); | 
| 183 | 
> | 
extern void     cylpart(); | 
| 184 | 
> | 
extern void     flatpart(); | 
| 185 | 
> | 
extern double   scylform(); | 
| 186 | 
> | 
extern void     initstypes(); | 
| 187 | 
> | 
extern int      newsource(); | 
| 188 | 
> | 
extern void     setflatss(); | 
| 189 | 
> | 
extern void     fsetsrc(); | 
| 190 | 
> | 
extern void     ssetsrc(); | 
| 191 | 
> | 
extern void     sphsetsrc(); | 
| 192 | 
> | 
extern void     rsetsrc(); | 
| 193 | 
> | 
extern void     cylsetsrc(); | 
| 194 | 
> | 
extern SPOT     *makespot(); | 
| 195 | 
> | 
extern int      spotout(); | 
| 196 | 
> | 
extern double   fgetmaxdisk(); | 
| 197 | 
> | 
extern double   rgetmaxdisk(); | 
| 198 | 
> | 
extern double   fgetplaneq(); | 
| 199 | 
> | 
extern double   rgetplaneq(); | 
| 200 | 
> | 
extern int      commonspot(); | 
| 201 | 
> | 
extern int      commonbeam(); | 
| 202 | 
> | 
extern int      checkspot(); | 
| 203 | 
> | 
extern double   spotdisk(); | 
| 204 | 
> | 
extern double   beamdisk(); | 
| 205 | 
> | 
extern double   intercircle(); | 
| 206 | 
> | 
extern void     markvirtuals(); | 
| 207 | 
> | 
extern void     addvirtuals(); | 
| 208 | 
> | 
extern void     vproject(); | 
| 209 | 
> | 
extern OBJREC   *vsmaterial(); | 
| 210 | 
> | 
extern int      makevsrc(); | 
| 211 | 
> | 
extern double   getdisk(); | 
| 212 | 
> | 
extern int      vstestvis(); | 
| 213 | 
> | 
extern void     virtverb(); | 
| 214 | 
> | 
 | 
| 215 | 
> | 
#else | 
| 216 | 
> | 
                                        /* defined in source.c */ | 
| 217 | 
> | 
extern void     marksources(void); | 
| 218 | 
> | 
extern void     freesources(void); | 
| 219 | 
> | 
extern int      srcray(RAY *sr, RAY *r, SRCINDEX *si); | 
| 220 | 
> | 
extern void     srcvalue(RAY *r); | 
| 221 | 
> | 
extern int      sourcehit(RAY *r); | 
| 222 | 
> | 
extern void     direct(RAY *r, void (*f)(), char *p); | 
| 223 | 
> | 
extern void     srcscatter(RAY *r); | 
| 224 | 
> | 
extern int      m_light(OBJREC *m, RAY *r); | 
| 225 | 
> | 
                                        /* defined in srcsamp.c */ | 
| 226 | 
> | 
extern double   nextssamp(RAY *r, SRCINDEX *si); | 
| 227 | 
> | 
extern int      skipparts(int ct[3], int sz[3], int pp[2], unsigned char *pt); | 
| 228 | 
> | 
extern void     nopart(SRCINDEX *si, RAY *r); | 
| 229 | 
> | 
extern void     cylpart(SRCINDEX *si, RAY *r); | 
| 230 | 
> | 
extern void     flatpart(SRCINDEX *si, RAY *r); | 
| 231 | 
> | 
extern double   scylform(int sn, FVECT dir); | 
| 232 | 
> | 
                                        /* defined in srcsupp.c */ | 
| 233 | 
> | 
extern void     initstypes(void); | 
| 234 | 
> | 
extern int      newsource(void); | 
| 235 | 
> | 
extern void     setflatss(SRCREC *src); | 
| 236 | 
> | 
extern void     fsetsrc(SRCREC *src, OBJREC *so); | 
| 237 | 
> | 
extern void     ssetsrc(SRCREC *src, OBJREC *so); | 
| 238 | 
> | 
extern void     sphsetsrc(SRCREC *src, OBJREC *so); | 
| 239 | 
> | 
extern void     rsetsrc(SRCREC *src, OBJREC *so); | 
| 240 | 
> | 
extern void     cylsetsrc(SRCREC *src, OBJREC *so); | 
| 241 | 
> | 
extern SPOT     *makespot(OBJREC *m); | 
| 242 | 
> | 
extern int      spotout(RAY *r, SPOT *s); | 
| 243 | 
> | 
extern double   fgetmaxdisk(FVECT ocent, OBJREC *op); | 
| 244 | 
> | 
extern double   rgetmaxdisk(FVECT ocent, OBJREC *op); | 
| 245 | 
> | 
extern double   fgetplaneq(FVECT nvec, OBJREC *op); | 
| 246 | 
> | 
extern double   rgetplaneq(FVECT nvec, OBJREC *op); | 
| 247 | 
> | 
extern int      commonspot(SPOT *sp1, SPOT *sp2, FVECT org); | 
| 248 | 
> | 
extern int      commonbeam(SPOT *sp1, SPOT *sp2, FVECT org); | 
| 249 | 
> | 
extern int      checkspot(SPOT *sp, FVECT nrm); | 
| 250 | 
> | 
extern double   spotdisk(FVECT oc, OBJREC *op, SPOT *sp, FVECT pos); | 
| 251 | 
> | 
extern double   beamdisk(FVECT oc, OBJREC *op, SPOT *sp, FVECT dir); | 
| 252 | 
> | 
extern double   intercircle(FVECT cc, FVECT c1, FVECT c2, | 
| 253 | 
> | 
                        double r1s, double r2s); | 
| 254 | 
> | 
                                        /* defined in virtuals.c */ | 
| 255 | 
> | 
extern void     markvirtuals(void); | 
| 256 | 
> | 
extern void     addvirtuals(int sn, int nr); | 
| 257 | 
> | 
extern void     vproject(OBJREC *o, int sn, int n); | 
| 258 | 
> | 
extern OBJREC   *vsmaterial(OBJREC *o); | 
| 259 | 
> | 
extern int      makevsrc(OBJREC *op, int sn, MAT4 pm); | 
| 260 | 
> | 
extern double   getdisk(FVECT oc, OBJREC *op, int sn); | 
| 261 | 
> | 
extern int      vstestvis(int f, OBJREC *o, FVECT oc, double or2, int sn); | 
| 262 | 
> | 
extern void     virtverb(int sn, FILE *fp); | 
| 263 | 
> | 
 | 
| 264 | 
> | 
#endif |