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

Comparing ray/src/rt/srcobstr.c (file contents):
Revision 2.12 by greg, Tue Apr 19 01:15:07 2005 UTC vs.
Revision 2.16 by greg, Mon Feb 14 20:13:38 2011 UTC

# Line 11 | Line 11 | static const char RCSid[] = "$Id$";
11  
12   #include  "otspecial.h"
13  
14 + #include  "rtotypes.h"
15 +
16   #include  "source.h"
17  
18   #define ABS(x)  ((x)>0 ? (x) : -(x))
# Line 19 | Line 21 | static const char RCSid[] = "$Id$";
21   #if  SHADCACHE                  /* preemptive shadow checking */
22  
23  
24 + OBJECT *        antimodlist = NULL;     /* set of clipped materials */
25 +
26 +
27   static int                              /* cast source ray to first blocker */
28   castshadow(int sn, FVECT rorg, FVECT rdir)
29   {
# Line 175 | Line 180 | initobscache(int sn)
180   static OBJECT *                 /* return occluder cache entry */
181   srcobstructp(register RAY *r)
182   {
183 <        static unsigned long    lastrno = ~0;
183 >        static RNUMBER  lastrno = ~0;
184          static OBJECT   noobs;
185          static OBJECT   *lastobjp;
186          SRCREC          *srcp;
# Line 292 | Line 297 | srcblocker(register RAY *r)
297                  return(0);              /* don't record complex blockers */
298          if (r->rsrc < 0 || source[r->rsrc].so == r->ro)
299                  return(0);              /* just a mistake, that's all */
300 +        if (antimodlist != NULL && inset(antimodlist, r->ro->omod))
301 +                return(0);              /* could be clipped */
302          m = findmaterial(r->ro);
303          if (m == NULL)
304                  return(0);              /* no material?! */
# Line 320 | Line 327 | srcblocked(RAY *r)
327                  return(1);
328          rayclear(r);
329          return(0);                      /* source in front */
330 + }
331 +
332 +
333 + void                            /* record potentially clipped materials */
334 + markclip(OBJREC *m)
335 + {
336 +        OBJECT  *set2add, *oldset;
337 +
338 +        if (m == NULL) {                /* starting over */
339 +                if (antimodlist != NULL)
340 +                        free((void *)antimodlist);
341 +                antimodlist = NULL;
342 +                return;
343 +        }
344 +        m_clip(m, NULL);                /* initialize modifier list */
345 +        if ((set2add = (OBJECT *)m->os) == NULL || !set2add[0])
346 +                return;
347 +
348 +        if (antimodlist == NULL) {      /* start of list */
349 +                antimodlist = setsave(set2add);
350 +                return;
351 +        }
352 +                                        /* else add to previous list */
353 +        oldset = antimodlist;
354 +        antimodlist = (OBJECT *)malloc((oldset[0]+set2add[0]+1)*sizeof(OBJECT));
355 +        if (antimodlist == NULL)
356 +                error(SYSTEM, "out of memory in markclip");
357 +        setunion(antimodlist, oldset, set2add);
358 +        free((void *)oldset);
359 + }
360 +
361 +
362 + #else   /* SHADCACHE */
363 +
364 +
365 + void                            /* no-op also avoids linker warning */
366 + markclip(OBJREC *m)
367 + {
368 +        (void)m;
369   }
370  
371  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines