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

Comparing ray/src/rt/rc2.c (file contents):
Revision 2.23 by greg, Wed Aug 14 20:07:20 2019 UTC vs.
Revision 2.27 by greg, Wed May 22 21:44:03 2024 UTC

# Line 113 | Line 113 | printheader(FILE *fout, const char *info)
113          printargs(gargc-1, gargv, fout);        /* add our command */
114          fprintf(fout, "SOFTWARE= %s\n", VersionID);
115          fputnow(fout);
116 <        fputs("NCOMP=3\n", fout);               /* always RGB */
116 >        fputncomp(NCSAMP, fout);
117 >        if (NCSAMP > 3)
118 >                fputwlsplit(WLPART, fout);
119          if (info != NULL)                       /* add extra info if given */
120                  fputs(info, fout);
121          if ((outfmt == 'f') | (outfmt == 'd'))
# Line 143 | Line 145 | getostream(const char *ospec, const char *mname, int b
145          LUENT                   *lep;
146          STREAMOUT               *sop;
147          char                    *cp;
148 <        
148 >
149 >        info[0] = '\0';
150          if (ospec == NULL) {                    /* use stdout? */
151                  if (!noopen & !using_stdout) {
152                          if (outfmt != 'a')
153                                  SET_FILE_BINARY(stdout);
154 + #ifdef getc_unlocked
155 +                        flockfile(stdout);      /* avoid lock/unlock overhead */
156 + #endif
157                          if (header) {
158                                  cp = info;
159                                  if (yres > 0) {
# Line 164 | Line 170 | getostream(const char *ospec, const char *mname, int b
170                          if (waitflush > 0)
171                                  fflush(stdout);
172                          stdos.xr = xres; stdos.yr = yres;
167 #ifdef getc_unlocked
168                        flockfile(stdout);      /* avoid lock/unlock overhead */
169 #endif
173                          using_stdout = 1;
174                  }
175                  stdos.ofp = stdout;
# Line 270 | Line 273 | getvec(FVECT vec)
273                  }
274                  break;
275          case 'f':                                       /* binary float */
276 <                if (getbinary((char *)vf, sizeof(float), 3, stdin) != 3)
276 >                if (getbinary(vf, sizeof(float), 3, stdin) != 3)
277                          return(-1);
278                  VCOPY(vec, vf);
279                  break;
280          case 'd':                                       /* binary double */
281 <                if (getbinary((char *)vd, sizeof(double), 3, stdin) != 3)
281 >                if (getbinary(vd, sizeof(double), 3, stdin) != 3)
282                          return(-1);
283                  VCOPY(vec, vd);
284                  break;
# Line 288 | Line 291 | getvec(FVECT vec)
291  
292   /* Put out ray contribution to file */
293   static void
294 < put_contrib(const DCOLOR cnt, FILE *fout)
294 > put_contrib(const DCOLORV *cnt, FILE *fout)
295   {
296          double  sf = 1;
297 <        COLOR   fv;
298 <        COLR    cv;
297 >        SCOLOR  fv;
298 >        SCOLR   cv;
299 >        int     i;
300  
301          if (accumulate > 1)
302                  sf = 1./(double)accumulate;
303          switch (outfmt) {
304          case 'a':
305 <                if (accumulate > 1)
306 <                        fprintf(fout, "%.6e\t%.6e\t%.6e\t",
303 <                                        sf*cnt[0], sf*cnt[1], sf*cnt[2]);
304 <                else
305 <                        fprintf(fout, "%.6e\t%.6e\t%.6e\t",
306 <                                        cnt[0], cnt[1], cnt[2]);
305 >                for (i = 0; i < NCSAMP; i++)
306 >                        fprintf(fout, "%.6e\t", sf*cnt[i]);
307                  break;
308          case 'f':
309 <                if (accumulate > 1) {
310 <                        copycolor(fv, cnt);
311 <                        scalecolor(fv, sf);
312 <                } else
313 <                        copycolor(fv, cnt);
314 <                putbinary(fv, sizeof(float), 3, fout);
309 >                for (i = NCSAMP; i-- > 0; )
310 >                        fv[i] = cnt[i];
311 >                if (accumulate > 1)
312 >                        scalescolor(fv, sf);
313 >                putbinary(fv, sizeof(COLORV), NCSAMP, fout);
314                  break;
315          case 'd':
316                  if (accumulate > 1) {
317 <                        DCOLOR  dv;
318 <                        copycolor(dv, cnt);
319 <                        scalecolor(dv, sf);
320 <                        putbinary(dv, sizeof(double), 3, fout);
317 >                        DCOLORV dv[MAXCSAMP];
318 >                        for (i = NCSAMP; i-- > 0; )
319 >                                dv[i] = sf*cnt[i];
320 >                        putbinary(dv, sizeof(DCOLORV), NCSAMP, fout);
321                  } else
322 <                        putbinary(cnt, sizeof(double), 3, fout);
322 >                        putbinary(cnt, sizeof(DCOLORV), NCSAMP, fout);
323                  break;
324          case 'c':
325 +                for (i = NCSAMP; i-- > 0; )
326 +                        fv[i] = cnt[i];
327                  if (accumulate > 1)
328 <                        setcolr(cv, sf*cnt[0], sf*cnt[1], sf*cnt[2]);
329 <                else
330 <                        setcolr(cv, cnt[0], cnt[1], cnt[2]);
330 <                putbinary(cv, sizeof(cv), 1, fout);
328 >                        scalescolor(fv, sf);
329 >                scolor_scolr(cv, fv);
330 >                putbinary(cv, 1, LSCOLR, fout);
331                  break;
332          default:
333                  error(INTERNAL, "botched output format");
# Line 342 | Line 342 | mod_output(MODCONT *mp)
342          STREAMOUT       *sop = getostream(mp->outspec, mp->modname, mp->bin0, 0);
343          int             j;
344  
345 <        put_contrib(mp->cbin[0], sop->ofp);
345 >        put_contrib(mp->cbin, sop->ofp);
346          if (mp->nbins > 3 &&    /* minor optimization */
347                          sop == getostream(mp->outspec, mp->modname, mp->bin0+1, 0)) {
348                  for (j = 1; j < mp->nbins; j++)
349 <                        put_contrib(mp->cbin[j], sop->ofp);
349 >                        put_contrib(mcbin(mp,j), sop->ofp);
350          } else {
351                  for (j = 1; j < mp->nbins; j++) {
352                          sop = getostream(mp->outspec, mp->modname, mp->bin0+j, 0);
353 <                        put_contrib(mp->cbin[j], sop->ofp);
353 >                        put_contrib(mcbin(mp,j), sop->ofp);
354                  }
355          }
356   }
# Line 393 | Line 393 | end_record()
393  
394   /* Get ray contribution from previous file */
395   static int
396 < get_contrib(DCOLOR cnt, FILE *finp)
396 > get_contrib(DCOLORV *cnt, FILE *finp)
397   {
398 <        COLOR   fv;
399 <        COLR    cv;
398 >        SCOLOR  fv;
399 >        SCOLR   cv;
400 >        int     i;
401  
402          switch (outfmt) {
403          case 'a':
404 <                return(fscanf(finp,"%lf %lf %lf",&cnt[0],&cnt[1],&cnt[2]) == 3);
405 <        case 'f':
406 <                if (getbinary(fv, sizeof(fv[0]), 3, finp) != 3)
406 <                        return(0);
407 <                copycolor(cnt, fv);
404 >                for (i = 0; i < NCSAMP; i++)
405 >                        if (fscanf(finp, "%lf", &cnt[i]) != 1)
406 >                                return(0);
407                  return(1);
408          case 'd':
409 <                return(getbinary(cnt, sizeof(cnt[0]), 3, finp) == 3);
409 >                return(getbinary(cnt, sizeof(DCOLORV), NCSAMP, finp) == NCSAMP);
410 >        case 'f':
411 >                if (getbinary(fv, sizeof(COLORV), NCSAMP, finp) != NCSAMP)
412 >                        return(0);
413 >                break;
414          case 'c':
415 <                if (getbinary(cv, sizeof(cv), 1, finp) != 1)
415 >                if (getbinary(cv, 1, LSCOLR, finp) != LSCOLR)
416                          return(0);
417 <                colr_color(fv, cv);
418 <                copycolor(cnt, fv);
416 <                return(1);
417 >                scolr_scolor(fv, cv);
418 >                break;
419          default:
420                  error(INTERNAL, "botched output format");
421          }
422 <        return(0);      /* pro forma return */
422 >                        /* copy result from SCOLOR */
423 >        for (i = NCSAMP; i-- > 0; )
424 >                cnt[i] = fv[i];
425 >        return(1);
426   }
427  
428  
# Line 448 | Line 453 | reload_output()
453          LUENT           *oent;
454          int             xr, yr;
455          STREAMOUT       *sop;
456 <        DCOLOR          rgbv;
456 >        DCOLORV         contr[MAXCSAMP];
457  
458          if (outfmt == 'a')
459                  fmode = "r";
460 <        outvfmt = formstr(outfmt);
460 >        outvfmt = (char *)formstr(outfmt);
461                                                  /* reload modifier values */
462          for (i = 0; i < nmods; i++) {
463                  mp = (MODCONT *)lu_find(&modconttab,modname[i])->data;
# Line 493 | Line 498 | reload_output()
498                                          error(USER, errmsg);
499                                  }
500                          }
501 <                                                        /* read in RGB value */
502 <                        if (!get_contrib(rgbv, sop->ofp)) {
501 >                                                        /* read in spectral value */
502 >                        if (!get_contrib(contr, sop->ofp)) {
503                                  if (!j) {
504                                          fclose(sop->ofp);
505                                          break;          /* ignore empty file */
# Line 505 | Line 510 | reload_output()
510                                          error(USER, errmsg);
511                                  }
512                                  break;
513 <                        }                              
514 <                        copycolor(mp->cbin[j], rgbv);
513 >                        }
514 >                        memcpy(mcbin(mp,j), contr, DCOLORSIZ);
515                  }
516          }
517          lu_doall(&ofiletab, &myclose, NULL);    /* close all files */
# Line 551 | Line 556 | recover_output()
556                  error(USER, "cannot recover ASCII output");
557                  return;
558          case 'f':
559 <                outvsiz = sizeof(float)*3;
559 >                outvsiz = sizeof(float)*NCSAMP;
560                  break;
561          case 'd':
562 <                outvsiz = sizeof(double)*3;
562 >                outvsiz = sizeof(double)*NCSAMP;
563                  break;
564          case 'c':
565 <                outvsiz = sizeof(COLR);
565 >                outvsiz = LSCOLR;
566                  break;
567          default:
568                  error(INTERNAL, "botched output format");
569                  return;
570          }
571 <        outvfmt = formstr(outfmt);
571 >        outvfmt = (char *)formstr(outfmt);
572                                                  /* check modifier outputs */
573          for (i = 0; i < nmods; i++) {
574                  mp = (MODCONT *)lu_find(&modconttab,modname[i])->data;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines