--- ray/src/rt/rv3.c 2003/02/22 02:07:29 2.10
+++ ray/src/rt/rv3.c 2005/02/18 17:47:53 2.16
@@ -1,5 +1,5 @@
#ifndef lint
-static const char RCSid[] = "$Id: rv3.c,v 2.10 2003/02/22 02:07:29 greg Exp $";
+static const char RCSid[] = "$Id: rv3.c,v 2.16 2005/02/18 17:47:53 greg Exp $";
#endif
/*
* rv3.c - miscellaneous routines for rview.
@@ -7,67 +7,12 @@ static const char RCSid[] = "$Id: rv3.c,v 2.10 2003/02
* External symbols declared in rpaint.h
*/
-/* ====================================================================
- * The Radiance Software License, Version 1.0
- *
- * Copyright (c) 1990 - 2002 The Regents of the University of California,
- * through Lawrence Berkeley National Laboratory. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes Radiance software
- * (http://radsite.lbl.gov/)
- * developed by the Lawrence Berkeley National Laboratory
- * (http://www.lbl.gov/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Radiance," "Lawrence Berkeley National Laboratory"
- * and "The Regents of the University of California" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact radiance@radsite.lbl.gov.
- *
- * 5. Products derived from this software may not be called "Radiance",
- * nor may "Radiance" appear in their name, without prior written
- * permission of Lawrence Berkeley National Laboratory.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of Lawrence Berkeley National Laboratory. For more
- * information on Lawrence Berkeley National Laboratory, please see
- * .
- */
+#include "copyright.h"
-#include "ray.h"
+#include
+#include "ray.h"
#include "rpaint.h"
-
#include "random.h"
#ifndef WFLUSH
@@ -177,9 +122,14 @@ double *mp;
VCOPY(vec, thisray.rdir);
else
VCOPY(vec, thisray.rop);
- } else if (direc)
- for (i = 0; i < 3; i++)
- vec[i] -= ourview.vp[i];
+ } else if (direc) {
+ for (i = 0; i < 3; i++)
+ vec[i] -= ourview.vp[i];
+ if (normalize(vec) == 0.0) {
+ error(COMMAND, "point at view origin");
+ return(-1);
+ }
+ }
return(0);
}
@@ -426,9 +376,9 @@ register VIEW *vp;
if ((err = setview(vp)) != NULL) {
sprintf(errmsg, "view not set - %s", err);
error(COMMAND, errmsg);
- } else if (bcmp((char *)vp, (char *)&ourview, sizeof(VIEW))) {
- copystruct(&oldview, &ourview);
- copystruct(&ourview, vp);
+ } else if (memcmp((char *)vp, (char *)&ourview, sizeof(VIEW))) {
+ oldview = ourview;
+ ourview = *vp;
newimage();
}
}
@@ -441,37 +391,32 @@ FVECT vc;
{
double d;
FVECT v1;
- VIEW nv;
+ VIEW nv = ourview;
register int i;
- VCOPY(nv.vup, ourview.vup);
- nv.hoff = ourview.hoff; nv.voff = ourview.voff;
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;
+ if (nv.type == VT_PAR) {
+ nv.horiz /= mag;
+ nv.vert /= mag;
d = 0.0; /* don't move closer */
for (i = 0; i < 3; i++)
d += (vc[i] - ourview.vp[i])*ourview.vdir[i];
- nv.vfore = ourview.vfore;
- nv.vaft = ourview.vaft;
} else {
- nv.horiz = ourview.horiz;
- nv.vert = ourview.vert;
d = sqrt(dist2(ourview.vp, vc)) / mag;
- if ((nv.vfore = ourview.vfore) > FTINY) {
+ if (nv.vfore > FTINY) {
nv.vfore += d - d*mag;
if (nv.vfore < 0.0) nv.vfore = 0.0;
}
- if ((nv.vaft = ourview.vaft) > FTINY) {
+ if (nv.vaft > FTINY) {
nv.vaft += d - d*mag;
if (nv.vaft <= nv.vfore) nv.vaft = 0.0;
}
+ nv.vdist /= mag;
}
for (i = 0; i < 3; i++)
nv.vp[i] = vc[i] - d*nv.vdir[i];