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.11 by schorsch, Mon Jul 21 22:30:19 2003 UTC vs.
Revision 2.20 by greg, Fri Sep 14 13:34:02 2012 UTC

# Line 21 | Line 21 | static const char      RCSid[] = "$Id$";
21   #define  MINSAMPLES     16              /* minimum number of pretest samples */
22   #define  STESTMAX       32              /* maximum seeks per sample */
23  
24 + #define FEQ(a,b)        ((a)-(b)+FTINY >= 0 && (b)-(a)+FTINY >= 0)
25  
26 +
27   static OBJECT  *vobject;                /* virtual source objects */
28   static int  nvobjects = 0;              /* number of virtual source objects */
29  
30  
31 + static int
32 + isident4(MAT4 m)
33 + {
34 +        int     i, j;
35 +
36 +        for (i = 4; i--; )
37 +                for (j = 4; j--; )
38 +                        if (!FEQ(m[i][j], i==j))
39 +                                return(0);
40 +        return(1);
41 + }
42 +
43 +
44   void
45 < markvirtuals()                  /* find and mark virtual sources */
45 > markvirtuals(void)                      /* find and mark virtual sources */
46   {
47 <        register OBJREC  *o;
48 <        register int  i;
47 >        OBJREC  *o;
48 >        int  i;
49                                          /* check number of direct relays */
50          if (directrelay <= 0)
51                  return;
# Line 70 | Line 85 | markvirtuals()                 /* find and mark virtual sources */
85  
86  
87   void
88 < addvirtuals(sn, nr)             /* add virtuals associated with source */
89 < int  sn;
90 < int  nr;
88 > addvirtuals(            /* add virtuals associated with source */
89 >        int  sn,
90 >        int  nr
91 > )
92   {
93 <        register int  i;
93 >        int  i;
94                                  /* check relay limit first */
95          if (nr <= 0)
96                  return;
# Line 88 | Line 104 | int  nr;
104  
105  
106   void
107 < vproject(o, sn, n)              /* create projected source(s) if they exist */
108 < OBJREC  *o;
109 < int  sn;
110 < int  n;
107 > vproject(               /* create projected source(s) if they exist */
108 >        OBJREC  *o,
109 >        int  sn,
110 >        int  n
111 > )
112   {
113 <        register int  i;
114 <        register VSMATERIAL  *vsmat;
113 >        int  i;
114 >        VSMATERIAL  *vsmat;
115          MAT4  proj;
116          int  ns;
117  
# Line 116 | Line 133 | int  n;
133  
134  
135   OBJREC *
136 < vsmaterial(o)                   /* get virtual source material pointer */
137 < OBJREC  *o;
136 > vsmaterial(                     /* get virtual source material pointer */
137 >        OBJREC  *o
138 > )
139   {
140 <        register int  i;
141 <        register OBJREC  *m;
140 >        int  i;
141 >        OBJREC  *m;
142  
143          i = o->omod;
144 <        m = objptr(i);
144 >        m = findmaterial(objptr(i));
145 >        if (m == NULL)
146 >                return(objptr(i));
147          if (m->otype != MAT_ILLUM || m->oargs.nsargs < 1 ||
148                          !strcmp(m->oargs.sarg[0], VOIDID) ||
149                          (i = lastmod(objndx(m), m->oargs.sarg[0])) == OVOID)
# Line 133 | Line 153 | OBJREC  *o;
153  
154  
155   int
156 < makevsrc(op, sn, pm)            /* make virtual source if reasonable */
157 < OBJREC  *op;
158 < register int  sn;
159 < MAT4  pm;
156 > makevsrc(               /* make virtual source if reasonable */
157 >        OBJREC  *op,
158 >        int  sn,
159 >        MAT4  pm
160 > )
161   {
162          FVECT  nsloc, nsnorm, ocent, v;
163          double  maxrad2, d;
164          int  nsflags;
165          SPOT  theirspot, ourspot;
166 <        register int  i;
167 <
166 >        int  i;
167 >                                        /* check for no-op */
168 >        if (isident4(pm))
169 >                return(0);
170          nsflags = source[sn].sflags | (SVIRTUAL|SSPOT|SFOLLOW);
171                                          /* get object center and max. radius */
172          maxrad2 = getdisk(ocent, op, sn);
# Line 253 | Line 276 | MAT4  pm;
276          return(i);
277   memerr:
278          error(SYSTEM, "out of memory in makevsrc");
279 +        return -1; /* pro forma return */
280   }
281  
282  
283   double
284 < getdisk(oc, op, sn)             /* get visible object disk */
285 < FVECT  oc;
286 < OBJREC  *op;
287 < register int  sn;
284 > getdisk(                /* get visible object disk */
285 >        FVECT  oc,
286 >        OBJREC  *op,
287 >        int  sn
288 > )
289   {
290          double  rad2, roffs, offs, d, rd, rdoto;
291          FVECT  rnrm, nrm;
# Line 289 | Line 314 | register int  sn;
314  
315  
316   int
317 < vstestvis(f, o, oc, or2, sn)            /* pretest source visibility */
318 < int  f;                 /* virtual source flags */
319 < OBJREC  *o;             /* relay object */
320 < FVECT  oc;              /* relay object center */
321 < double  or2;            /* relay object radius squared */
322 < register int  sn;       /* target source number */
317 > vstestvis(              /* pretest source visibility */
318 >        int  f,                 /* virtual source flags */
319 >        OBJREC  *o,             /* relay object */
320 >        FVECT  oc,              /* relay object center */
321 >        double  or2,            /* relay object radius squared */
322 >        int  sn /* target source number */
323 > )
324   {
325          RAY  sr;
326          FVECT  onorm;
327          FVECT  offsdir;
328          SRCINDEX  si;
329 <        double  or, d;
329 >        double  or, d, d1;
330          int  stestlim, ssn;
331          int  nhit, nok;
332 <        register int  i, n;
332 >        int  i, n;
333                                  /* return if pretesting disabled */
334          if (vspretest <= 0)
335                  return(f);
# Line 351 | Line 377 | register int  sn;      /* target source number */
377                                  sr.rorg[i] = oc[i] + offsdir[i] + d*onorm[i];
378                                  sr.rdir[i] = -onorm[i];
379                          }
380 <                        sr.rmax = 0.0;
355 <                        rayorigin(&sr, NULL, PRIMARY, 1.0);
380 >                        rayorigin(&sr, PRIMARY, NULL, NULL);
381                  } while (!(*ofun[o->otype].funp)(o, &sr));
382                                          /* check against source */
383                  VCOPY(sr.rorg, sr.rop); /* starting from intersection */
# Line 366 | Line 391 | register int  sn;      /* target source number */
391                  }
392                  sr.revf = srcvalue;
393                  rayvalue(&sr);                  /* check sample validity */
394 <                if (bright(sr.rcol) <= FTINY)
394 >                if ((d = bright(sr.rcol)) <= FTINY)
395                          continue;
396                  nok++;                  /* got sample; check obstructions */
397                  rayclear(&sr);
398                  sr.revf = raytrace;
399                  rayvalue(&sr);
400 <                if (bright(sr.rcol) > FTINY)
400 >                if ((d1 = bright(sr.rcol)) > FTINY) {
401 >                        if (d - d1 > FTINY) {
402 > #ifdef DEBUG
403 >                                fprintf(stderr, "\tpartially shadowed\n");
404 > #endif
405 >                                return(f);      /* intervening transmitter */
406 >                        }
407                          nhit++;
408 +                }
409                  if (nhit > 0 && nhit < nok) {
410   #ifdef DEBUG
411                          fprintf(stderr, "\tpartially occluded\n");
# Line 396 | Line 428 | register int  sn;      /* target source number */
428  
429   #ifdef DEBUG
430   void
431 < virtverb(sn, fp)        /* print verbose description of virtual source */
432 < register int  sn;
433 < FILE  *fp;
431 > virtverb(       /* print verbose description of virtual source */
432 >        int  sn,
433 >        FILE  *fp
434 > )
435   {
403        register int  i;
404
436          fprintf(fp, "%s virtual source %d in %s %s\n",
437                          source[sn].sflags & SDISTANT ? "distant" : "local",
438                          sn, ofun[source[sn].so->otype].funame,

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines