ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/virtuals.c
(Generate patch)

Comparing ray/src/rt/virtuals.c (file contents):
Revision 1.29 by greg, Tue Oct 22 11:23:51 1991 UTC vs.
Revision 2.7 by greg, Sat Feb 22 02:07:29 2003 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1991 Regents of the University of California */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   * Routines for simulating virtual light sources
6   *      Thus far, we only support planar mirrors.
7 + *
8 + *  External symbols declared in source.h
9   */
10  
11 + /* ====================================================================
12 + * The Radiance Software License, Version 1.0
13 + *
14 + * Copyright (c) 1990 - 2002 The Regents of the University of California,
15 + * through Lawrence Berkeley National Laboratory.   All rights reserved.
16 + *
17 + * Redistribution and use in source and binary forms, with or without
18 + * modification, are permitted provided that the following conditions
19 + * are met:
20 + *
21 + * 1. Redistributions of source code must retain the above copyright
22 + *         notice, this list of conditions and the following disclaimer.
23 + *
24 + * 2. Redistributions in binary form must reproduce the above copyright
25 + *       notice, this list of conditions and the following disclaimer in
26 + *       the documentation and/or other materials provided with the
27 + *       distribution.
28 + *
29 + * 3. The end-user documentation included with the redistribution,
30 + *           if any, must include the following acknowledgment:
31 + *             "This product includes Radiance software
32 + *                 (http://radsite.lbl.gov/)
33 + *                 developed by the Lawrence Berkeley National Laboratory
34 + *               (http://www.lbl.gov/)."
35 + *       Alternately, this acknowledgment may appear in the software itself,
36 + *       if and wherever such third-party acknowledgments normally appear.
37 + *
38 + * 4. The names "Radiance," "Lawrence Berkeley National Laboratory"
39 + *       and "The Regents of the University of California" must
40 + *       not be used to endorse or promote products derived from this
41 + *       software without prior written permission. For written
42 + *       permission, please contact [email protected].
43 + *
44 + * 5. Products derived from this software may not be called "Radiance",
45 + *       nor may "Radiance" appear in their name, without prior written
46 + *       permission of Lawrence Berkeley National Laboratory.
47 + *
48 + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
49 + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
50 + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
51 + * DISCLAIMED.   IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR
52 + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
53 + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
54 + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
55 + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
56 + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
57 + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
58 + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
59 + * SUCH DAMAGE.
60 + * ====================================================================
61 + *
62 + * This software consists of voluntary contributions made by many
63 + * individuals on behalf of Lawrence Berkeley National Laboratory.   For more
64 + * information on Lawrence Berkeley National Laboratory, please see
65 + * <http://www.lbl.gov/>.
66 + */
67 +
68   #include  "ray.h"
69  
14 #include  "octree.h"
15
70   #include  "otypes.h"
71  
72   #include  "source.h"
# Line 23 | Line 77 | static char SCCSid[] = "$SunId$ LBL";
77   #define  STESTMAX       32              /* maximum seeks per sample */
78  
79  
26 double  getdisk();
27
80   static OBJECT  *vobject;                /* virtual source objects */
81   static int  nvobjects = 0;              /* number of virtual source objects */
82  
83  
84 + void
85   markvirtuals()                  /* find and mark virtual sources */
86   {
87          register OBJREC  *o;
# Line 41 | Line 94 | markvirtuals()                 /* find and mark virtual sources */
94                  o = objptr(i);
95                  if (!issurface(o->otype) || o->omod == OVOID)
96                          continue;
97 <                if (!isvlight(objptr(o->omod)->otype))
97 >                if (!isvlight(vsmaterial(o)->otype))
98                          continue;
99                  if (sfun[o->otype].of == NULL ||
100                                  sfun[o->otype].of->getpleq == NULL) {
# Line 66 | Line 119 | markvirtuals()                 /* find and mark virtual sources */
119          for (i = nsources; i-- > 0; )
120                  addvirtuals(i, directrelay);
121                                          /* done with our object list */
122 <        free((char *)vobject);
122 >        free((void *)vobject);
123          nvobjects = 0;
124   }
125  
126  
127 + void
128   addvirtuals(sn, nr)             /* add virtuals associated with source */
129   int  sn;
130   int  nr;
# Line 88 | Line 142 | int  nr;
142   }
143  
144  
145 + void
146   vproject(o, sn, n)              /* create projected source(s) if they exist */
147   OBJREC  *o;
148   int  sn;
# Line 101 | Line 156 | int  n;
156          if (o == source[sn].so) /* objects cannot project themselves */
157                  return;
158                                  /* get virtual source material */
159 <        vsmat = sfun[objptr(o->omod)->otype].mf;
159 >        vsmat = sfun[vsmaterial(o)->otype].mf;
160                                  /* project virtual sources */
161          for (i = 0; i < vsmat->nproj; i++)
162                  if ((*vsmat->vproj)(proj, o, &source[sn], i))
# Line 115 | Line 170 | int  n;
170   }
171  
172  
173 + OBJREC *
174 + vsmaterial(o)                   /* get virtual source material pointer */
175 + OBJREC  *o;
176 + {
177 +        register int  i;
178 +        register OBJREC  *m;
179 +
180 +        i = o->omod;
181 +        m = objptr(i);
182 +        if (m->otype != MAT_ILLUM || m->oargs.nsargs < 1 ||
183 +                        !strcmp(m->oargs.sarg[0], VOIDID) ||
184 +                        (i = lastmod(objndx(m), m->oargs.sarg[0])) == OVOID)
185 +                return(m);              /* direct modifier */
186 +        return(objptr(i));              /* illum alternate */
187 + }
188 +
189 +
190   int
191   makevsrc(op, sn, pm)            /* make virtual source if reasonable */
192   OBJREC  *op;
# Line 140 | Line 212 | MAT4  pm;
212                  normalize(nsloc);
213                  VCOPY(ourspot.aim, ocent);
214                  ourspot.siz = PI*maxrad2;
215 <                ourspot.flen = 0.;
215 >                ourspot.flen = -1.;
216                  if (source[sn].sflags & SSPOT) {
217                          multp3(theirspot.aim, source[sn].sl.s->aim, pm);
218                                                  /* adjust for source size */
# Line 284 | Line 356 | register int  sn;      /* target source number */
356          FVECT  offsdir;
357          SRCINDEX  si;
358          double  or, d;
287        int  infront;
359          int  stestlim, ssn;
360          int  nhit, nok;
361          register int  i, n;
# Line 297 | Line 368 | register int  sn;      /* target source number */
368          if (source[sn].sflags & SDISTANT) {
369                                          /* 32. == heuristic constant */
370                  n = 32.*or2/(thescene.cusize*thescene.cusize)*vspretest + .5;
300                infront = DOT(onorm, source[sn].sloc) > 0.;
371          } else {
372                  for (i = 0; i < 3; i++)
373                          offsdir[i] = source[sn].sloc[i] - oc[i];
# Line 306 | Line 376 | register int  sn;      /* target source number */
376                          n = 2.*PI * vspretest + .5;
377                  else
378                          n = 2.*PI * (1.-sqrt(1./(1.+or2/d)))*vspretest + .5;
309                infront = DOT(onorm, offsdir) > 0.;
379          }
380          if (n < MINSAMPLES) n = MINSAMPLES;
381   #ifdef DEBUG
# Line 318 | Line 387 | register int  sn;      /* target source number */
387          stestlim = n*STESTMAX;
388          ssn = 0;
389          nhit = nok = 0;
390 +        initsrcindex(&si);
391          while (n-- > 0) {
392                                          /* get sample point */
393                  do {
# Line 331 | Line 401 | register int  sn;      /* target source number */
401                          for (i = 0; i < 3; i++)
402                                  offsdir[i] = or*(1. - 2.*offsdir[i]);
403                          ssn++;
404 <                        for (i = 0; i < 3; i++)
405 <                                sr.rorg[i] = oc[i] + offsdir[i];
406 <                        d = DOT(offsdir,onorm);
407 <                        if (infront)
408 <                                for (i = 0; i < 3; i++) {
409 <                                        sr.rorg[i] -= (d-.0001)*onorm[i];
340 <                                        sr.rdir[i] = -onorm[i];
341 <                                }
342 <                        else
343 <                                for (i = 0; i < 3; i++) {
344 <                                        sr.rorg[i] -= (d+.0001)*onorm[i];
345 <                                        sr.rdir[i] = onorm[i];
346 <                                }
404 >                        d = 1. - DOT(offsdir, onorm);
405 >                        for (i = 0; i < 3; i++) {
406 >                                sr.rorg[i] = oc[i] + offsdir[i] + d*onorm[i];
407 >                                sr.rdir[i] = -onorm[i];
408 >                        }
409 >                        sr.rmax = 0.0;
410                          rayorigin(&sr, NULL, PRIMARY, 1.0);
411                  } while (!(*ofun[o->otype].funp)(o, &sr));
412                                          /* check against source */
413 <                initsrcindex(&si);
351 <                si.sn = sn;
352 <                nopart(&si, sr.rorg);
413 >                VCOPY(sr.rorg, sr.rop); /* starting from intersection */
414                  samplendx++;
415 <                if (!srcray(&sr, NULL, &si) || sr.rsrc != sn)
416 <                        continue;
415 >                if (si.sp >= si.np-1 ||
416 >                                !srcray(&sr, NULL, &si) || sr.rsrc != sn) {
417 >                        si.sn = sn-1;           /* reset index to our source */
418 >                        si.np = 0;
419 >                        if (!srcray(&sr, NULL, &si) || sr.rsrc != sn)
420 >                                continue;       /* can't get there from here */
421 >                }
422                  sr.revf = srcvalue;
423 <                rayvalue(&sr);
423 >                rayvalue(&sr);                  /* check sample validity */
424                  if (bright(sr.rcol) <= FTINY)
425                          continue;
426 <                nok++;
361 <                                        /* check against obstructions */
426 >                nok++;                  /* got sample; check obstructions */
427                  rayclear(&sr);
428                  sr.revf = raytrace;
429                  rayvalue(&sr);
# Line 385 | Line 450 | register int  sn;      /* target source number */
450          
451  
452   #ifdef DEBUG
453 + void
454   virtverb(sn, fp)        /* print verbose description of virtual source */
455   register int  sn;
456   FILE  *fp;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines