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

Comparing ray/src/hd/rhpict2.c (file contents):
Revision 3.4 by gwlarson, Mon Mar 8 17:34:24 1999 UTC vs.
Revision 3.8 by gwlarson, Tue Mar 9 15:08:22 1999 UTC

# Line 10 | Line 10 | static char SCCSid[] = "$SunId$ SGI";
10  
11   #include "holo.h"
12   #include "view.h"
13 + #include "random.h"
14  
15   #ifndef DEPS
16   #define DEPS            0.02    /* depth epsilon */
# Line 120 | Line 121 | int    n;
121          int     d;
122          register int4   i, p;
123  
124 <        if (n <= 0)
124 >        if (n <= 0) {
125 > #ifdef DEBUG
126 >                error(WARNING, "neighborless sample in kill_occl");
127 > #endif
128                  return(1);
129 +        }
130          p = v*hres + h;
131          forequad[0][0] = forequad[0][1] = forequad[1][0] = forequad[1][1] = 0;
132          for (i = n; i--; ) {
# Line 139 | Line 144 | int    n;
144  
145  
146   int
147 < grow_samp(h, v, nl, n)          /* grow sample point appropriately */
147 > smooth_samp(h, v, nl, n)        /* grow sample point smoothly */
148   int     h, v;
149   register short  nl[NNEIGH][2];
150   int     n;
# Line 147 | Line 152 | int    n;
152          int     dis[NNEIGH], ndis;
153          COLOR   mykern[MAXRAD2];
154          int4    maxr2;
155 <        double  w, d;
155 >        double  d;
156          register int4   p, r2;
157          int     i, r, maxr, h2, v2;
158  
# Line 192 | Line 197 | int    n;
197                          }
198                          if (i >= 0) continue;   /* outside edge */
199                          addcolor(mypixel[v2*hres+h2], mykern[r2]);
200 <                        myweight[v2*hres+h2] += pixWeight[r2] *
196 <                                                        myweight[v*hres+h];
200 >                        myweight[v2*hres+h2] += pixWeight[r2] * myweight[p];
201                  }
202          }
203          return(1);
204   }
205  
206  
207 < pixFlush()                      /* done with beams -- flush pixel values */
207 > int
208 > random_samp(h, v, nl, n, rf)    /* grow sample point noisily */
209 > int     h, v;
210 > register short  nl[NNEIGH][2];
211 > int     n;
212 > double  *rf;
213   {
214 <        reset_flags();                  /* set occupancy flags */
215 <        meet_neighbors(kill_occl);      /* eliminate occlusion errors */
216 <        reset_flags();                  /* reset occupancy flags */
214 >        double  tv = *rf * (1.-1./NNEIGH);
215 >        int4    maxr2;
216 >        register int4   p, r2;
217 >        register int    i;
218 >        int     maxr, h2, v2;
219 >        COLOR   ctmp;
220 >
221 >        if (n <= 0)
222 >                return(1);
223 >        p = v*hres + h;                         /* compute kernel radius */
224 >        maxr2 = (h-nl[n-1][0])*(h-nl[n-1][0]) + (v-nl[n-1][1])*(v-nl[n-1][1]);
225 >        DCHECK(maxr2>=MAXRAD2, CONSISTENCY, "out of range neighbor");
226 >        maxr = isqrt(maxr2);
227 >                                                /* sample kernel */
228 >        for (v2 = v-maxr; v2 <= v+maxr; v2++) {
229 >                if (v2 < 0) v2 = 0;
230 >                else if (v2 >= vres) break;
231 >                for (h2 = h-maxr; h2 <= h+maxr; h2++) {
232 >                        if (h2 < 0) h2 = 0;
233 >                        else if (h2 >= hres) break;
234 >                        r2 = (h2-h)*(h2-h) + (v2-v)*(v2-v);
235 >                        if (r2 > maxr2) continue;
236 >                        if (CHK4(pixFlags, v2*hres+h2))
237 >                                continue;       /* occupied */
238 >                        if (frandom() < tv) {   /* use neighbor instead? */
239 >                                i = random() % n;
240 >                                r2 = nl[i][1]*hres + nl[i][0];
241 >                                copycolor(ctmp, mypixel[r2]);
242 >                                r2 = (h2-nl[i][0])*(h2-nl[i][0]) +
243 >                                                (v2-nl[i][1])*(v2-nl[i][1]);
244 >                                if (r2 < MAXRAD2) {
245 >                                        scalecolor(ctmp, pixWeight[r2]);
246 >                                        addcolor(mypixel[v2*hres+h2], ctmp);
247 >                                        myweight[v2*hres+h2] += pixWeight[r2] *
248 >                                              myweight[nl[i][1]*hres+nl[i][0]];
249 >                                        continue;
250 >                                }
251 >                        }
252 >                                                /* use central sample */
253 >                        copycolor(ctmp, mypixel[p]);
254 >                        scalecolor(ctmp, pixWeight[r2]);
255 >                        addcolor(mypixel[v2*hres+h2], ctmp);
256 >                        myweight[v2*hres+h2] += pixWeight[r2] * myweight[p];
257 >                }
258 >        }
259 >        return(1);
260 > }
261 >
262 >
263 > pixFinish(ransamp)              /* done with beams -- compute pixel values */
264 > double  ransamp;
265 > {
266          if (pixWeight[0] <= FTINY)
267                  init_wfunc();           /* initialize weighting function */
268 <        meet_neighbors(grow_samp);      /* grow valid samples over image */
268 >        reset_flags();                  /* set occupancy flags */
269 >        meet_neighbors(kill_occl,NULL); /* eliminate occlusion errors */
270 >        reset_flags();                  /* reset occupancy flags */
271 >        if (ransamp >= 0.)              /* spread samples over image */
272 >                meet_neighbors(random_samp,&ransamp);
273 >        else
274 >                meet_neighbors(smooth_samp,NULL);
275          free((char *)pixFlags);         /* free pixel flags */
276          pixFlags = NULL;
277   }
# Line 230 | Line 294 | reset_flags()                  /* allocate/set/reset occupancy flags
294  
295   init_wfunc()                    /* initialize weighting function */
296   {
233        register int    i, j;
297          register int4   r2;
298          register double d;
299  
300 <        for (i = 1; i <= MAXRAD; i++)
301 <                for (j = 0; j <= i; j++) {
302 <                        r2 = i*i + j*j;
303 <                        if (r2 >= MAXRAD2) break;
304 <                        d = sqrt((double)r2);
242 <                        pixWeight[r2] = G0NORM/d;
243 <                        isqrttab[r2] = d + 0.99;
244 <                }
300 >        for (r2 = MAXRAD2; --r2; ) {
301 >                d = sqrt((double)r2);
302 >                pixWeight[r2] = G0NORM/d;
303 >                isqrttab[r2] = d + 0.99;
304 >        }
305          pixWeight[0] = 1.;
306          isqrttab[0] = 0;
307   }
# Line 288 | Line 348 | register short (*rnl)[NNEIGH];
348   }
349  
350  
351 < meet_neighbors(nf)              /* run through samples and their neighbors */
351 > meet_neighbors(nf, dp)          /* run through samples and their neighbors */
352   int     (*nf)();
353 + char    *dp;
354   {
355          short   ln[NNEIGH][2];
356          int     h, v, n, v2;
# Line 313 | Line 374 | int    (*nf)();
374                          if (!CHK4(pixFlags, v*hres+h))
375                                  continue;       /* no one home */
376                          n = findneigh(ln, h, v, rnl);
377 <                        (*nf)(h, v, ln, n);     /* call on neighbors */
377 >                        (*nf)(h, v, ln, n, dp); /* call on neighbors */
378                  }
379                  if (++v >= vres)                /* reinitialize row list */
380                          break;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines