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 2.18 by greg, Thu Oct 28 09:38:46 2010 UTC vs.
Revision 2.25 by greg, Fri Feb 12 00:41:19 2021 UTC

# Line 11 | Line 11 | static const char      RCSid[] = "$Id$";
11   #include "copyright.h"
12  
13   #include  "ray.h"
14
14   #include  "otypes.h"
15 <
15 > #include  "otspecial.h"
16   #include  "source.h"
18
17   #include  "random.h"
18  
19   #define  MINSAMPLES     16              /* minimum number of pretest samples */
# Line 26 | Line 24 | static OBJECT  *vobject;               /* virtual source objects */
24   static int  nvobjects = 0;              /* number of virtual source objects */
25  
26  
27 < extern void
27 > static int
28 > isident4(MAT4 m)
29 > {
30 >        int     i, j;
31 >
32 >        for (i = 4; i--; )
33 >                for (j = 4; j--; )
34 >                        if (!FABSEQ(m[i][j], i==j))
35 >                                return(0);
36 >        return(1);
37 > }
38 >
39 >
40 > void
41   markvirtuals(void)                      /* find and mark virtual sources */
42   {
43 <        register OBJREC  *o;
44 <        register int  i;
43 >        OBJREC  *o;
44 >        int  i;
45                                          /* check number of direct relays */
46          if (directrelay <= 0)
47                  return;
# Line 69 | Line 80 | markvirtuals(void)                     /* find and mark virtual sources
80   }
81  
82  
83 < extern void
83 > void
84   addvirtuals(            /* add virtuals associated with source */
85          int  sn,
86          int  nr
87   )
88   {
89 <        register int  i;
89 >        int  i;
90                                  /* check relay limit first */
91          if (nr <= 0)
92                  return;
# Line 88 | Line 99 | addvirtuals(           /* add virtuals associated with source *
99   }
100  
101  
102 < extern void
102 > void
103   vproject(               /* create projected source(s) if they exist */
104          OBJREC  *o,
105          int  sn,
106          int  n
107   )
108   {
109 <        register int  i;
110 <        register VSMATERIAL  *vsmat;
109 >        int  i;
110 >        VSMATERIAL  *vsmat;
111          MAT4  proj;
112          int  ns;
113  
# Line 117 | Line 128 | vproject(              /* create projected source(s) if they exist
128   }
129  
130  
131 < extern OBJREC *
131 > OBJREC *
132   vsmaterial(                     /* get virtual source material pointer */
133          OBJREC  *o
134   )
135   {
136 <        register int  i;
137 <        register OBJREC  *m;
136 >        int  i;
137 >        OBJREC  *m;
138  
139          i = o->omod;
140 <        m = findmaterial(objptr(i));
140 >        m = findmaterial(o);
141          if (m == NULL)
142                  return(objptr(i));
143          if (m->otype != MAT_ILLUM || m->oargs.nsargs < 1 ||
# Line 137 | Line 148 | vsmaterial(                    /* get virtual source material pointer *
148   }
149  
150  
151 < extern int
151 > int
152   makevsrc(               /* make virtual source if reasonable */
153          OBJREC  *op,
154 <        register int  sn,
154 >        int  sn,
155          MAT4  pm
156   )
157   {
# Line 148 | Line 159 | makevsrc(              /* make virtual source if reasonable */
159          double  maxrad2, d;
160          int  nsflags;
161          SPOT  theirspot, ourspot;
162 <        register int  i;
163 <
162 >        int  i;
163 >                                        /* check for no-op */
164 >        if (isident4(pm))
165 >                return(0);
166          nsflags = source[sn].sflags | (SVIRTUAL|SSPOT|SFOLLOW);
167                                          /* get object center and max. radius */
168          maxrad2 = getdisk(ocent, op, sn);
# Line 263 | Line 276 | memerr:
276   }
277  
278  
279 < extern double
279 > double
280   getdisk(                /* get visible object disk */
281          FVECT  oc,
282          OBJREC  *op,
283 <        register int  sn
283 >        int  sn
284   )
285   {
286          double  rad2, roffs, offs, d, rd, rdoto;
# Line 296 | Line 309 | getdisk(               /* get visible object disk */
309   }
310  
311  
312 < extern int
312 > int
313   vstestvis(              /* pretest source visibility */
314          int  f,                 /* virtual source flags */
315          OBJREC  *o,             /* relay object */
316          FVECT  oc,              /* relay object center */
317          double  or2,            /* relay object radius squared */
318 <        register int  sn        /* target source number */
318 >        int  sn /* target source number */
319   )
320   {
321          RAY  sr;
322          FVECT  onorm;
323 <        FVECT  offsdir;
323 >        double  offsdir[3];
324          SRCINDEX  si;
325          double  or, d, d1;
326          int  stestlim, ssn;
327          int  nhit, nok;
328 <        register int  i, n;
328 >        int  i, n;
329                                  /* return if pretesting disabled */
330          if (vspretest <= 0)
331                  return(f);
# Line 323 | Line 336 | vstestvis(             /* pretest source visibility */
336                                          /* 32. == heuristic constant */
337                  n = 32.*or2/(thescene.cusize*thescene.cusize)*vspretest + .5;
338          } else {
339 <                for (i = 0; i < 3; i++)
327 <                        offsdir[i] = source[sn].sloc[i] - oc[i];
339 >                VSUB(offsdir, source[sn].sloc, oc);
340                  d = DOT(offsdir,offsdir);
341                  if (d <= FTINY)
342                          n = 2.*PI * vspretest + .5;
# Line 360 | Line 372 | vstestvis(             /* pretest source visibility */
372                                  sr.rorg[i] = oc[i] + offsdir[i] + d*onorm[i];
373                                  sr.rdir[i] = -onorm[i];
374                          }
375 +                        sr.rmax = 0.0;
376                          rayorigin(&sr, PRIMARY, NULL, NULL);
377                  } while (!(*ofun[o->otype].funp)(o, &sr));
378                                          /* check against source */
# Line 410 | Line 423 | vstestvis(             /* pretest source visibility */
423          
424  
425   #ifdef DEBUG
426 < extern void
426 > void
427   virtverb(       /* print verbose description of virtual source */
428 <        register int  sn,
428 >        int  sn,
429          FILE  *fp
430   )
431   {
419        register int  i;
420
432          fprintf(fp, "%s virtual source %d in %s %s\n",
433                          source[sn].sflags & SDISTANT ? "distant" : "local",
434                          sn, ofun[source[sn].so->otype].funame,

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines