--- ray/src/rt/source.h 1991/02/11 08:43:46 1.5 +++ ray/src/rt/source.h 2003/02/22 02:07:29 2.5 @@ -1,54 +1,264 @@ -/* Copyright (c) 1986 Regents of the University of California */ - -/* SCCSid "$SunId$ LBL" */ - +/* RCSid: $Id: source.h,v 2.5 2003/02/22 02:07:29 greg Exp $ */ /* * source.h - header file for ray tracing sources. * - * 8/20/85 + * Include after ray.h */ +/* ==================================================================== + * The Radiance Software License, Version 1.0 + * + * Copyright (c) 1990 - 2002 The Regents of the University of California, + * through Lawrence Berkeley National Laboratory. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes Radiance software + * (http://radsite.lbl.gov/) + * developed by the Lawrence Berkeley National Laboratory + * (http://www.lbl.gov/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Radiance," "Lawrence Berkeley National Laboratory" + * and "The Regents of the University of California" must + * not be used to endorse or promote products derived from this + * software without prior written permission. For written + * permission, please contact radiance@radsite.lbl.gov. + * + * 5. Products derived from this software may not be called "Radiance", + * nor may "Radiance" appear in their name, without prior written + * permission of Lawrence Berkeley National Laboratory. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of Lawrence Berkeley National Laboratory. For more + * information on Lawrence Berkeley National Laboratory, please see + * . + */ + +#define AIMREQT 100 /* required aim success/failure */ + #define SDISTANT 01 /* source distant flag */ #define SSKIP 02 /* source skip flag */ #define SPROX 04 /* source proximity flag */ #define SSPOT 010 /* source spotlight flag */ +#define SVIRTUAL 020 /* source virtual flag */ +#define SFLAT 040 /* source flat flag */ +#define SCYL 0100 /* source cylindrical flag */ +#define SFOLLOW 0200 /* source follow path flag */ -#define AIMREQT 100 /* required aim success/failure */ - typedef struct { - float siz; /* output solid angle */ - float flen; /* focal length */ - FVECT aim; /* aim direction */ + FVECT aim; /* aim direction or center */ + float siz; /* output solid angle or area */ + float flen; /* focal length (negative if distant source) */ } SPOT; /* spotlight */ typedef struct { - short sflags; /* source flags */ + int sflags; /* source flags */ FVECT sloc; /* direction or position of source */ - float ss; /* tangent or disk radius */ - float ss2; /* domega or projected area */ - union { + FVECT ss[3]; /* source dimension vectors, U, V, and W */ + float srad; /* maximum source radius */ + float ss2; /* solid angle or projected area */ + struct { float prox; /* proximity */ SPOT *s; /* spot */ } sl; /* localized source information */ - int aimsuccess; /* aim successes - AIMREQT*failures */ + union { + long success; /* successes - AIMREQT*failures */ + struct { + short pn; /* projection number */ + int sn; /* next source to aim for */ + } sv; /* virtual source */ + } sa; /* source aiming information */ long ntests, nhits; /* shadow tests and hits */ - OBJREC *so; /* source object */ + OBJREC *so; /* source destination object */ } SRCREC; /* light source */ +#define MAXSPART 64 /* maximum partitions per source */ + +#define SU 0 /* U vector or partition */ +#define SV 1 /* V vector or partition */ +#define SW 2 /* W vector or partition */ +#define S0 3 /* leaf partition */ + +#define snorm ss[SW] /* normal vector for flat source */ + typedef struct { - FVECT dir; /* source direction */ - float dom; /* domega for source */ - COLOR val; /* contribution */ -} CONTRIB; /* direct contribution */ + int sn; /* source number */ + short np; /* number of partitions */ + short sp; /* this partition number */ + double dom; /* solid angle of partition */ + unsigned char spt[MAXSPART/2]; /* source partitioning */ +} SRCINDEX; /* source index structure */ +#define initsrcindex(s) ((s)->sn = (s)->sp = -1, (s)->np = 0) + +#define clrpart(pt) bzero((char *)(pt), MAXSPART/2) +#define setpart(pt,i,v) ((pt)[(i)>>2] |= (v)<<(((i)&3)<<1)) +#define spart(pt,pi) ((pt)[(pi)>>2] >> (((pi)&3)<<1) & 3) + +/* + * Special support functions for sources + */ + +/* + * Virtual source materials must define the following. + * + * vproj(pm, op, sp, i) Compute i'th virtual projection + * of source sp in object op and assign + * the 4x4 transformation matrix pm. + * Return 1 on success, 0 if no i'th projection. + * + * nproj The number of projections. The value of + * i passed to vproj runs from 0 to nproj-1. + */ + typedef struct { - int sno; /* source number */ - float brt; /* brightness (for comparison) */ -} CNTPTR; /* contribution pointer */ + int (*vproj)(); /* project virtual sources */ + int nproj; /* number of possible projections */ +} VSMATERIAL; /* virtual source material functions */ +typedef struct { + void (*setsrc)(); /* set light source for object */ + void (*partit)(); /* partition light source object */ + double (*getpleq)(); /* plane equation for surface */ + double (*getdisk)(); /* maximum disk for surface */ +} SOBJECT; /* source object functions */ + +typedef union { + VSMATERIAL *mf; /* material functions */ + SOBJECT *of; /* object functions */ +} SRCFUNC; /* source functions */ + +extern SRCFUNC sfun[]; /* source dispatch table */ + extern SRCREC *source; /* our source list */ extern int nsources; /* the number of sources */ -extern double srcray(); /* ray to source */ +#define sflatform(sn,dir) -DOT(source[sn].snorm, dir) -extern SPOT *makespot(); /* make spotlight */ +#define getplaneq(c,o) (*sfun[(o)->otype].of->getpleq)(c,o) +#define getmaxdisk(c,o) (*sfun[(o)->otype].of->getdisk)(c,o) +#define setsource(s,o) (*sfun[(o)->otype].of->setsrc)(s,o) + +#ifdef NOPROTO + +extern void marksources(); +extern void freesources(); +extern int srcray(); +extern void srcvalue(); +extern int sourcehit(); +extern void direct(); +extern void srcscatter(); +extern int m_light(); +extern double nextssamp(); +extern int skipparts(); +extern void nopart(); +extern void cylpart(); +extern void flatpart(); +extern double scylform(); +extern void initstypes(); +extern int newsource(); +extern void setflatss(); +extern void fsetsrc(); +extern void ssetsrc(); +extern void sphsetsrc(); +extern void rsetsrc(); +extern void cylsetsrc(); +extern SPOT *makespot(); +extern int spotout(); +extern double fgetmaxdisk(); +extern double rgetmaxdisk(); +extern double fgetplaneq(); +extern double rgetplaneq(); +extern int commonspot(); +extern int commonbeam(); +extern int checkspot(); +extern double spotdisk(); +extern double beamdisk(); +extern double intercircle(); +extern void markvirtuals(); +extern void addvirtuals(); +extern void vproject(); +extern OBJREC *vsmaterial(); +extern int makevsrc(); +extern double getdisk(); +extern int vstestvis(); +extern void virtverb(); + +#else + /* defined in source.c */ +extern void marksources(void); +extern void freesources(void); +extern int srcray(RAY *sr, RAY *r, SRCINDEX *si); +extern void srcvalue(RAY *r); +extern int sourcehit(RAY *r); +extern void direct(RAY *r, void (*f)(), char *p); +extern void srcscatter(RAY *r); +extern int m_light(OBJREC *m, RAY *r); + /* defined in srcsamp.c */ +extern double nextssamp(RAY *r, SRCINDEX *si); +extern int skipparts(int ct[3], int sz[3], int pp[2], unsigned char *pt); +extern void nopart(SRCINDEX *si, RAY *r); +extern void cylpart(SRCINDEX *si, RAY *r); +extern void flatpart(SRCINDEX *si, RAY *r); +extern double scylform(int sn, FVECT dir); + /* defined in srcsupp.c */ +extern void initstypes(void); +extern int newsource(void); +extern void setflatss(SRCREC *src); +extern void fsetsrc(SRCREC *src, OBJREC *so); +extern void ssetsrc(SRCREC *src, OBJREC *so); +extern void sphsetsrc(SRCREC *src, OBJREC *so); +extern void rsetsrc(SRCREC *src, OBJREC *so); +extern void cylsetsrc(SRCREC *src, OBJREC *so); +extern SPOT *makespot(OBJREC *m); +extern int spotout(RAY *r, SPOT *s); +extern double fgetmaxdisk(FVECT ocent, OBJREC *op); +extern double rgetmaxdisk(FVECT ocent, OBJREC *op); +extern double fgetplaneq(FVECT nvec, OBJREC *op); +extern double rgetplaneq(FVECT nvec, OBJREC *op); +extern int commonspot(SPOT *sp1, SPOT *sp2, FVECT org); +extern int commonbeam(SPOT *sp1, SPOT *sp2, FVECT org); +extern int checkspot(SPOT *sp, FVECT nrm); +extern double spotdisk(FVECT oc, OBJREC *op, SPOT *sp, FVECT pos); +extern double beamdisk(FVECT oc, OBJREC *op, SPOT *sp, FVECT dir); +extern double intercircle(FVECT cc, FVECT c1, FVECT c2, + double r1s, double r2s); + /* defined in virtuals.c */ +extern void markvirtuals(void); +extern void addvirtuals(int sn, int nr); +extern void vproject(OBJREC *o, int sn, int n); +extern OBJREC *vsmaterial(OBJREC *o); +extern int makevsrc(OBJREC *op, int sn, MAT4 pm); +extern double getdisk(FVECT oc, OBJREC *op, int sn); +extern int vstestvis(int f, OBJREC *o, FVECT oc, double or2, int sn); +extern void virtverb(int sn, FILE *fp); + +#endif