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.12 by greg, Mon Sep 19 04:26:09 2005 UTC vs.
Revision 3.22 by greg, Fri Dec 3 17:22:28 2021 UTC

# Line 31 | Line 31 | int    zfd = -1;
31  
32   int     fromstdin = 0;
33  
34 + int     unbuffered = 0;
35 +
36 + int     repeatcnt = 1;
37 +
38   char    *progname;
39  
40  
# Line 42 | Line 46 | main(
46   {
47          char    *err;
48          int     rval, getdim = 0;
49 <        register int    i;
49 >        int     i;
50  
51          progname = argv[0];
52          if (argc < 2)
# Line 56 | Line 60 | main(
60                                  break;
61                          case 'f':                       /* float */
62                                  putr = putf;
63 +                                SET_FILE_BINARY(stdout);
64                                  break;
65                          case 'd':                       /* double */
66                                  putr = putd;
67 +                                SET_FILE_BINARY(stdout);
68                                  break;
69                          default:
70                                  goto userr;
# Line 99 | Line 105 | main(
105                                  exit(1);
106                          }
107                          break;
108 +                case 'c':                       /* repeat count */
109 +                        repeatcnt = atoi(argv[++i]);
110 +                        break;
111                  case 'p':                       /* pixel aspect or jitter */
112                          if (argv[i][2] == 'a')
113                                  pa = atof(argv[++i]);
114                          else if (argv[i][2] == 'j')
115 <                                pj= atof(argv[++i]);
115 >                                pj = atof(argv[++i]);
116                          else
117                                  goto userr;
118                          break;
119                  case 'i':                       /* get pixels from stdin */
120                          fromstdin = 1;
121                          break;
122 +                case 'u':                       /* unbuffered output */
123 +                        unbuffered = 1;
124 +                        break;
125                  default:
126                          goto userr;
127                  }
# Line 121 | Line 133 | main(
133                          fprintf(stderr, "%s: no view in picture\n", argv[i]);
134                          exit(1);
135                  }
136 <                if (i+1 < argc) {
137 <                        zfd = open(argv[i+1], O_RDONLY);
138 <                        if (zfd < 0) {
127 <                                fprintf(stderr,
128 <                                        "%s: cannot open depth buffer\n",
129 <                                                argv[i+1]);
136 >                if (!getdim & (i+1 < argc)) {
137 >                        zfd = open_float_depth(argv[i+1], (long)rs.xr*rs.yr);
138 >                        if (zfd < 0)
139                                  exit(1);
131                        }
140                  }
141          }
142          if ((err = setview(&vw)) != NULL) {
# Line 139 | Line 147 | main(
147                  normaspect(viewaspect(&vw), &pa, &rs.xr, &rs.yr);
148          if (getdim) {
149                  printf("-x %d -y %d -ld%c\n", rs.xr, rs.yr,
150 <                                vw.vaft > FTINY ? '+' : '-');
150 >                                (i+1 == argc) & (vw.vaft > FTINY) ? '+' : '-');
151                  exit(0);
152          }
153          if (fromstdin)
# Line 149 | Line 157 | main(
157          exit(0);
158   userr:
159          fprintf(stderr,
160 <        "Usage: %s [ -i -f{a|f|d} | -d ] { view opts .. | picture [zbuf] }\n",
160 >        "Usage: %s [ -i -u -f{a|f|d} -c rept | -d ] { view opts .. | picture [zbuf] }\n",
161                          progname);
162          exit(1);
163   }
# Line 178 | Line 186 | pix2rays(
186          RREAL   loc[2];
187          int     pp[2];
188          double  d;
189 <        register int    i;
189 >        int     i, c;
190  
191          while (fscanf(fp, "%lf %lf", &px, &py) == 2) {
192                  px += .5; py += .5;
185                if (px < 0 || px >= rs.xr ||
186                                py < 0 || py >= rs.yr) {
187                        fprintf(stderr,
188                                "%s: (x,y) pair (%.0f,%.0f) out of range\n",
189                                        progname, px, py);
190                        exit(1);
191                }
193                  loc[0] = px/rs.xr; loc[1] = py/rs.yr;
194                  if (zfd >= 0) {
195 +                        if ((loc[0] < 0) | (loc[0] >= 1) |
196 +                                        (loc[1] < 0) | (loc[1] >= 1)) {
197 +                                fprintf(stderr, "%s: input pixel outside image\n",
198 +                                                progname);
199 +                                exit(1);
200 +                        }
201                          loc2pix(pp, &rs, loc[0], loc[1]);
202                          if (lseek(zfd,
203                                  (pp[1]*scanlen(&rs)+pp[0])*sizeof(float),
# Line 202 | Line 209 | pix2rays(
209                                  exit(1);
210                          }
211                  }
212 <                jitterloc(loc);
213 <                d = viewray(rorg, rdir, &vw, loc[0], loc[1]);
214 <                if (d < -FTINY)
215 <                        rorg[0] = rorg[1] = rorg[2] =
216 <                        rdir[0] = rdir[1] = rdir[2] = 0.;
217 <                else if (zfd >= 0)
218 <                        for (i = 0; i < 3; i++) {
219 <                                rorg[i] += rdir[i]*zval;
220 <                                rdir[i] = -rdir[i];
212 >                for (c = repeatcnt; c-- > 0; ) {
213 >                        jitterloc(loc);
214 >                        d = viewray(rorg, rdir, &vw, loc[0], loc[1]);
215 >                        if (d < -FTINY)
216 >                                rorg[0] = rorg[1] = rorg[2] =
217 >                                rdir[0] = rdir[1] = rdir[2] = 0.;
218 >                        else if (zfd >= 0)
219 >                                for (i = 0; i < 3; i++) {
220 >                                        rorg[i] += rdir[i]*zval;
221 >                                        rdir[i] = -rdir[i];
222 >                                }
223 >                        else if (d > FTINY) {
224 >                                rdir[0] *= d; rdir[1] *= d; rdir[2] *= d;
225                          }
226 <                else if (d > FTINY) {
227 <                        rdir[0] *= d; rdir[1] *= d; rdir[2] *= d;
226 >                        (*putr)(rorg, rdir);
227 >                        if (c) {
228 >                                loc[0] = px/rs.xr; loc[1] = py/rs.yr;
229 >                        }
230                  }
231 <                (*putr)(rorg, rdir);
231 >                if (unbuffered)
232 >                        fflush(stdout);
233          }
234          if (!feof(fp)) {
235                  fprintf(stderr, "%s: expected px py on input\n", progname);
# Line 232 | Line 246 | putrays(void)
246          float   *zbuf = NULL;
247          int     sc;
248          double  d;
249 <        register int    si, i;
249 >        int     si, i, c;
250  
251          if (zfd >= 0) {
252                  zbuf = (float *)malloc(scanlen(&rs)*sizeof(float));
# Line 251 | Line 265 | putrays(void)
265                          }
266                  }
267                  for (si = 0; si < scanlen(&rs); si++) {
268 +                    for (c = repeatcnt; c-- > 0; ) {
269                          pix2loc(loc, &rs, si, sc);
270                          jitterloc(loc);
271                          d = viewray(rorg, rdir, &vw, loc[0], loc[1]);
# Line 259 | Line 274 | putrays(void)
274                                  rdir[0] = rdir[1] = rdir[2] = 0.;
275                          else if (zfd >= 0)
276                                  for (i = 0; i < 3; i++) {
277 <                                        rorg[i] += rdir[i]*zbuf[si];
278 <                                        rdir[i] = -rdir[i];
277 >                                        rdir[i] = -rdir[i]*zbuf[si];
278 >                                        rorg[i] -= rdir[i];
279                                  }
280                          else if (d > FTINY) {
281                                  rdir[0] *= d; rdir[1] *= d; rdir[2] *= d;
282                          }
283                          (*putr)(rorg, rdir);
284 +                    }
285                  }
286          }
287          if (zfd >= 0)
# Line 295 | Line 311 | putf(          /* put out ray in float format */
311  
312          v[0] = ro[0]; v[1] = ro[1]; v[2] = ro[2];
313          v[3] = rd[0]; v[4] = rd[1]; v[5] = rd[2];
314 <        fwrite(v, sizeof(float), 6, stdout);
314 >        putbinary(v, sizeof(float), 6, stdout);
315   }
316  
317  
# Line 309 | Line 325 | putd(          /* put out ray in double format */
325  
326          v[0] = ro[0]; v[1] = ro[1]; v[2] = ro[2];
327          v[3] = rd[0]; v[4] = rd[1]; v[5] = rd[2];
328 <        fwrite(v, sizeof(double), 6, stdout);
328 >        putbinary(v, sizeof(double), 6, stdout);
329   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines