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

Comparing ray/src/rt/srcsamp.c (file contents):
Revision 2.19 by greg, Tue Jul 15 23:44:53 2014 UTC vs.
Revision 2.23 by greg, Fri Dec 13 00:50:55 2024 UTC

# Line 15 | Line 15 | static const char      RCSid[] = "$Id$";
15  
16   #include  "random.h"
17  
18 + #ifdef SSKIPOPT
19 + /* The following table is used for skipping sources */
20 + static uby8     *srcskipflags = NULL;           /* source inclusion lookup */
21 + static int      ssf_count = 0;                  /* number of flag entries */
22 + static int      ssf_max = 0;                    /* current array size */
23 + static uby8     *ssf_noskip = NULL;             /* set of zero flags */
24  
25 < static int
26 < srcskip(                        /* pre-emptive test for out-of-range glow */
27 <        SRCREC  *sp,
28 <        FVECT  orig
25 > uby8            *ssf_select = NULL;             /* sources we may skip */
26 >
27 > /* Find/allocate source skip flag entry (free all if NULL) */
28 > int
29 > sskip_rsi(uby8 *flags)
30 > {
31 >        uby8    *flp;
32 >        int     i;
33 >
34 >        if (flags == NULL) {            /* means clear all */
35 >                efree(srcskipflags); srcskipflags = NULL;
36 >                ssf_count = ssf_max = 0;
37 >                sskip_free(ssf_noskip);
38 >                sskip_free(ssf_select);
39 >                return(0);
40 >        }
41 >        if (ssf_noskip == NULL)         /* first call? */
42 >                ssf_noskip = sskip_new();
43 >
44 >        if (sskip_eq(flags, ssf_noskip))
45 >                return(-1);             /* nothing to skip */
46 >                                        /* search recent entries */
47 >        flp = srcskipflags + ssf_count*SSKIPFLSIZ;
48 >        for (i = ssf_count; i-- > 0; )
49 >                if (sskip_eq(flp -= SSKIPFLSIZ, flags))
50 >                        return(-2-i);   /* found it! */
51 >                                        /* else tack on new entry */
52 >        if (ssf_count >= ssf_max) {     /* need more space? */
53 >                ssf_max = ssf_count + (ssf_count>>2) + 64;
54 >                if (ssf_max <= ssf_count &&
55 >                                (ssf_max = ssf_count+1024) <= ssf_count)
56 >                        error(SYSTEM, "out of space in sskip_rsi()");
57 >
58 >                srcskipflags = (uby8 *)erealloc(srcskipflags,
59 >                                                ssf_max*SSKIPFLSIZ);
60 >        }
61 >        sskip_cpy(srcskipflags + ssf_count*SSKIPFLSIZ, flags);
62 >
63 >        return(-2 - ssf_count++);       /* return index (< -1) */
64 > }
65 >
66 > /* Get skip flags associated with RAY rsrc index (or NULL) */
67 > uby8 *
68 > sskip_flags(int rsi)
69 > {
70 >        if (rsi >= -1)
71 >                return(ssf_noskip);
72 >
73 >        if ((rsi = -2 - rsi) >= ssf_count)
74 >                error(CONSISTENCY, "bad index to sskip_flags()");
75 >
76 >        return(srcskipflags + rsi*SSKIPFLSIZ);
77 > }
78 >
79 > /* OR in a second set of flags into a first */
80 > void
81 > sskip_addflags(uby8 *dfl, const uby8 *sfl)
82 > {
83 >        int     nb = SSKIPFLSIZ;
84 >
85 >        while (nb--)
86 >                *dfl++ |= *sfl++;
87 > }
88 > #endif
89 >
90 > int
91 > srcskip(                        /* pre-emptive test for source to skip */
92 >        int  sn,
93 >        RAY  *r
94   )
95   {
96 +        SRCREC  *sp = source + sn;
97 +
98          if (sp->sflags & SSKIP)
99                  return(1);
100 <
100 > #ifdef SSKIPOPT
101 >        if (r->rsrc < -1 &&     /* ray has custom skip flags? */
102 >                        sskip_chk(sskip_flags(r->rsrc), sn))
103 >                return(1);
104 > #endif
105          if ((sp->sflags & (SPROX|SDISTANT)) != SPROX)
106                  return(0);
107  
108 <        return(dist2(orig, sp->sloc) >
108 >        return(dist2(r->rorg, sp->sloc) >
109                          (sp->sl.prox + sp->srad)*(sp->sl.prox + sp->srad));
110   }
111  
112   double
113   nextssamp(                      /* compute sample for source, rtn. distance */
114          RAY  *r,                /* origin is read, direction is set */
115 <        SRCINDEX  *si           /* source index (modified to current) */\
115 >        SRCINDEX  *si           /* source index (modified to current) */
116   )
117   {
118          int  cent[3], size[3], parr[2];
# Line 47 | Line 124 | nextsample:
124          while (++si->sp >= si->np) {    /* get next sample */
125                  if (++si->sn >= nsources)
126                          return(0.0);    /* no more */
127 <                if (srcskip(source+si->sn, r->rorg))
127 >                if (srcskip(si->sn, r))
128                          si->np = 0;
129                  else if (srcsizerat <= FTINY)
130                          nopart(si, r);
# Line 84 | Line 161 | nextsample:
161  
162          VSUM(vpos, vpos, cent, 1.0/MAXSPART);
163                                          /* avoid circular aiming failures */
164 <        if ((srcp->sflags & SCIR) && (si->np > 1 || dstrsrc > 0.7)) {
164 >        if ((srcp->sflags & SCIR) && (si->np > 1) | (dstrsrc > 0.7)) {
165                  FVECT   trim;
166                  if (srcp->sflags & (SFLAT|SDISTANT)) {
167                          d = 1.12837917;         /* correct setflatss() */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines