--- ray/src/rt/rv3.c 1989/05/24 13:55:54 1.3 +++ ray/src/rt/rv3.c 1989/06/19 13:30:04 1.6 @@ -68,7 +68,7 @@ newimage() /* start a new image */ freepkids(&ptrunk); /* set up frame */ if (ourview.hresolu > dev->xsiz || ourview.vresolu > dev->ysiz) - error(USER, "resolution mismatch"); + newview(&ourview); /* beware recursive loop! */ pframe.l = pframe.d = 0; pframe.r = ourview.hresolu; pframe.u = ourview.vresolu; pdepth = 0; @@ -247,31 +247,43 @@ register VIEW *vp; { char *err; - if (vp->hresolu > dev->xsiz || vp->vresolu > dev->ysiz) { - error(COMMAND, "view not set - resolution mismatch"); - } else if ((err = setview(vp)) != NULL) { + if (vp->hresolu > dev->xsiz || vp->vresolu > dev->ysiz) /* shrink */ + if (vp->vresolu * dev->xsiz < vp->hresolu * dev->ysiz) { + vp->vresolu = dev->xsiz * vp->vresolu / vp->hresolu; + vp->hresolu = dev->xsiz; + } else { + vp->hresolu = dev->ysiz * vp->hresolu / vp->vresolu; + vp->vresolu = dev->ysiz; + } + if ((err = setview(vp)) != NULL) { sprintf(errmsg, "view not set - %s", err); error(COMMAND, errmsg); } else if (bcmp(vp, &ourview, sizeof(VIEW))) { bcopy(&ourview, &oldview, sizeof(VIEW)); bcopy(vp, &ourview, sizeof(VIEW)); - newimage(); + newimage(); /* newimage() calls with vp=&ourview! */ } } -moveview(angle, mag, vc) /* move viewpoint */ -double angle, mag; +moveview(angle, elev, mag, vc) /* move viewpoint */ +double angle, elev, mag; FVECT vc; { extern double sqrt(), dist2(); double d; + FVECT v1; VIEW nv; register int i; VCOPY(nv.vup, ourview.vup); nv.hresolu = ourview.hresolu; nv.vresolu = ourview.vresolu; spinvector(nv.vdir, ourview.vdir, ourview.vup, angle*(PI/180.)); + if (elev != 0.0) { + fcross(v1, ourview.vup, nv.vdir); + normalize(v1); + spinvector(nv.vdir, nv.vdir, v1, elev*(PI/180.)); + } if ((nv.type = ourview.type) == VT_PAR) { nv.horiz = ourview.horiz / mag; nv.vert = ourview.vert / mag;