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

Comparing ray/src/util/wrapBSDF.c (file contents):
Revision 2.5 by greg, Sat Feb 14 18:33:07 2015 UTC vs.
Revision 2.6 by greg, Sun Feb 15 17:23:06 2015 UTC

# Line 27 | Line 27 | const char     legal_units[] = "meter|foot|inch|centimeter
27                                          /* system materials & geometry */
28   const char      *mgf_geometry = NULL;
29  
30 <                                        /* angle basis */
30 >                                        /* angle bases */
31   enum { ABdefault=-1, ABklemsFull=0, ABklemsHalf, ABklemsQuarter,
32                  ABtensorTree3, ABtensorTree4, ABend };
33  
# Line 378 | Line 378 | determine_angle_basis(const char *fn, ezxml_t wtl)
378          return -1;
379   }
380  
381 + /* Filter Klems angle basis, applying appropriate solid angle correction */
382 + static int
383 + filter_klems_matrix(FILE *fp)
384 + {
385 + #define MAX_COLUMNS     145
386 +        float           col_corr[MAX_COLUMNS];
387 +        const char      *bn;
388 +        int             i, j, n = nabases;
389 +                                        /* get angle basis */
390 +        switch (angle_basis) {
391 +        case ABklemsFull:       bn = "LBNL/Klems Full"; break;
392 +        case ABklemsHalf:       bn = "LBNL/Klems Half"; break;
393 +        case ABklemsQuarter:    bn = "LBNL/Klems Quarter"; break;
394 +        default:
395 +                return 0;
396 +        }
397 +        while (n-- > 0)
398 +                if (!strcasecmp(bn, abase_list[n].name))
399 +                        break;
400 +        if (n < 0)
401 +                return 0;
402 +        if (abase_list[n].nangles > MAX_COLUMNS) {
403 +                fprintf(stderr, "Internal error - too many Klems columns!\n");
404 +                return 0;
405 +        }
406 +                                        /* get correction factors */
407 +        for (j = abase_list[n].nangles; j--; )
408 +                col_corr[j] = 1.f / io_getohm(j, &abase_list[n]);
409 +                                        /* read/correct/write matrix */
410 +        for (i = 0; i < abase_list[n].nangles; i++) {
411 +            for (j = 0; j < abase_list[n].nangles; j++) {
412 +                double  d;
413 +                if (fscanf(fp, "%lf", &d) != 1)
414 +                        return 0;
415 +                printf(" %f", d*col_corr[j]);
416 +            }
417 +            fputc('\n', stdout);
418 +        }
419 +        return 1;
420 + #undef MAX_COLUMNS
421 + }
422 +
423   /* Write out BSDF data block with surrounding tags */
424   static int
425   writeBSDFblock(const char *caller, struct s_dfile *df)
426   {
427 +        int     klems_data = 0;
428          char    *cp;
429  
430          puts("\t<WavelengthData>");
# Line 445 | Line 488 | writeBSDFblock(const char *caller, struct s_dfile *df)
488                  return 0;
489          }
490          puts("</WavelengthDataDirection>");
491 +        klems_data = 1;
492          switch (angle_basis) {
493          case ABklemsFull:
494                  puts("\t\t\t<ColumnAngleBasis>LBNL/Klems Full</ColumnAngleBasis>");
# Line 458 | Line 502 | writeBSDFblock(const char *caller, struct s_dfile *df)
502          case ABtensorTree3:
503          case ABtensorTree4:
504                  puts("\t\t\t<AngleBasis>LBNL/Shirley-Chiu</AngleBasis>");
505 +                klems_data = 0;
506                  break;
507          default:
508                  fprintf(stderr, "%s: bad angle basis (%d)\n", caller, angle_basis);
# Line 466 | Line 511 | writeBSDFblock(const char *caller, struct s_dfile *df)
511          puts("\t\t\t<ScatteringDataType>BTDF</ScatteringDataType>");
512          puts("\t\t\t<ScatteringData>");
513          fflush(stdout);
514 <        if (df->fname == stdin_name) {
514 >        if (klems_data) {
515 >                FILE    *fp = stdin;
516 >                if (df->fname[0] == '!')
517 >                        fp = popen(df->fname+1, "r");
518 >                else if (df->fname != stdin_name)
519 >                        fp = fopen(df->fname, "r");
520 >                if (fp == NULL) {
521 >                        fprintf(stderr, "%s: cannot open '%s'\n",
522 >                                        caller, df->fname);
523 >                        return 0;
524 >                }
525 >                if (!filter_klems_matrix(fp)) {
526 >                        fprintf(stderr, "%s: Klems data error from '%s'\n",
527 >                                        caller, df->fname);
528 >                        return 0;
529 >                }
530 >                if (df->fname[0] != '!') {
531 >                        fclose(fp);
532 >                } else if (pclose(fp)) {
533 >                        fprintf(stderr, "%s: error running '%s'\n",
534 >                                        caller, df->fname);
535 >                        return 0;
536 >                }
537 >        } else if (df->fname == stdin_name) {
538                  copy_and_close(fileno(stdin));
539          } else if (df->fname[0] != '!') {
540                  if (!copy_and_close(open(df->fname, O_RDONLY))) {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines