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.5 by gwlarson, Tue Mar 9 11:41:29 1999 UTC vs.
Revision 3.7 by gwlarson, Tue Mar 9 14:48:06 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 143 | 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 203 | Line 204 | int    n;
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 +        float   nwt[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 +                                                /* compute neighbor weights */
228 +        for (i = n; i--; ) {
229 +                r2 = (nl[i][0]-h)*(nl[i][0]-h) + (nl[i][1]-v)*(nl[i][1]-v);
230 +                nwt[i] = pixWeight[r2];
231 +        }
232 +                                                /* sample kernel */
233 +        for (v2 = v-maxr; v2 <= v+maxr; v2++) {
234 +                if (v2 < 0) v2 = 0;
235 +                else if (v2 >= vres) break;
236 +                for (h2 = h-maxr; h2 <= h+maxr; h2++) {
237 +                        if (h2 < 0) h2 = 0;
238 +                        else if (h2 >= hres) break;
239 +                        r2 = (h2-h)*(h2-h) + (v2-v)*(v2-v);
240 +                        if (r2 > maxr2) continue;
241 +                        if (CHK4(pixFlags, v2*hres+h2))
242 +                                continue;       /* occupied */
243 +                        if (frandom() < *rf) {  /* pick neighbor instead */
244 +                                i = random() % n;
245 +                                r2 = nl[i][1]*hres + nl[i][0];
246 +                                copycolor(ctmp, mypixel[r2]);
247 +                                scalecolor(ctmp, nwt[i]);
248 +                                addcolor(mypixel[v2*hres+h2], ctmp);
249 +                                myweight[v2*hres+h2] += nwt[i] * myweight[r2];
250 +                                continue;
251 +                        }
252 +                        copycolor(ctmp, mypixel[p]);
253 +                        scalecolor(ctmp, pixWeight[r2]);
254 +                        addcolor(mypixel[v2*hres+h2], ctmp);
255 +                        myweight[v2*hres+h2] += pixWeight[r2] * myweight[p];
256 +                }
257 +        }
258 +        return(1);
259 + }
260 +
261 +
262 + pixFinish(ransamp)              /* done with beams -- compute pixel values */
263 + double  ransamp;
264 + {
265          if (pixWeight[0] <= FTINY)
266                  init_wfunc();           /* initialize weighting function */
267          reset_flags();                  /* set occupancy flags */
268 <        meet_neighbors(kill_occl);      /* eliminate occlusion errors */
268 >        meet_neighbors(kill_occl,NULL); /* eliminate occlusion errors */
269          reset_flags();                  /* reset occupancy flags */
270 <        meet_neighbors(grow_samp);      /* grow valid samples over image */
270 >        if (ransamp >= 0.)              /* spread samples over image */
271 >                meet_neighbors(random_samp,&ransamp);
272 >        else
273 >                meet_neighbors(smooth_samp,NULL);
274          free((char *)pixFlags);         /* free pixel flags */
275          pixFlags = NULL;
276   }
# Line 233 | Line 293 | reset_flags()                  /* allocate/set/reset occupancy flags
293  
294   init_wfunc()                    /* initialize weighting function */
295   {
236        register int    i, j;
296          register int4   r2;
297          register double d;
298  
299 <        for (i = 1; i <= MAXRAD; i++)
300 <                for (j = 0; j <= i; j++) {
301 <                        r2 = i*i + j*j;
302 <                        if (r2 >= MAXRAD2) break;
303 <                        d = sqrt((double)r2);
245 <                        pixWeight[r2] = G0NORM/d;
246 <                        isqrttab[r2] = d + 0.99;
247 <                }
299 >        for (r2 = MAXRAD2; --r2; ) {
300 >                d = sqrt((double)r2);
301 >                pixWeight[r2] = G0NORM/d;
302 >                isqrttab[r2] = d + 0.99;
303 >        }
304          pixWeight[0] = 1.;
305          isqrttab[0] = 0;
306   }
# Line 291 | Line 347 | register short (*rnl)[NNEIGH];
347   }
348  
349  
350 < meet_neighbors(nf)              /* run through samples and their neighbors */
350 > meet_neighbors(nf, dp)          /* run through samples and their neighbors */
351   int     (*nf)();
352 + char    *dp;
353   {
354          short   ln[NNEIGH][2];
355          int     h, v, n, v2;
# Line 316 | Line 373 | int    (*nf)();
373                          if (!CHK4(pixFlags, v*hres+h))
374                                  continue;       /* no one home */
375                          n = findneigh(ln, h, v, rnl);
376 <                        (*nf)(h, v, ln, n);     /* call on neighbors */
376 >                        (*nf)(h, v, ln, n, dp); /* call on neighbors */
377                  }
378                  if (++v >= vres)                /* reinitialize row list */
379                          break;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines