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

Comparing ray/src/util/vwrays.c (file contents):
Revision 3.20 by greg, Thu Nov 7 23:20:29 2019 UTC vs.
Revision 3.25 by greg, Fri Jan 12 17:29:10 2024 UTC

# Line 27 | Line 27 | double pa = 1.;
27  
28   double  pj = 0.;
29  
30 + double  pd = 0.;
31 +
32   int     zfd = -1;
33  
34   int     fromstdin = 0;
# Line 77 | Line 79 | main(
79                                          fprintf(stderr,
80                                                  "%s: no view in file\n",
81                                                          argv[i]);
82 <                                        exit(1);
82 >                                        return(1);
83                                  }
84                                  break;
85                          }
# Line 94 | Line 96 | main(
96                          if (rs.xr <= 0) {
97                                  fprintf(stderr, "%s: bad x resolution\n",
98                                                  progname);
99 <                                exit(1);
99 >                                return(1);
100                          }
101                          break;
102                  case 'y':                       /* y resolution */
# Line 102 | Line 104 | main(
104                          if (rs.yr <= 0) {
105                                  fprintf(stderr, "%s: bad y resolution\n",
106                                                  progname);
107 <                                exit(1);
107 >                                return(1);
108                          }
109                          break;
110                  case 'c':                       /* repeat count */
111                          repeatcnt = atoi(argv[++i]);
112 +                        if (repeatcnt < 1) repeatcnt = 1;
113                          break;
114                  case 'p':                       /* pixel aspect or jitter */
115                          if (argv[i][2] == 'a')
116                                  pa = atof(argv[++i]);
117                          else if (argv[i][2] == 'j')
118                                  pj = atof(argv[++i]);
119 +                        else if (argv[i][2] == 'd')
120 +                                pd = atof(argv[++i]);
121                          else
122                                  goto userr;
123                          break;
# Line 131 | Line 136 | main(
136                  rval = viewfile(argv[i], &vw, &rs);
137                  if (rval <= 0) {
138                          fprintf(stderr, "%s: no view in picture\n", argv[i]);
139 <                        exit(1);
139 >                        return(1);
140                  }
141 <                if (i+1 < argc) {
141 >                if (!getdim & (i+1 < argc)) {
142                          zfd = open_float_depth(argv[i+1], (long)rs.xr*rs.yr);
143                          if (zfd < 0)
144 <                                exit(1);
144 >                                return(1);
145                  }
146          }
147          if ((err = setview(&vw)) != NULL) {
148                  fprintf(stderr, "%s: %s\n", progname, err);
149 <                exit(1);
149 >                return(1);
150          }
151          if (i == argc)
152                  normaspect(viewaspect(&vw), &pa, &rs.xr, &rs.yr);
153          if (getdim) {
154 <                printf("-x %d -y %d -ld%c\n", rs.xr, rs.yr,
155 <                                vw.vaft > FTINY ? '+' : '-');
156 <                exit(0);
154 >                printf("-x %d -y %d%s\n", rs.xr, rs.yr,
155 >                                (vw.vaft > FTINY) ? " -ld+" : "");
156 >                return(0);
157          }
158 +        if ((repeatcnt > 1) & (pj > FTINY))
159 +                initurand(1024);
160          if (fromstdin)
161                  pix2rays(stdin);
162          else
163                  putrays();
164 <        exit(0);
164 >        return(0);
165   userr:
166          fprintf(stderr,
167          "Usage: %s [ -i -u -f{a|f|d} -c rept | -d ] { view opts .. | picture [zbuf] }\n",
168                          progname);
169 <        exit(1);
169 >        return(1);
170   }
171  
172  
# Line 168 | Line 175 | jitterloc(
175          RREAL   loc[2]
176   )
177   {
178 <        if (pj > FTINY) {
179 <                loc[0] += pj*(.5 - frandom())/rs.xr;
180 <                loc[1] += pj*(.5 - frandom())/rs.yr;
181 <        }
178 >        static int      nsamp;
179 >        double          xyr[2];
180 >
181 >        if (pj <= FTINY)
182 >                return;
183 >
184 >        if (repeatcnt == 1) {
185 >                xyr[0] = frandom();
186 >                xyr[1] = frandom();
187 >        } else                          /* stratify samples */
188 >                multisamp(xyr, 2, urand(nsamp++));
189 >
190 >        loc[0] += pj*(.5 - xyr[0])/rs.xr;
191 >        loc[1] += pj*(.5 - xyr[1])/rs.yr;
192   }
193  
194  
# Line 186 | Line 203 | pix2rays(
203          RREAL   loc[2];
204          int     pp[2];
205          double  d;
206 <        int     i;
206 >        int     i, c;
207  
208          while (fscanf(fp, "%lf %lf", &px, &py) == 2) {
209                  px += .5; py += .5;
# Line 209 | Line 226 | pix2rays(
226                                  exit(1);
227                          }
228                  }
229 <                jitterloc(loc);
230 <                d = viewray(rorg, rdir, &vw, loc[0], loc[1]);
231 <                if (d < -FTINY)
232 <                        rorg[0] = rorg[1] = rorg[2] =
233 <                        rdir[0] = rdir[1] = rdir[2] = 0.;
234 <                else if (zfd >= 0)
235 <                        for (i = 0; i < 3; i++) {
236 <                                rorg[i] += rdir[i]*zval;
237 <                                rdir[i] = -rdir[i];
229 >                for (c = repeatcnt; c-- > 0; ) {
230 >                        jitterloc(loc);
231 >                        d = viewray(rorg, rdir, &vw, loc[0], loc[1]);
232 >                        if (d < -FTINY || !jitteraperture(rorg, rdir, &vw, pd))
233 >                                rorg[0] = rorg[1] = rorg[2] =
234 >                                rdir[0] = rdir[1] = rdir[2] = 0.;
235 >                        else if (zfd >= 0)
236 >                                for (i = 0; i < 3; i++) {
237 >                                        rorg[i] += rdir[i]*zval;
238 >                                        rdir[i] = -rdir[i];
239 >                                }
240 >                        else if (d > FTINY) {
241 >                                rdir[0] *= d; rdir[1] *= d; rdir[2] *= d;
242                          }
243 <                else if (d > FTINY) {
244 <                        rdir[0] *= d; rdir[1] *= d; rdir[2] *= d;
243 >                        (*putr)(rorg, rdir);
244 >                        if (c) {
245 >                                loc[0] = px/rs.xr; loc[1] = py/rs.yr;
246 >                        }
247                  }
225                (*putr)(rorg, rdir);
248                  if (unbuffered)
249                          fflush(stdout);
250          }
# Line 264 | Line 286 | putrays(void)
286                          pix2loc(loc, &rs, si, sc);
287                          jitterloc(loc);
288                          d = viewray(rorg, rdir, &vw, loc[0], loc[1]);
289 <                        if (d < -FTINY)
289 >                        if (d < -FTINY || !jitteraperture(rorg, rdir, &vw, pd))
290                                  rorg[0] = rorg[1] = rorg[2] =
291                                  rdir[0] = rdir[1] = rdir[2] = 0.;
292                          else if (zfd >= 0)
293                                  for (i = 0; i < 3; i++) {
294 <                                        rorg[i] += rdir[i]*zbuf[si];
295 <                                        rdir[i] = -rdir[i];
294 >                                        rdir[i] = -rdir[i]*zbuf[si];
295 >                                        rorg[i] -= rdir[i];
296                                  }
297                          else if (d > FTINY) {
298                                  rdir[0] *= d; rdir[1] *= d; rdir[2] *= d;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines