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

Comparing ray/src/cv/bsdf2klems.c (file contents):
Revision 2.24 by greg, Fri Feb 17 22:31:49 2017 UTC vs.
Revision 2.29 by greg, Mon Oct 26 21:12:20 2020 UTC

# Line 8 | Line 8 | static const char RCSid[] = "$Id$";
8   */
9  
10   #define _USE_MATH_DEFINES
11 #include <stdio.h>
11   #include <stdlib.h>
13 #include <string.h>
12   #include <math.h>
13 + #include <ctype.h>
14   #include "random.h"
15   #include "platform.h"
16   #include "paths.h"
# Line 31 | Line 30 | static const char      klems_half[] = "LBNL/Klems Half";
30   static const char       klems_quarter[] = "LBNL/Klems Quarter";
31   static const char       *kbasis = klems_full;
32                                  /* number of BSDF samples per patch */
33 < static int              npsamps = 256;
33 > static int              npsamps = 1024;
34                                  /* limit on number of RBF lobes */
35   static int              lobe_lim = 15000;
36                                  /* progress bar length */
# Line 431 | Line 430 | eval_function(char *funame)
430   static void
431   eval_rbf(void)
432   {
433 <        ANGLE_BASIS     *abp = get_basis(kbasis);
434 <        float           (*XZarr)[2] = NULL;
435 <        float           bsdfarr[MAXPATCHES*MAXPATCHES];
436 <        FILE            *cfp[3];
437 <        FVECT           vin, vout;
438 <        double          sum, xsum, ysum;
439 <        int             i, j, n;
440 <                                                /* sanity check */
441 <        if (abp->nangles > MAXPATCHES) {
442 <                fprintf(stderr, "%s: too many patches!\n", progname);
443 <                exit(1);
444 <        }
445 <        if (rbf_colorimetry == RBCtristimulus)
446 <                XZarr = (float (*)[2])malloc(sizeof(float)*2*abp->nangles*abp->nangles);
447 <        for (i = 0; i < abp->nangles; i++) {
448 <            RBFNODE     *rbf;
449 <            if (input_orient > 0)               /* use incident patch center */
450 <                fi_getvec(vin, i+.5*(i>0), abp);
451 <            else
452 <                bi_getvec(vin, i+.5*(i>0), abp);
433 >    ANGLE_BASIS *abp = get_basis(kbasis);
434 >    float       (*XZarr)[2] = NULL;
435 >    float       bsdfarr[MAXPATCHES*MAXPATCHES];
436 >    FILE        *cfp[3];
437 >    FVECT       vin, vout;
438 >    double      sum, xsum, ysum, normf;
439 >    int         i, j, ni, no, nisamps, nosamps;
440 >                                        /* sanity check */
441 >    if (abp->nangles > MAXPATCHES) {
442 >        fprintf(stderr, "%s: too many patches!\n", progname);
443 >        exit(1);
444 >    }
445 >    memset(bsdfarr, 0, sizeof(bsdfarr));
446 >    if (rbf_colorimetry == RBCtristimulus)
447 >        XZarr = (float (*)[2])calloc(abp->nangles*abp->nangles, 2*sizeof(float));
448 >    nosamps = (int)(pow((double)npsamps, 0.67) + .5);
449 >    nisamps = (npsamps + (nosamps>>1)) / nosamps;
450 >    normf = 1./(double)(nisamps*nosamps);
451 >    for (i = 0; i < abp->nangles; i++) {
452 >        for (ni = nisamps; ni--; ) {            /* sample over incident patch */
453 >            RBFNODE     *rbf;
454 >            if (input_orient > 0)               /* vary incident patch loc. */
455 >                fi_getvec(vin, i+urand(ni), abp);
456 >            else
457 >                bi_getvec(vin, i+urand(ni), abp);
458  
459 <            rbf = advect_rbf(vin, lobe_lim);    /* compute radial basis func */
459 >            rbf = advect_rbf(vin, lobe_lim);    /* compute radial basis func */
460  
461 <            for (j = 0; j < abp->nangles; j++) {
462 <                sum = 0;                        /* sample over exiting patch */
461 >            for (j = 0; j < abp->nangles; j++) {
462 >                sum = 0;                        /* sample over exiting patch */
463                  xsum = ysum = 0;
464 <                for (n = npsamps; n--; ) {
464 >                for (no = nosamps; no--; ) {
465                      SDValue     sdv;
466                      if (output_orient > 0)
467 <                        fo_getvec(vout, j+(n+frandom())/npsamps, abp);
467 >                        fo_getvec(vout, j+(no+frandom())/nosamps, abp);
468                      else
469 <                        bo_getvec(vout, j+(n+frandom())/npsamps, abp);
469 >                        bo_getvec(vout, j+(no+frandom())/nosamps, abp);
470  
471                      eval_rbfcol(&sdv, rbf, vout);
472                      sum += sdv.cieY;
473                      if (rbf_colorimetry == RBCtristimulus) {
474                          xsum += sdv.cieY * sdv.spec.cx;
475                          ysum += sdv.cieY * sdv.spec.cy;
476 <                    }
476 >                    }
477                  }
478 <                n = j*abp->nangles + i;
479 <                bsdfarr[n] = sum / npsamps;
478 >                no = j*abp->nangles + i;
479 >                bsdfarr[no] += sum * normf;
480                  if (rbf_colorimetry == RBCtristimulus) {
481 <                    XZarr[n][0] = xsum*sum/(npsamps*ysum);
482 <                    XZarr[n][1] = (sum - xsum - ysum)*sum/(npsamps*ysum);
481 >                    XZarr[no][0] += xsum*sum*normf/ysum;
482 >                    XZarr[no][1] += (sum - xsum - ysum)*sum*normf/ysum;
483                  }
484              }
485 <            if (rbf != NULL)
485 >            if (rbf != NULL)
486                  free(rbf);
483            prog_show((i+1.)/abp->nangles);
487          }
488 <                                                /* write out our matrix */
489 <        cfp[CIE_Y] = open_component_file(CIE_Y);
490 <        n = 0;
491 <        for (j = 0; j < abp->nangles; j++) {
492 <            for (i = 0; i < abp->nangles; i++, n++)
493 <                fprintf(cfp[CIE_Y], "\t%.3e\n", bsdfarr[n]);
494 <            fputc('\n', cfp[CIE_Y]);
495 <        }
496 <        prog_done();
497 <        if (fclose(cfp[CIE_Y])) {
498 <                fprintf(stderr, "%s: error writing Y output\n", progname);
499 <                exit(1);
500 <        }
501 <        if (XZarr == NULL)                      /* no color? */
502 <                return;
503 <        cfp[CIE_X] = open_component_file(CIE_X);
504 <        cfp[CIE_Z] = open_component_file(CIE_Z);
505 <        n = 0;
506 <        for (j = 0; j < abp->nangles; j++) {
507 <            for (i = 0; i < abp->nangles; i++, n++) {
508 <                fprintf(cfp[CIE_X], "\t%.3e\n", XZarr[n][0]);
509 <                fprintf(cfp[CIE_Z], "\t%.3e\n", XZarr[n][1]);
510 <            }
511 <            fputc('\n', cfp[CIE_X]);
512 <            fputc('\n', cfp[CIE_Z]);
513 <        }
514 <        free(XZarr);
515 <        if (fclose(cfp[CIE_X]) || fclose(cfp[CIE_Z])) {
516 <                fprintf(stderr, "%s: error writing X/Z output\n", progname);
517 <                exit(1);
518 <        }
488 >        prog_show((i+1.)/abp->nangles);
489 >    }
490 >                                        /* write out our matrix */
491 >    cfp[CIE_Y] = open_component_file(CIE_Y);
492 >    no = 0;
493 >    for (j = 0; j < abp->nangles; j++) {
494 >        for (i = 0; i < abp->nangles; i++, no++)
495 >        fprintf(cfp[CIE_Y], "\t%.3e\n", bsdfarr[no]);
496 >        fputc('\n', cfp[CIE_Y]);
497 >    }
498 >    prog_done();
499 >    if (fclose(cfp[CIE_Y])) {
500 >        fprintf(stderr, "%s: error writing Y output\n", progname);
501 >        exit(1);
502 >    }
503 >    if (XZarr == NULL)                  /* no color? */
504 >        return;
505 >    cfp[CIE_X] = open_component_file(CIE_X);
506 >    cfp[CIE_Z] = open_component_file(CIE_Z);
507 >    no = 0;
508 >    for (j = 0; j < abp->nangles; j++) {
509 >        for (i = 0; i < abp->nangles; i++, no++) {
510 >        fprintf(cfp[CIE_X], "\t%.3e\n", XZarr[no][0]);
511 >        fprintf(cfp[CIE_Z], "\t%.3e\n", XZarr[no][1]);
512 >        }
513 >        fputc('\n', cfp[CIE_X]);
514 >        fputc('\n', cfp[CIE_Z]);
515 >    }
516 >    free(XZarr);
517 >    if (fclose(cfp[CIE_X]) || fclose(cfp[CIE_Z])) {
518 >        fprintf(stderr, "%s: error writing X/Z output\n", progname);
519 >        exit(1);
520 >    }
521   }
522  
523   #if defined(_WIN32) || defined(_WIN64)
# Line 571 | Line 576 | wrap_up(void)
576   }
577   #endif
578  
579 + #define HEAD_BUFLEN     8192
580 + static char     head_buf[HEAD_BUFLEN];
581 + static int      cur_headlen = 0;
582 +
583 + /* Record header line as comment associated with this SIR input */
584 + static int
585 + record2header(char *s)
586 + {
587 +        int     len = strlen(s);
588 +
589 +        if (cur_headlen+len >= HEAD_BUFLEN-6)
590 +                return(0);
591 +                                        /* includes EOL */
592 +        strcpy(head_buf+cur_headlen, s);
593 +        cur_headlen += len;
594 +
595 +        return(1);
596 + }
597 +
598 + /* Finish off header for this file */
599 + static void
600 + done_header(void)
601 + {
602 +        while (cur_headlen > 0 && isspace(head_buf[cur_headlen-1]))
603 +                --cur_headlen;
604 +        head_buf[cur_headlen] = '\0';
605 +        if (!cur_headlen)
606 +                return;
607 +        add_wbsdf("-C", 1);
608 +        add_wbsdf(head_buf, 0);
609 +        head_buf[cur_headlen=0] = '\0';
610 + }
611 +
612   /* Read in BSDF and interpolate as Klems matrix representation */
613   int
614   main(int argc, char *argv[])
# Line 602 | Line 640 | main(int argc, char *argv[])
640                                          add_wbsdf("-f", 1);
641                                          add_wbsdf(argv[i], 1);
642                                  } else {
643 <                                        fcompile(argv[i]);
643 >                                        char    *fpath = getpath(argv[i],
644 >                                                            getrlibpath(), 0);
645 >                                        if (fpath == NULL) {
646 >                                                fprintf(stderr,
647 >                                                "%s: cannot find file '%s'\n",
648 >                                                        argv[0], argv[i]);
649 >                                                return(1);
650 >                                        }
651 >                                        fcompile(fpath);
652                                          single_plane_incident = 0;
653                                  }
654                          } else
# Line 687 | Line 733 | main(int argc, char *argv[])
733                                                  progname, argv[i]);
734                                  return(1);
735                          }
736 +                        sprintf(pbuf, "%s:\n", argv[i]);
737 +                        record2header(pbuf);
738 +                        sir_headshare = &record2header;
739                          if (!load_bsdf_rep(fpin))
740                                  return(1);
741                          fclose(fpin);
742 +                        done_header();
743                          sprintf(pbuf, "Interpolating component '%s'", argv[i]);
744                          prog_start(pbuf);
745                          eval_rbf();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines