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.100 by greg, Mon Apr 28 19:30: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 replacement (result) */
150 +        srep[1] = excharr[x][1];
151 +                                        /* identify replacement class */
152 +        for (rclass = CFIRST; rclass < COTHER; rclass++)
153 +                if (x < gterm[rclass])
154 +                        break;          /* repark to keep classes grouped */
155 +        while (rclass > sclass) {       /* replacement group after submitted? */
156 +                CXCOPY(x, gterm[rclass-1]);
157 +                x = gterm[--rclass]++;
158 +        }
159 +        while (rclass < sclass) {       /* replacement group before submitted? */
160 +                --gterm[rclass];
161 +                CXCOPY(x, gterm[rclass]);
162 +                x = gterm[rclass++];
163 +        }
164 +        excharr[x][0] = ss[0];          /* complete the trade-in */
165 +        excharr[x][1] = ss[1];
166 +        ss[0] = srep[0];
167 +        ss[1] = srep[1];
168 + }
169 +
170 + #undef CXCOPY
171 + #undef XLOTSIZ
172 + #undef COTHER
173 + #undef CFIRST
174 +
175 +
176 + static int
177   ambsample(                              /* initial ambient division sample */
178          AMBHEMI *hp,
179          int     i,
# Line 121 | Line 203 | ambsample(                             /* initial ambient division sample */
203          hlist[1] = AI(hp,i,j);
204          hlist[2] = samplendx;
205          multisamp(ss, 2, urand(ilhash(hlist,3)+n));
206 < resample:
206 > patch_redo:
207          square2disk(spt, (j+ss[1])/hp->ns, (i+ss[0])/hp->ns);
208          zd = sqrt(1. - spt[0]*spt[0] - spt[1]*spt[1]);
209          for (ii = 3; ii--; )
# Line 129 | Line 211 | resample:
211                                  spt[1]*hp->uy[ii] +
212                                  zd*hp->onrm[ii];
213          checknorm(ar.rdir);
214 <                                        /* avoid coincident samples? */
215 <        if (!n & (ambacc > FTINY) & (hp->ns >= 4) &&
216 <                        ambcollision(hp, i, j, ar.rdir)) {
217 <                ss[0] = frandom(); ss[1] = frandom();
136 <                goto resample;          /* reject this sample */
214 >                                        /* avoid coincident samples */
215 >        if (!n & (hp->ns >= 4) && ambcollision(hp, i, j, ar.rdir)) {
216 >                trade_patchsamp(ss);
217 >                goto patch_redo;
218          }
219          dimlist[ndims++] = AI(hp,i,j) + 90171;
220          rayvalue(&ar);                  /* evaluate ray */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines