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

Comparing ray/src/rt/ambcomp.c (file contents):
Revision 2.98 by greg, Thu Apr 24 01:43:58 2025 UTC vs.
Revision 2.99 by greg, Sun Apr 27 20:20:01 2025 UTC

# Line 24 | Line 24 | static const char      RCSid[] = "$Id$";
24   #ifndef MINADIV
25   #define MINADIV         7       /* minimum # divisions in each dimension */
26   #endif
27 + #ifndef MINSDIST
28 + #define MINSDIST        0.25    /* def. min. spacing = 1/4th division */
29 + #endif
30  
31   typedef struct {
32          FVECT   p;              /* intersection point */
# Line 62 | Line 65 | ambcollision(                          /* proposed direciton collides? */
65   {
66          double  cos_thresh;
67          int     ii, jj;
68 <                                        /* min. spacing = 1/4th division */
69 <        cos_thresh = (PI/4.)/(double)hp->ns;
67 <        if (cos_thresh > 7.*PI/180.)    /* 7 degrees is enough in any case */
68 <                cos_thresh = 7.*PI/180.;
68 >
69 >        cos_thresh = (PI*MINSDIST)/(double)hp->ns;
70          cos_thresh = 1. - .5*cos_thresh*cos_thresh;
71                                          /* check existing neighbors */
72          for (ii = i-1; ii <= i+1; ii++) {
# Line 91 | Line 92 | ambcollision(                          /* proposed direciton collides? */
92   }
93  
94  
95 + #define XLOTSIZ         251             /* size of used car lot */
96 + #define CFIRST          0               /* first corner */
97 + #define COTHER          (CFIRST+4)      /* non-corner sample */
98 + #define CMAXTARGET      (int)(XLOTSIZ*MINSDIST/(1-MINSDIST))
99 + #define CXCOPY(d,s)     (excharr[d][0]=excharr[s][0], excharr[d][1]=excharr[s][1])
100 +
101   static int
102 + psample_class(double ss[2])             /* classify patch sample */
103 + {
104 +        if (ss[0] < MINSDIST) {
105 +                if (ss[1] < MINSDIST)
106 +                        return(CFIRST);
107 +                if (ss[1] > 1.-MINSDIST)
108 +                        return(CFIRST+2);
109 +        } else if (ss[0] > 1.-MINSDIST) {
110 +                if (ss[1] < MINSDIST)
111 +                        return(CFIRST+1);
112 +                if (ss[1] > 1.-MINSDIST)
113 +                        return(CFIRST+3);
114 +        }
115 +        return(COTHER);                 /* not in a corner */
116 + }
117 +
118 + static void
119 + trade_patchsamp(double ss[2])           /* trade in problem patch position */
120 + {
121 +        static float    excharr[XLOTSIZ][2];
122 +        static short    gterm[COTHER+1];
123 +        double          srep[2];
124 +        int             sclass, rclass;
125 +        int             x;
126 +                                        /* reset on corner overload */
127 +        if (gterm[COTHER-1] >= (CMAXTARGET+XLOTSIZ)/2)
128 +                memset(gterm, 0, sizeof(gterm));
129 +                                        /* (re-)initialize? */
130 +        while (gterm[COTHER] < XLOTSIZ) {
131 +                excharr[gterm[COTHER]][0] = frandom();
132 +                excharr[gterm[COTHER]][1] = frandom();
133 +                ++gterm[COTHER];
134 +        }                               /* get trade-in candidate... */
135 +        sclass = psample_class(ss);     /* submitted corner or not? */
136 +        switch (sclass) {
137 +        case COTHER:                    /* trade mid-edge with corner/any */
138 +                x = irandom( gterm[COTHER-1] > CMAXTARGET
139 +                                ? gterm[COTHER-1] : XLOTSIZ );
140 +                break;
141 +        case CFIRST:                    /* kick out of first corner */
142 +                x = gterm[CFIRST] + irandom(XLOTSIZ - gterm[CFIRST]);
143 +                break;
144 +        default:                        /* kick out of 2nd-4th corner */
145 +                x = irandom(XLOTSIZ - (gterm[sclass] - gterm[sclass-1]));
146 +                x += (x >= gterm[sclass-1])*(gterm[sclass] - gterm[sclass-1]);
147 +                break;
148 +        }
149 +        srep[0] = excharr[x][0];        /* save selected trade output */
150 +        srep[1] = excharr[x][1];
151 +                                        /* adjust our lot groups */
152 +        for (rclass = CFIRST; rclass < COTHER; rclass++)
153 +                if (x < gterm[rclass])
154 +                        break;
155 +        if (sclass < rclass) {          /* submitted group before replacement? */
156 +                CXCOPY(x, gterm[rclass-1]);
157 +                while (--rclass > sclass) {
158 +                        CXCOPY(gterm[rclass], gterm[rclass-1]);
159 +                        ++gterm[rclass];
160 +                }
161 +                x = gterm[sclass]++;
162 +        } else if (sclass > rclass) {   /* submitted group after replacement? */
163 +                --gterm[rclass];
164 +                CXCOPY(x, gterm[rclass]);
165 +                while (++rclass < sclass) {
166 +                        --gterm[rclass];
167 +                        CXCOPY(gterm[rclass-1], gterm[rclass]);
168 +                }
169 +                x = gterm[sclass-1];
170 +        }
171 +        excharr[x][0] = ss[0];          /* complete the transaction */
172 +        excharr[x][1] = ss[1];
173 +        ss[0] = srep[0];
174 +        ss[1] = srep[1];
175 + }
176 +
177 + #undef CXCOPY
178 + #undef XLOTSIZ
179 + #undef COTHER
180 + #undef CFIRST
181 +
182 +
183 + static int
184   ambsample(                              /* initial ambient division sample */
185          AMBHEMI *hp,
186          int     i,
# Line 121 | Line 210 | ambsample(                             /* initial ambient division sample */
210          hlist[1] = AI(hp,i,j);
211          hlist[2] = samplendx;
212          multisamp(ss, 2, urand(ilhash(hlist,3)+n));
213 < resample:
213 > patch_redo:
214          square2disk(spt, (j+ss[1])/hp->ns, (i+ss[0])/hp->ns);
215          zd = sqrt(1. - spt[0]*spt[0] - spt[1]*spt[1]);
216          for (ii = 3; ii--; )
# Line 129 | Line 218 | resample:
218                                  spt[1]*hp->uy[ii] +
219                                  zd*hp->onrm[ii];
220          checknorm(ar.rdir);
221 <                                        /* avoid coincident samples? */
222 <        if (!n & (ambacc > FTINY) & (hp->ns >= 4) &&
223 <                        ambcollision(hp, i, j, ar.rdir)) {
224 <                ss[0] = frandom(); ss[1] = frandom();
136 <                goto resample;          /* reject this sample */
221 >                                        /* avoid coincident samples */
222 >        if (!n & (hp->ns >= 4) && ambcollision(hp, i, j, ar.rdir)) {
223 >                trade_patchsamp(ss);
224 >                goto patch_redo;
225          }
226          dimlist[ndims++] = AI(hp,i,j) + 90171;
227          rayvalue(&ar);                  /* evaluate ray */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines