/* RCSid: $Id: ambient.h,v 2.7 2003/02/22 02:07:28 greg Exp $ */ /* * Common definitions for interreflection routines. * * 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 * . */ /* * Since we've defined our vectors as float below to save space, * watch out for changes in the definitions of VCOPY() and DOT() * and don't pass these vectors to fvect routines. */ typedef struct ambrec { unsigned long latick; /* last accessed tick */ float pos[3]; /* position in space */ float dir[3]; /* normal direction */ int lvl; /* recursion level of parent ray */ float weight; /* weight of parent ray */ float rad; /* validity radius */ COLOR val; /* computed ambient value */ float gpos[3]; /* gradient wrt. position */ float gdir[3]; /* gradient wrt. direction */ struct ambrec *next; /* next in list */ } AMBVAL; /* ambient value */ typedef struct ambtree { AMBVAL *alist; /* ambient value list */ struct ambtree *kid; /* 8 child nodes */ } AMBTREE; /* ambient octree */ typedef struct { short t, p; /* theta, phi indices */ COLOR v; /* value sum */ float r; /* 1/distance sum */ float k; /* variance for this division */ int n; /* number of subsamples */ } AMBSAMP; /* ambient sample division */ typedef struct { FVECT ux, uy, uz; /* x, y and z axis directions */ short nt, np; /* number of theta and phi directions */ } AMBHEMI; /* ambient sample hemisphere */ extern double maxarad; /* maximum ambient radius */ extern double minarad; /* minimum ambient radius */ #define AVGREFL 0.5 /* assumed average reflectance */ #define AMBVALSIZ 75 /* number of bytes in portable AMBVAL struct */ #define AMBMAGIC 557 /* magic number for ambient value files */ #define AMBFMT "Radiance_ambval" /* format id string */ #ifdef NOPROTO extern int divsample(); extern double doambient(); extern void inithemi(); extern void comperrs(); extern void posgradient(); extern void dirgradient(); extern void setambres(); extern void setambacc(); extern void setambient(); extern void ambdone(); extern void ambnotify(); extern void ambient(); extern double sumambient(); extern double makeambient(); extern void extambient(); extern int ambsync(); extern void putambmagic(); extern int hasambmagic(); extern int writambval(); extern int ambvalOK(); extern int readambval(); extern void lookamb(); extern void writamb(); #else /* defined in ambcomp.c */ extern int divsample(AMBSAMP *dp, AMBHEMI *h, RAY *r); extern double doambient(COLOR acol, RAY *r, double wt, FVECT pg, FVECT dg); extern void inithemi(AMBHEMI *hp, RAY *r, double wt); extern void comperrs(AMBSAMP *da, AMBHEMI *hp); extern void posgradient(FVECT gv, AMBSAMP *da, AMBHEMI *hp); extern void dirgradient(FVECT gv, AMBSAMP *da, AMBHEMI *hp); /* defined in ambient.c */ extern void setambres(int ar); extern void setambacc(double newa); extern void setambient(void); extern void ambdone(void); extern void ambnotify(OBJECT obj); extern void ambient(COLOR acol, RAY *r, FVECT nrm); extern double sumambient(COLOR acol, RAY *r, FVECT rn, int al, AMBTREE *at, FVECT c0, double s); extern double makeambient(COLOR acol, RAY *r, FVECT rn, int al); extern void extambient(COLOR cr, AMBVAL *ap, FVECT pv, FVECT nv); extern int ambsync(void); /* defined in ambio.c */ extern void putambmagic(FILE *fp); extern int hasambmagic(FILE *fp); extern int writambval(AMBVAL *av, FILE *fp); extern int ambvalOK(AMBVAL *av); extern int readambval(AMBVAL *av, FILE *fp); /* defined in lookamb.c */ extern void lookamb(FILE *fp); extern void writamb(FILE *fp); #endif