| 710 |
|
main(int argc, char *argv[]) |
| 711 |
|
{ |
| 712 |
|
int inpXML = -1; |
| 713 |
+ |
double myLim[2]; |
| 714 |
|
SDData myBSDF; |
| 715 |
< |
int n; |
| 715 |
> |
int a, n; |
| 716 |
|
/* check arguments */ |
| 717 |
|
progname = argv[0]; |
| 718 |
< |
if (argc > 1 && (n = strlen(argv[1])-4) > 0) { |
| 719 |
< |
if (!strcasecmp(argv[1]+n, ".xml")) |
| 718 |
> |
a = 1; |
| 719 |
> |
myLim[0] = -1; myLim[1] = -2; /* specified BSDF range? */ |
| 720 |
> |
if (argc > a+3 && argv[a][0] == '-' && argv[a][1] == 'r') { |
| 721 |
> |
myLim[0] = atof(argv[++a]); |
| 722 |
> |
myLim[1] = atof(argv[++a]); |
| 723 |
> |
++a; |
| 724 |
> |
} |
| 725 |
> |
if (argc > a && (n = strlen(argv[a])-4) > 0) { |
| 726 |
> |
if (!strcasecmp(argv[a]+n, ".xml")) |
| 727 |
|
inpXML = 1; |
| 728 |
< |
else if (!strcasecmp(argv[1]+n, ".sir")) |
| 728 |
> |
else if (!strcasecmp(argv[a]+n, ".sir")) |
| 729 |
|
inpXML = 0; |
| 730 |
|
} |
| 731 |
< |
if (inpXML < 0 || inpXML & (argc > 2)) { |
| 732 |
< |
fprintf(stderr, "Usage: %s bsdf.xml > output.rad\n", progname); |
| 733 |
< |
fprintf(stderr, " Or: %s hemi1.sir hemi2.sir .. > output.rad\n", progname); |
| 731 |
> |
if (inpXML < 0 || inpXML & (argc > a+1)) { |
| 732 |
> |
fprintf(stderr, "Usage: %s [-r min max] bsdf.xml > output.rad\n", progname); |
| 733 |
> |
fprintf(stderr, " Or: %s [-r min max] hemi1.sir hemi2.sir .. > output.rad\n", progname); |
| 734 |
|
return(1); |
| 735 |
|
} |
| 736 |
|
fputs("# ", stdout); /* copy our command */ |
| 737 |
|
printargs(argc, argv, stdout); |
| 738 |
|
/* evaluate BSDF */ |
| 739 |
|
if (inpXML) { |
| 740 |
< |
SDclearBSDF(&myBSDF, argv[1]); |
| 741 |
< |
if (SDreportError(SDloadFile(&myBSDF, argv[1]), stderr)) |
| 740 |
> |
SDclearBSDF(&myBSDF, argv[a]); |
| 741 |
> |
if (SDreportError(SDloadFile(&myBSDF, argv[a]), stderr)) |
| 742 |
|
return(1); |
| 743 |
|
if (myBSDF.rf != NULL) front_comp |= SDsampR; |
| 744 |
|
if (myBSDF.tf != NULL) front_comp |= SDsampT; |
| 746 |
|
if (myBSDF.tb != NULL) back_comp |= SDsampT; |
| 747 |
|
if (!front_comp & !back_comp) { |
| 748 |
|
fprintf(stderr, "%s: nothing to plot in '%s'\n", |
| 749 |
< |
progname, argv[1]); |
| 749 |
> |
progname, argv[a]); |
| 750 |
|
return(1); |
| 751 |
|
} |
| 752 |
< |
if (front_comp & SDsampR && myBSDF.rLambFront.cieY < overall_min*PI) |
| 753 |
< |
overall_min = myBSDF.rLambFront.cieY/PI; |
| 754 |
< |
if (back_comp & SDsampR && myBSDF.rLambBack.cieY < overall_min*PI) |
| 755 |
< |
overall_min = myBSDF.rLambBack.cieY/PI; |
| 756 |
< |
if ((front_comp|back_comp) & SDsampT && |
| 757 |
< |
myBSDF.tLamb.cieY < overall_min*PI) |
| 758 |
< |
overall_min = myBSDF.tLamb.cieY/PI; |
| 752 |
> |
if (myLim[0] >= 0) |
| 753 |
> |
overall_min = myLim[0]; |
| 754 |
> |
else { |
| 755 |
> |
if (front_comp & SDsampR && myBSDF.rLambFront.cieY < overall_min*PI) |
| 756 |
> |
overall_min = myBSDF.rLambFront.cieY/PI; |
| 757 |
> |
if (back_comp & SDsampR && myBSDF.rLambBack.cieY < overall_min*PI) |
| 758 |
> |
overall_min = myBSDF.rLambBack.cieY/PI; |
| 759 |
> |
if ((front_comp|back_comp) & SDsampT && |
| 760 |
> |
myBSDF.tLamb.cieY < overall_min*PI) |
| 761 |
> |
overall_min = myBSDF.tLamb.cieY/PI; |
| 762 |
> |
} |
| 763 |
|
set_minlog(); |
| 764 |
|
if (!build_wBSDF(&myBSDF)) |
| 765 |
|
return(1); |
| 768 |
|
else |
| 769 |
|
strcpy(bsdf_name, myBSDF.name); |
| 770 |
|
strcpy(bsdf_manuf, myBSDF.makr); |
| 771 |
< |
put_matBSDF(argv[1]); |
| 771 |
> |
put_matBSDF(argv[a]); |
| 772 |
|
} else { |
| 773 |
|
FILE *fp[4]; |
| 774 |
< |
if (argc > 5) { |
| 774 |
> |
if (argc > a+4) { |
| 775 |
|
fprintf(stderr, "%s: more than 4 hemispheres!\n", progname); |
| 776 |
|
return(1); |
| 777 |
|
} |
| 778 |
< |
for (n = 1; n < argc; n++) { |
| 779 |
< |
fp[n-1] = fopen(argv[n], "rb"); |
| 780 |
< |
if (fp[n-1] == NULL) { |
| 778 |
> |
for (n = a; n < argc; n++) { |
| 779 |
> |
fp[n-a] = fopen(argv[n], "rb"); |
| 780 |
> |
if (fp[n-a] == NULL) { |
| 781 |
|
fprintf(stderr, "%s: cannot open BSDF interpolant '%s'\n", |
| 782 |
|
progname, argv[n]); |
| 783 |
|
return(1); |
| 784 |
|
} |
| 785 |
< |
if (getheader(fp[n-1], rbf_headline, NULL) < 0) { |
| 785 |
> |
if (getheader(fp[n-a], rbf_headline, NULL) < 0) { |
| 786 |
|
fprintf(stderr, "%s: bad BSDF interpolant '%s'\n", |
| 787 |
|
progname, argv[n]); |
| 788 |
|
return(1); |
| 789 |
|
} |
| 790 |
|
} |
| 791 |
+ |
if (myLim[0] >= 0) |
| 792 |
+ |
overall_min = myLim[0]; |
| 793 |
|
set_minlog(); |
| 794 |
< |
for (n = 1; n < argc; n++) { |
| 795 |
< |
if (fseek(fp[n-1], 0L, SEEK_SET) < 0) { |
| 794 |
> |
for (n = a; n < argc; n++) { |
| 795 |
> |
if (fseek(fp[n-a], 0L, SEEK_SET) < 0) { |
| 796 |
|
fprintf(stderr, "%s: cannot seek on '%s'\n", |
| 797 |
|
progname, argv[n]); |
| 798 |
|
return(1); |
| 799 |
|
} |
| 800 |
< |
if (!load_bsdf_rep(fp[n-1])) |
| 800 |
> |
if (!load_bsdf_rep(fp[n-a])) |
| 801 |
|
return(1); |
| 802 |
< |
fclose(fp[n-1]); |
| 802 |
> |
fclose(fp[n-a]); |
| 803 |
|
if (!build_wRBF()) |
| 804 |
|
return(1); |
| 805 |
|
} |
| 806 |
|
put_matBSDF(NULL); |
| 807 |
|
} |
| 808 |
+ |
if (myLim[1] > myLim[0]) /* override maximum BSDF? */ |
| 809 |
+ |
overall_max = myLim[1]; |
| 810 |
|
put_source(); /* before hemispheres & labels */ |
| 811 |
|
put_hemispheres(); |
| 812 |
|
put_scale(); |