ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/image.c
(Generate patch)

Comparing ray/src/common/image.c (file contents):
Revision 2.41 by greg, Wed Jan 24 03:34:15 2018 UTC vs.
Revision 2.52 by greg, Fri Feb 12 00:47:08 2021 UTC

# Line 15 | Line 15 | static const char      RCSid[] = "$Id$";
15   #include  "paths.h"
16   #include  "view.h"
17  
18
19 #define  FEQ(x,y)       (fabs((x)-(y)) <= FTINY)
20 #define  VEQ(v,w)       (FEQ((v)[0],(w)[0]) && FEQ((v)[1],(w)[1]) \
21                                && FEQ((v)[2],(w)[2]))
22
18   VIEW  stdview = STDVIEW;                /* default view parameters */
19  
20   static gethfunc gethview;
# Line 231 | Line 226 | viewloc(                       /* find image location for point */
226   FVECT  ip,
227   VIEW  *v,
228   FVECT  p
229 < )
229 > )       /* Use VL_* flags to interpret return value */
230   {
231 +        int     rflags = VL_GOOD;
232          double  d, d2;
233          FVECT  disp;
234  
# Line 244 | Line 240 | FVECT  p
240                  break;
241          case VT_PER:                    /* perspective view */
242                  d = DOT(disp,v->vdir);
243 +                if ((v->vaft > FTINY) & (d >= v->vaft))
244 +                        rflags |= VL_BEYOND;
245                  ip[2] = VLEN(disp);
246 <                if (d < 0.0) {          /* fold pyramid */
246 >                if (d < -FTINY) {       /* fold pyramid */
247                          ip[2] = -ip[2];
248                          d = -d;
249 <                }
250 <                if (d <= FTINY)
253 <                        return(0);      /* at infinite edge */
249 >                } else if (d <= FTINY)
250 >                        return(VL_BAD); /* at infinite edge */
251                  d = 1.0/d;
252                  disp[0] *= d;
253                  disp[1] *= d;
254                  disp[2] *= d;
255 +                if (ip[2] < 0.0) d = -d;
256                  ip[2] *= (1.0 - v->vfore*d);
257                  break;
258          case VT_HEM:                    /* hemispherical fisheye */
# Line 269 | Line 267 | FVECT  p
267                  d = DOT(disp,v->hvec);
268                  d2 = DOT(disp,v->vdir);
269                  ip[0] = 180.0/PI * atan2(d,d2) / v->horiz + 0.5 - v->hoff;
270 <                d = d*d + d2*d2;
271 <                if (d <= FTINY*FTINY)
272 <                        return(0);      /* at pole */
273 <                d = 1.0/sqrt(d);
270 >                d2 = d*d + d2*d2;
271 >                if (d2 <= FTINY*FTINY)
272 >                        return(VL_BAD); /* at pole */
273 >                if ((v->vaft > FTINY) & (d2 >= v->vaft*v->vaft))
274 >                        rflags |= VL_BEYOND;
275 >                d = 1.0/sqrt(d2);
276                  ip[1] = DOT(disp,v->vvec)*d/v->vn2 + 0.5 - v->voff;
277                  ip[2] = VLEN(disp);
278                  ip[2] *= (1.0 - v->vfore*d);
279 <                return(1);
279 >                goto gotall;
280          case VT_ANG:                    /* angular fisheye */
281                  ip[0] = 0.5 - v->hoff;
282                  ip[1] = 0.5 - v->voff;
283                  ip[2] = normalize(disp) - v->vfore;
284                  d = DOT(disp,v->vdir);
285                  if (d >= 1.0-FTINY)
286 <                        return(1);
286 >                        goto gotall;
287                  if (d <= -(1.0-FTINY)) {
288                          ip[0] += 180.0/v->horiz;
289 <                        return(1);
289 >                        goto gotall;
290                  }
291                  d = (180.0/PI)*acos(d) / sqrt(1.0 - d*d);
292                  ip[0] += DOT(disp,v->hvec)*d/v->horiz;
293                  ip[1] += DOT(disp,v->vvec)*d/v->vert;
294 <                return(1);
294 >                goto gotall;
295          case VT_PLS:                    /* planispheric fisheye */
296                  ip[0] = 0.5 - v->hoff;
297                  ip[1] = 0.5 - v->voff;
298                  ip[2] = normalize(disp) - v->vfore;
299                  d = DOT(disp,v->vdir);
300                  if (d >= 1.0-FTINY)
301 <                        return(1);
301 >                        goto gotall;
302                  if (d <= -(1.0-FTINY))
303 <                        return(0);
303 >                        return(VL_BAD);
304                  ip[0] += DOT(disp,v->hvec)/((1. + d)*sqrt(v->hn2));
305                  ip[1] += DOT(disp,v->vvec)/((1. + d)*sqrt(v->vn2));
306 <                return(1);
306 >                goto gotall;
307 >        default:
308 >                return(VL_BAD);
309          }
310          ip[0] = DOT(disp,v->hvec)/v->hn2 + 0.5 - v->hoff;
311          ip[1] = DOT(disp,v->vvec)/v->vn2 + 0.5 - v->voff;
312 <        return(1);
312 > gotall:                                 /* add appropriate return flags */
313 >        if (ip[2] <= 0.0)
314 >                rflags |= VL_BEHIND;
315 >        else if ((v->type != VT_PER) & (v->type != VT_CYL))
316 >                rflags |= VL_BEYOND*((v->vaft > FTINY) &
317 >                                        (ip[2] >= v->vaft - v->vfore));
318 >        rflags |= VL_OUTSIDE*((0.0 >= ip[0]) | (ip[0] >= 1.0) |
319 >                                (0.0 >= ip[1]) | (ip[1] >= 1.0));
320 >        return(rflags);
321   }
322  
323  
# Line 371 | Line 381 | int  ac,
381   char  *av[]
382   )
383   {
384 < #define check(c,l)      if ((av[0][c]&&av[0][c]!=' ') || \
384 > #define check(c,l)      if ((av[0][c]&&!isspace(av[0][c])) || \
385                          badarg(ac-1,av+1,l)) return(-1)
386  
387          if (ac <= 0 || av[0][0] != '-' || av[0][1] != 'v')
388                  return(-1);
389          switch (av[0][2]) {
390          case 't':                       /* type */
391 <                if (!av[0][3] || av[0][3]==' ')
391 >                if (!av[0][3] || isspace(av[0][3]))
392                          return(-1);
393                  check(4,"");
394                  v->type = av[0][3];
# Line 499 | Line 509 | VIEW  *vp
509                  sprintf(cp, " -vt%c", vp->type);
510                  cp += strlen(cp);
511          }
512 <        if (!VEQ(vp->vp,stdview.vp)) {
512 >        if (!VABSEQ(vp->vp,stdview.vp)) {
513                  sprintf(cp, " -vp %.6g %.6g %.6g",
514                                  vp->vp[0], vp->vp[1], vp->vp[2]);
515                  cp += strlen(cp);
516          }
517 <        if (!FEQ(vp->vdist,stdview.vdist) || !VEQ(vp->vdir,stdview.vdir)) {
517 >        if (!FABSEQ(vp->vdist,stdview.vdist) || !VABSEQ(vp->vdir,stdview.vdir)) {
518                  sprintf(cp, " -vd %.6g %.6g %.6g",
519                                  vp->vdir[0]*vp->vdist,
520                                  vp->vdir[1]*vp->vdist,
521                                  vp->vdir[2]*vp->vdist);
522                  cp += strlen(cp);
523          }
524 <        if (!VEQ(vp->vup,stdview.vup)) {
524 >        if (!VABSEQ(vp->vup,stdview.vup)) {
525                  sprintf(cp, " -vu %.6g %.6g %.6g",
526                                  vp->vup[0], vp->vup[1], vp->vup[2]);
527                  cp += strlen(cp);
528          }
529 <        if (!FEQ(vp->horiz,stdview.horiz)) {
529 >        if (!FABSEQ(vp->horiz,stdview.horiz)) {
530                  sprintf(cp, " -vh %.6g", vp->horiz);
531                  cp += strlen(cp);
532          }
533 <        if (!FEQ(vp->vert,stdview.vert)) {
533 >        if (!FABSEQ(vp->vert,stdview.vert)) {
534                  sprintf(cp, " -vv %.6g", vp->vert);
535                  cp += strlen(cp);
536          }
537 <        if (!FEQ(vp->vfore,stdview.vfore)) {
537 >        if (!FABSEQ(vp->vfore,stdview.vfore)) {
538                  sprintf(cp, " -vo %.6g", vp->vfore);
539                  cp += strlen(cp);
540          }
541 <        if (!FEQ(vp->vaft,stdview.vaft)) {
541 >        if (!FABSEQ(vp->vaft,stdview.vaft)) {
542                  sprintf(cp, " -va %.6g", vp->vaft);
543                  cp += strlen(cp);
544          }
545 <        if (!FEQ(vp->hoff,stdview.hoff)) {
545 >        if (!FABSEQ(vp->hoff,stdview.hoff)) {
546                  sprintf(cp, " -vs %.6g", vp->hoff);
547                  cp += strlen(cp);
548          }
549 <        if (!FEQ(vp->voff,stdview.voff)) {
549 >        if (!FABSEQ(vp->voff,stdview.voff)) {
550                  sprintf(cp, " -vl %.6g", vp->voff);
551                  cp += strlen(cp);
552          }
# Line 563 | Line 573 | char  *s
573          }
574                                          /* skip leading path */
575          cp = s;
576 <        while (*cp && *cp != ' ')
576 >        while (*cp && !isspace(*cp))
577                  cp++;
578          while (cp > s && !ISDIRSEP(cp[-1]))
579                  cp--;
# Line 615 | Line 625 | RESOLU  *rp
625          if (rp != NULL && !fgetsresolu(rp, fp))
626                  mvs.ok = 0;
627  
628 <        fclose(fp);
628 >        if (fp != stdin)
629 >                fclose(fp);
630  
631          return(mvs.ok);
632   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines