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.5 by gwlarson, Tue Dec 22 17:05:54 1998 UTC vs.
Revision 3.6 by gwlarson, Wed Dec 23 17:42:24 1998 UTC

# Line 14 | Line 14 | static char SCCSid[] = "$SunId$ SGI";
14   #include <GL/glx.h>
15   #include <GL/glu.h>
16  
17 #include "random.h"
17   #include "rhd_odraw.h"
18  
19   #ifndef DEPTHEPS
# Line 318 | Line 317 | int    newhist;
317   }
318  
319  
320 + odRedrawAll()                           /* mark all samples for redraw */
321 + {
322 +        register int    i;
323 +
324 +        if ((needmapping&(NEWMAP|NEWRGB)) == (NEWMAP|NEWRGB))
325 +                return;                 /* will be called later, anyway */
326 +        for (i = odS.nsamp; i--; )
327 +                if (odS.ip[i][0] >= 0)
328 +                        SET4(odS.redraw, i);
329 + }
330 +
331 +
332   odRedraw(vn, hmin, vmin, hmax, vmax)    /* redraw view region */
333   int     vn, hmin, vmin, hmax, vmax;
334   {
# Line 435 | Line 446 | int    vn;
446                  if (needmapping & NEWMAP) {
447                          if (needmapping & NEWHIST)
448                                  tmClearHisto();
449 +                        needmapping &= ~NEWHIST;
450                          if (tmAddHisto(odS.brt,odS.nsamp,1) != TM_E_OK)
451                                  return;
452                          if (tmComputeMapping(0.,0.,0.) != TM_E_OK)
453                                  return;
454 <                        for (i = odS.nsamp; i--; )      /* redraw all */
455 <                                if (odS.ip[i][0] >= 0)
444 <                                        SET4(odS.redraw, i);
454 >                        needmapping &= ~NEWMAP;
455 >                        odRedrawAll();                  /* redraw everything */
456                  }
457                  if (tmMapPixels(odS.rgb,odS.brt,odS.chr,odS.nsamp) != TM_E_OK)
458                          return;
459 <                needmapping = 0;                /* reset flag */
459 >                needmapping &= ~NEWRGB;
460          }
461                                          /* this code segment was too slow */
462   #if 0
# Line 454 | Line 465 | int    vn;
465                          odDrawSamp(vn, i);
466                          CLR4(odS.redraw, i);
467                  }
468 < #endif
468 > #else
469                                          /* redraw samples at each end */
470          for (i = odView[vn].sfirst; i < odView[vn].sfirst+31; i++)
471                  if (CHK4(odS.redraw, i)) {
# Line 473 | Line 484 | int    vn;
484                                  odDrawSamp(vn, (j<<5)+i);
485                                  odS.redraw[j] &= ~(1L<<i);
486                          }
487 + #endif
488   }
489  
490  
# Line 514 | Line 526 | register struct ODview *vp;
526   double  sz;
527   {
528          int     na, dv;
529 <        double  hrad, vrad, phi0, phi;
529 >        double  hrad, vrad, phi;
530          register int    i;
531  
532          DCHECK(sz > 1, CONSISTENCY, "super-unary size in make_arms");
# Line 524 | Line 536 | double sz;
536          vrad = FANSIZE*sz*vp->vhi/vp->vlow;
537          if (hrad*vrad < 2.25)
538                  hrad = vrad = 1.5;
527        phi0 = (2.*PI) * frandom();
539          dv = OMAXDEPTH*sz + 0.5;
540          for (i = 0; i < na; i++) {
541 <                phi = phi0 + (2.*PI)*i/na;
541 >                phi = (2.*PI)*i/na;
542                  ar[i][0] = cp[0] + tcos(phi)*hrad + 0.5;
543                  ar[i][1] = cp[1] + tsin(phi)*vrad + 0.5;
544                  ar[i][2] = dv;
# Line 612 | Line 623 | register int   h, v;
623   }
624  
625  
626 + static int
627 + blockedge(vp, bi0, bi1)                 /* check for edge between blocks? */
628 + register struct ODview  *vp;
629 + register int    bi0, bi1;
630 + {
631 +        if (bi1 < 0)
632 +                return(1);              /* end off view */
633 +        if (CHK4(vp->emap, bi1))
634 +                return(1);              /* end has edges */
635 +        if (bi1 == bi0+1 || bi1 == bi0-1 ||
636 +                        bi1 == bi0+vp->hlow || bi1 == bi0-vp->hlow)
637 +                return(0);              /* end in adjacent block -- no edges */
638 +        return(1);                      /* conservative for rarer case */
639 + }
640 +
641 +
642   odDrawSamp(vn, id)                      /* draw view sample */
643   int     vn;
644   register int    id;
645   {
646          GLshort arm[MAXFAN][3];
647 <        int     narms, blockindex, bi1;
647 >        int     narms, blockindex;
648          register struct ODview  *vp;
649          double  size;
650          int     home_edges;
# Line 634 | Line 661 | register int   id;
661          if (vp->emap != NULL) {         /* check for edge collisions */
662                  home_edges = CHK4(vp->emap, blockindex);
663                  for (i = 0; i < narms; i++)
664 <                        /* the following test is flawed, because we could
665 <                         * be passing through a block on a diagonal run */
639 <                        if (home_edges ||
640 <                                ( (bi1 = getblock(vp, arm[i][0], arm[i][1]))
641 <                                                != blockindex &&
642 <                                        (bi1 < 0 || CHK4(vp->emap, bi1)) ))
664 >                        if (home_edges || blockedge(vp, blockindex,
665 >                                        getblock(vp, arm[i][0], arm[i][1])))
666                                  clip_edge(arm[i], odS.ip[id], vp);
667          }
668                                          /* draw triangle fan */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines