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

Comparing ray/src/hd/rhd_odraw.c (file contents):
Revision 3.10 by gwlarson, Thu Dec 24 16:18:45 1998 UTC vs.
Revision 3.11 by gwlarson, Tue Dec 29 09:51:07 1998 UTC

# Line 25 | Line 25 | static char SCCSid[] = "$SunId$ SGI";
25   #ifndef SFREEFRAC
26   #define SFREEFRAC       0.2             /* fraction to free at a time */
27   #endif
28 + #ifndef REDRAWTHRESH
29 + #define REDRAWTHRESH    10240           /* number of samples for dissolve */
30 + #endif
31   #ifndef MAXFAN
32   #define MAXFAN          32              /* maximum arms in a triangle fan */
33   #endif
# Line 143 | Line 146 | int    n;
146                          odView[i].bmap[j].nused = 0;
147                  }
148                  odView[i].snext = nextsamp;
149 +                odView[i].n2redraw = 0;
150          }
151          CLR4ALL(odS.redraw, odS.nsamp);         /* clear redraw flags */
152          for (i = odS.nsamp; i--; ) {            /* clear values */
# Line 188 | Line 192 | double prox;
192          if (CHK4(odView[vn].pmap, vh*odView[vn].hhi + hh))
193                  i = bp->first + bp->nsamp;
194          else
195 <                i = -1;
195 >                i = 0;
196          while (i-- > bp->first)
197                  if (hh == odS.ip[i][0] && vh == odS.ip[i][1]) { /* found it! */
198                                                  /* search free list for it */
# Line 203 | Line 207 | double prox;
207                                                  bp->nused++;
208                                                  goto gotit;
209                                          }
210 <                        if (prox >= 0.999*odS.closeness(i))
210 >                        if (prox >= 0.99*odS.closeness(i))
211                                  return(-1);     /* previous sample is fine */
212                          goto gotit;
213                  }
210        DCHECK(i>=-1, WARNING, "pixel in presence map not found in block");
214          if (bp->free != ENDFREE) {      /* allocate from free list */
215                  i = bp->free;
216                  if (odS.ip[i][0] >= 0 & odS.ip[i][1] >= 0)
# Line 304 | Line 307 | FVECT  d, p;
307                  else                                    /* else map it now */
308                          tmMapPixels(odS.rgb[id], &odS.brt[id], odS.chr[id], 1);
309                  SET4(odS.redraw, id);                   /* mark for redraw */
310 +                odView[i].n2redraw++;
311          }
312   }
313  
# Line 326 | Line 330 | odRedrawAll()                          /* mark all samples for redraw */
330          for (i = odS.nsamp; i--; )
331                  if (odS.ip[i][0] >= 0)
332                          SET4(odS.redraw, i);
333 +                                        /* not right, but not important */
334 +        for (i = 0; i < odNViews; i++)
335 +                odView[i].n2redraw = odView[i].snext - odView[i].sfirst;
336   }
337  
338  
# Line 355 | Line 362 | int    vn, hmin, vmin, hmax, vmax;
362                  for (j = vmin; j <= vmax; j++) {
363                          bp = odView[vn].bmap + j*odView[vn].hlow + i;
364                          for (k = bp->nsamp; k--; )
365 <                                if (odS.ip[bp->first+k][0] >= 0)
365 >                                if (odS.ip[bp->first+k][0] >= 0) {
366                                          SET4(odS.redraw, bp->first+k);
367 +                                        odView[vn].n2redraw++;
368 +                                }
369                  }
370   }
371  
# Line 437 | Line 446 | GLfloat        *dm;
446   odUpdate(vn)                            /* update this view */
447   int     vn;
448   {
449 <        register int    i, j;
449 >        static short    primes[] = {9431,6803,4177,2659,1609,887,587,251,47,1};
450 >        int     myprime;
451 >        register int    i, n;
452  
453          DCHECK(vn<0 | vn>=odNViews, CONSISTENCY,
454                          "bad view number in odUpdate");
# Line 458 | Line 469 | int    vn;
469                          return;
470                  needmapping &= ~NEWRGB;
471          }
472 <                                        /* this code segment was too slow */
473 < #if 0
474 <        for (i = odView[vn].sfirst; i < odView[vn].snext; i++)
472 >        if (odView[vn].n2redraw <= 0)
473 >                return;
474 > #if REDRAWTHRESH
475 >        if (odView[vn].n2redraw < REDRAWTHRESH)
476 >                goto quickdraw;
477 >                                        /* pick a good prime step size */
478 >        n = odView[vn].snext - odView[vn].sfirst;
479 >        for (i = 0; primes[i]<<5 >= n; i++)
480 >                ;
481 >        while ((myprime = primes[i++]) > 1)
482 >                if (n % myprime)
483 >                        break;
484 >                                        /* dissolve in new samples */
485 >        for (i = odView[vn].sfirst; n-- > 0; i += myprime) {
486 >                if (i >= odView[vn].snext)
487 >                        i -= odView[vn].snext - odView[vn].sfirst;
488                  if (CHK4(odS.redraw, i)) {
489                          odDrawSamp(vn, i);
490                          CLR4(odS.redraw, i);
491                  }
492 < #else
492 >        }
493 >        odView[vn].n2redraw = 0;
494 >        return;
495 > quickdraw:                              /* quicker sparse flag checking */
496 > #endif
497                                          /* redraw samples at end */
498          for (i = odView[vn].snext-31; i < odView[vn].snext; i++)
499                  if (CHK4(odS.redraw, i)) {
# Line 473 | Line 501 | int    vn;
501                          CLR4(odS.redraw, i);
502                  }
503                                          /* faster flag checks in middle */
504 <        for (j = odView[vn].snext>>5; j-- > (odView[vn].sfirst+0x1f)>>5; )
505 <                for (i = 0; odS.redraw[j]; i++)         /* skips faster */
506 <                        if (odS.redraw[j] & 1L<<i) {
507 <                                odDrawSamp(vn, (j<<5)+i);
508 <                                odS.redraw[j] &= ~(1L<<i);
504 >        for (n = odView[vn].snext>>5; n-- > (odView[vn].sfirst+0x1f)>>5; )
505 >                for (i = 0; odS.redraw[n]; i++)         /* skips faster */
506 >                        if (odS.redraw[n] & 1L<<i) {
507 >                                odDrawSamp(vn, (n<<5)+i);
508 >                                odS.redraw[n] &= ~(1L<<i);
509                          }
510                                          /* redraw samples at beginning */
511          for (i = odView[vn].sfirst; i < odView[vn].sfirst+31; i++)
# Line 485 | Line 513 | int    vn;
513                          odDrawSamp(vn, i);
514                          CLR4(odS.redraw, i);
515                  }
516 < #endif
516 >        odView[vn].n2redraw = 0;
517   }
518  
519  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines