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.39 by greg, Sun Mar 24 19:40:26 2013 UTC vs.
Revision 2.45 by greg, Tue Feb 6 02:08:12 2018 UTC

# Line 170 | Line 170 | double  y
170                  direc[0] = v->vdir[0] + x*v->hvec[0] + y*v->vvec[0];
171                  direc[1] = v->vdir[1] + x*v->hvec[1] + y*v->vvec[1];
172                  direc[2] = v->vdir[2] + x*v->hvec[2] + y*v->vvec[2];
173 <                orig[0] = v->vp[0] + v->vfore*direc[0];
174 <                orig[1] = v->vp[1] + v->vfore*direc[1];
175 <                orig[2] = v->vp[2] + v->vfore*direc[2];
173 >                VSUM(orig, v->vp, direc, v->vfore);
174                  d = normalize(direc);
175                  return(v->vaft > FTINY ? (v->vaft - v->vfore)*d : 0.0);
176          case VT_HEM:                    /* hemispherical fisheye */
# Line 183 | Line 181 | double  y
181                  direc[0] = z*v->vdir[0] + x*v->hvec[0] + y*v->vvec[0];
182                  direc[1] = z*v->vdir[1] + x*v->hvec[1] + y*v->vvec[1];
183                  direc[2] = z*v->vdir[2] + x*v->hvec[2] + y*v->vvec[2];
184 <                orig[0] = v->vp[0] + v->vfore*direc[0];
187 <                orig[1] = v->vp[1] + v->vfore*direc[1];
188 <                orig[2] = v->vp[2] + v->vfore*direc[2];
184 >                VSUM(orig, v->vp, direc, v->vfore);
185                  return(v->vaft > FTINY ? v->vaft - v->vfore : 0.0);
186          case VT_CYL:                    /* cylindrical panorama */
187                  d = x * v->horiz * (PI/180.0);
# Line 194 | Line 190 | double  y
190                  direc[0] = z*v->vdir[0] + x*v->hvec[0] + y*v->vvec[0];
191                  direc[1] = z*v->vdir[1] + x*v->hvec[1] + y*v->vvec[1];
192                  direc[2] = z*v->vdir[2] + x*v->hvec[2] + y*v->vvec[2];
193 <                orig[0] = v->vp[0] + v->vfore*direc[0];
198 <                orig[1] = v->vp[1] + v->vfore*direc[1];
199 <                orig[2] = v->vp[2] + v->vfore*direc[2];
193 >                VSUM(orig, v->vp, direc, v->vfore);
194                  d = normalize(direc);
195                  return(v->vaft > FTINY ? (v->vaft - v->vfore)*d : 0.0);
196          case VT_ANG:                    /* angular fisheye */
# Line 213 | Line 207 | double  y
207                  direc[0] = z*v->vdir[0] + x*v->hvec[0] + y*v->vvec[0];
208                  direc[1] = z*v->vdir[1] + x*v->hvec[1] + y*v->vvec[1];
209                  direc[2] = z*v->vdir[2] + x*v->hvec[2] + y*v->vvec[2];
210 <                orig[0] = v->vp[0] + v->vfore*direc[0];
217 <                orig[1] = v->vp[1] + v->vfore*direc[1];
218 <                orig[2] = v->vp[2] + v->vfore*direc[2];
210 >                VSUM(orig, v->vp, direc, v->vfore);
211                  return(v->vaft > FTINY ? v->vaft - v->vfore : 0.0);
212          case VT_PLS:                    /* planispheric fisheye */
213                  x *= sqrt(v->hn2);
# Line 227 | Line 219 | double  y
219                  direc[0] = z*v->vdir[0] + x*v->hvec[0] + y*v->vvec[0];
220                  direc[1] = z*v->vdir[1] + x*v->hvec[1] + y*v->vvec[1];
221                  direc[2] = z*v->vdir[2] + x*v->hvec[2] + y*v->vvec[2];
222 <                orig[0] = v->vp[0] + v->vfore*direc[0];
231 <                orig[1] = v->vp[1] + v->vfore*direc[1];
232 <                orig[2] = v->vp[2] + v->vfore*direc[2];
222 >                VSUM(orig, v->vp, direc, v->vfore);
223                  return(v->vaft > FTINY ? v->vaft - v->vfore : 0.0);
224          }
225          return(-1.0);
226   }
227  
228  
229 < void
229 > int
230   viewloc(                        /* find image location for point */
231   FVECT  ip,
232   VIEW  *v,
233   FVECT  p
234 < )
234 > )       /* returns: Good=1, Bad=0, Behind=-1, OutOfFrame=2, Behind+OOF=-2 */
235   {
236          double  d, d2;
237          FVECT  disp;
# Line 255 | Line 245 | FVECT  p
245          case VT_PER:                    /* perspective view */
246                  d = DOT(disp,v->vdir);
247                  ip[2] = VLEN(disp);
248 <                if (d < 0.0) {          /* fold pyramid */
248 >                if (d < -FTINY) {       /* fold pyramid */
249                          ip[2] = -ip[2];
250                          d = -d;
251 <                }
252 <                if (d > FTINY) {
253 <                        d = 1.0/d;
254 <                        disp[0] *= d;
255 <                        disp[1] *= d;
256 <                        disp[2] *= d;
257 <                }
251 >                } else if (d <= FTINY)
252 >                        return(0);      /* at infinite edge */
253 >                d = 1.0/d;
254 >                disp[0] *= d;
255 >                disp[1] *= d;
256 >                disp[2] *= d;
257 >                if (ip[2] < 0.0) d = -d;
258                  ip[2] *= (1.0 - v->vfore*d);
259                  break;
260          case VT_HEM:                    /* hemispherical fisheye */
# Line 279 | Line 269 | FVECT  p
269                  d = DOT(disp,v->hvec);
270                  d2 = DOT(disp,v->vdir);
271                  ip[0] = 180.0/PI * atan2(d,d2) / v->horiz + 0.5 - v->hoff;
272 <                d = 1.0/sqrt(d*d + d2*d2);
272 >                d = d*d + d2*d2;
273 >                if (d <= FTINY*FTINY)
274 >                        return(0);      /* at pole */
275 >                d = 1.0/sqrt(d);
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;
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;
286 >                        goto gotall;
287                  if (d <= -(1.0-FTINY)) {
288                          ip[0] += 180.0/v->horiz;
289 <                        return;
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;
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;
301 >                        goto gotall;
302                  if (d <= -(1.0-FTINY))
303 <                        return;         /* really an error */
303 >                        return(0);
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;
306 >                goto gotall;
307 >        default:
308 >                return(0);
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 + gotall:                                 /* compute return value */
313 +        return( (1 - 2*(ip[2] <= 0.0)) * (1 +
314 +        ((0.0 >= ip[0]) | (ip[0] >= 1.0) | (0.0 >= ip[1]) | (ip[1] >= 1.0))) );
315   }
316  
317  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines