--- ray/src/rt/rv3.c 2008/08/21 16:13:00 2.23 +++ ray/src/rt/rv3.c 2008/09/05 19:45:41 2.27 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: rv3.c,v 2.23 2008/08/21 16:13:00 greg Exp $"; +static const char RCSid[] = "$Id: rv3.c,v 2.27 2008/09/05 19:45:41 greg Exp $"; #endif /* * rv3.c - miscellaneous routines for rview. @@ -25,7 +25,7 @@ static const char RCSid[] = "$Id: rv3.c,v 2.23 2008/08 #define sscanvec(s,v) (sscanf(s,"%lf %lf %lf",v,v+1,v+2)==3) #endif -static int niflush; /* flushes since newimage() */ +static unsigned long niflush; /* flushes since newimage() */ int getrect( /* get a box */ @@ -146,7 +146,27 @@ greyof( /* convert color to greyscale */ return(gcol); } +static void +recolor( /* recolor the given node */ + PNODE *p +) +{ + while (p->kid != NULL) { /* need to propogate down */ + int mx = (p->xmin + p->xmax) >> 1; + int my = (p->ymin + p->ymax) >> 1; + int ki; + if (p->x >= mx) + ki = (p->y >= my) ? UR : DR; + else + ki = (p->y >= my) ? UL : DL; + pcopy(p, p->kid+ki); + p = p->kid + ki; + } + (*dev->paintr)(greyscale?greyof(p->v):p->v, + p->xmin, p->ymin, p->xmax, p->ymax); +} + int paint( /* compute and paint a rectangle */ PNODE *p @@ -155,6 +175,7 @@ paint( /* compute and paint a rectangle */ extern int ray_pnprocs; static unsigned long lastflush = 0; static RAY thisray; + int flushintvl; double h, v; if (p->xmax - p->xmin <= 0 || p->ymax - p->ymin <= 0) { /* empty */ @@ -185,11 +206,16 @@ paint( /* compute and paint a rectangle */ copycolor(p->v, thisray.rcol); scalecolor(p->v, exposure); - (*dev->paintr)(greyscale?greyof(p->v):p->v, - p->xmin, p->ymin, p->xmax, p->ymax); + recolor(p); /* paint it */ - if (dev->flush != NULL && raynum - lastflush >= ray_pnprocs * - (ambounce > 0 && niflush < WFLUSH ? niflush : WFLUSH)) { + if (ambounce <= 0) /* shall we check for input? */ + flushintvl = ray_pnprocs*WFLUSH; + else if (niflush < WFLUSH) + flushintvl = ray_pnprocs*niflush/(ambounce+1); + else + flushintvl = ray_pnprocs*WFLUSH/(ambounce+1); + + if (dev->flush != NULL && raynum - lastflush >= flushintvl) { lastflush = raynum; (*dev->flush)(); niflush++; @@ -199,7 +225,7 @@ paint( /* compute and paint a rectangle */ int -waitrays(void) /* finish up pending rays */ +waitrays(void) /* finish up pending rays */ { int nwaited = 0; int rval; @@ -209,8 +235,7 @@ waitrays(void) /* finish up pending rays */ PNODE *p = (PNODE *)raydone.rno; copycolor(p->v, raydone.rcol); scalecolor(p->v, exposure); - (*dev->paintr)(greyscale?greyof(p->v):p->v, - p->xmin, p->ymin, p->xmax, p->ymax); + recolor(p); nwaited++; } if (rval < 0) @@ -348,6 +373,26 @@ findrect( /* find a rectangle */ } } return(p); +} + + +void +compavg( /* recompute averages */ + PNODE *p +) +{ + if (p->kid == NULL) + return; + compavg(p->kid+DL); + compavg(p->kid+DR); + compavg(p->kid+UL); + compavg(p->kid+UR); + setcolor(p->v, .0, .0, .0); + addcolor(p->v, p->kid[DL].v); + addcolor(p->v, p->kid[DR].v); + addcolor(p->v, p->kid[UL].v); + addcolor(p->v, p->kid[UR].v); + scalecolor(p->v, 0.25); }