--- ray/src/rt/rv3.c 1990/01/09 09:07:33 1.10 +++ ray/src/rt/rv3.c 1990/03/08 10:28:29 1.15 @@ -18,7 +18,11 @@ static char SCCSid[] = "$SunId$ LBL"; #include "random.h" +#ifndef WFLUSH +#define WFLUSH 30 /* flush after this many rays */ +#endif + getrect(s, r) /* get a box */ char *s; register RECT *r; @@ -130,6 +134,8 @@ paint(p, xmin, ymin, xmax, ymax) /* compute and paint register PNODE *p; int xmin, ymin, xmax, ymax; { + extern long nrays; + static long lastflush = 0; static RAY thisray; double h, v; register int i; @@ -141,22 +147,24 @@ int xmin, ymin, xmax, ymax; return; } /* jitter ray direction */ - p->x = h = xmin + (xmax-xmin)*frandom(); - h /= hresolu; - p->y = v = ymin + (ymax-ymin)*frandom(); - v /= vresolu; + h = xmin + (xmax-xmin)*frandom(); + v = ymin + (ymax-ymin)*frandom(); - viewray(thisray.rorg, thisray.rdir, &ourview, h, v); - + viewray(thisray.rorg, thisray.rdir, &ourview, h/hresolu, v/vresolu); rayorigin(&thisray, NULL, PRIMARY, 1.0); - rayvalue(&thisray); + p->x = h; + p->y = v; copycolor(p->v, thisray.rcol); - scalecolor(p->v, exposure); (*dev->paintr)(greyscale?greyof(p->v):p->v, xmin, ymin, xmax, ymax); + + if (dev->flush != NULL && nrays - lastflush >= WFLUSH) { + lastflush = nrays; + (*dev->flush)(); + } } @@ -167,7 +175,7 @@ newimage() /* start a new image */ /* compute resolution */ hresolu = dev->xsiz; vresolu = dev->ysiz; - normaspect(&ourview, &dev->pixaspect, &hresolu, &vresolu); + normaspect(viewaspect(&ourview), &dev->pixaspect, &hresolu, &vresolu); pframe.l = pframe.d = 0; pframe.r = hresolu; pframe.u = vresolu; pdepth = 0; @@ -346,10 +354,10 @@ register VIEW *vp; if ((err = setview(vp)) != NULL) { sprintf(errmsg, "view not set - %s", err); error(COMMAND, errmsg); - } else if (bcmp(vp, &ourview, sizeof(VIEW))) { - copyview(&oldview, &ourview); - copyview(&ourview, vp); - newimage(); /* newimage() calls with vp=&ourview! */ + } else if (bcmp((char *)vp, (char *)&ourview, sizeof(VIEW))) { + copystruct(&oldview, &ourview); + copystruct(&ourview, vp); + newimage(); } }