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.43 by greg, Wed Jan 24 04:39:52 2018 UTC

# Line 233 | Line 233 | VIEW  *v,
233   FVECT  p
234   )
235   {
236 +        int     rval;
237          double  d, d2;
238          FVECT  disp;
239  
# Line 245 | Line 246 | FVECT  p
246          case VT_PER:                    /* perspective view */
247                  d = DOT(disp,v->vdir);
248                  ip[2] = VLEN(disp);
249 <                if (d < 0.0) {          /* fold pyramid */
249 >                if (d < -FTINY) {       /* fold pyramid */
250                          ip[2] = -ip[2];
251                          d = -d;
252 <                }
252 <                if (d <= FTINY)
252 >                } else if (d <= FTINY)
253                          return(0);      /* at infinite edge */
254                  d = 1.0/d;
255                  disp[0] *= d;
256                  disp[1] *= d;
257                  disp[2] *= d;
258 +                if (ip[2] < 0.0) d = -d;
259                  ip[2] *= (1.0 - v->vfore*d);
260                  break;
261          case VT_HEM:                    /* hemispherical fisheye */
# Line 276 | Line 277 | FVECT  p
277                  ip[1] = DOT(disp,v->vvec)*d/v->vn2 + 0.5 - v->voff;
278                  ip[2] = VLEN(disp);
279                  ip[2] *= (1.0 - v->vfore*d);
280 <                return(1);
280 >                goto gotall;
281          case VT_ANG:                    /* angular fisheye */
282                  ip[0] = 0.5 - v->hoff;
283                  ip[1] = 0.5 - v->voff;
284                  ip[2] = normalize(disp) - v->vfore;
285                  d = DOT(disp,v->vdir);
286                  if (d >= 1.0-FTINY)
287 <                        return(1);
287 >                        goto gotall;
288                  if (d <= -(1.0-FTINY)) {
289                          ip[0] += 180.0/v->horiz;
290 <                        return(1);
290 >                        goto gotall;
291                  }
292                  d = (180.0/PI)*acos(d) / sqrt(1.0 - d*d);
293                  ip[0] += DOT(disp,v->hvec)*d/v->horiz;
294                  ip[1] += DOT(disp,v->vvec)*d/v->vert;
295 <                return(1);
295 >                goto gotall;
296          case VT_PLS:                    /* planispheric fisheye */
297                  ip[0] = 0.5 - v->hoff;
298                  ip[1] = 0.5 - v->voff;
299                  ip[2] = normalize(disp) - v->vfore;
300                  d = DOT(disp,v->vdir);
301                  if (d >= 1.0-FTINY)
302 <                        return(1);
302 >                        goto gotall;
303                  if (d <= -(1.0-FTINY))
304                          return(0);
305                  ip[0] += DOT(disp,v->hvec)/((1. + d)*sqrt(v->hn2));
306                  ip[1] += DOT(disp,v->vvec)/((1. + d)*sqrt(v->vn2));
307 <                return(1);
307 >                goto gotall;
308          }
309          ip[0] = DOT(disp,v->hvec)/v->hn2 + 0.5 - v->hoff;
310          ip[1] = DOT(disp,v->vvec)/v->vn2 + 0.5 - v->voff;
311 <        return(1);
311 > gotall:                                 /* return negative if behind */
312 >        rval = 1 - 2*(ip[2] <= 0.0);
313 >        if ((0.0 > ip[0]) | (ip[0] > 1.0) || (0.0 > ip[1]) | (ip[1] > 1.0))
314 >                return 2*rval;          /* +/-2 if outside frame */
315 >        return rval;
316   }
317  
318  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines