ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/loadbsdf.c
Revision: 3.14
Committed: Fri Aug 12 23:55:00 2022 UTC (21 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4, HEAD
Changes since 3.13: +5 -5 lines
Log Message:
fix(iso2klems): used solid angle, when projected SA needed, and integral factor

File Contents

# User Rev Content
1 greg 3.1 #ifndef lint
2 greg 3.14 static const char RCSid[] = "$Id: loadbsdf.c,v 3.13 2021/03/27 17:50:18 greg Exp $";
3 greg 3.1 #endif
4     /*
5     * Simple interface for loading BSDF, Radiance-specific search
6     */
7    
8     #include "rtio.h"
9     #include "rterror.h"
10     #include "bsdf.h"
11     #include "paths.h"
12    
13     /* Convert error from BSDF library */
14     char *
15     transSDError(SDError ec)
16     {
17 greg 3.2 if (!SDerrorDetail[0])
18 greg 3.8 return(strcpy(errmsg, SDerrorList[ec]));
19 greg 3.1
20 greg 3.8 sprintf(errmsg, "%s: %s", SDerrorList[ec], SDerrorDetail);
21 greg 3.2 return(errmsg);
22 greg 3.1 }
23    
24     /* Make sure we're not over 100% scattering for this component */
25     static void
26     checkDF(const char *nm, double amt, const SDSpectralDF *dfp, const char *desc)
27     {
28     if (dfp != NULL)
29     amt += dfp->maxHemi;
30     if (amt <= 1.01)
31     return;
32     sprintf(errmsg, "BSDF \"%s\" has %.1f%% %s", nm, amt*100., desc);
33     error(WARNING, errmsg);
34     }
35    
36     /* Load a BSDF file and perform some basic checks */
37     SDData *
38 greg 3.2 loadBSDF(char *fname)
39 greg 3.1 {
40 greg 3.2 SDData *sd;
41 greg 3.1 SDError ec;
42     char *pname;
43    
44 greg 3.2 sd = SDgetCache(fname); /* look up or allocate */
45 greg 3.1 if (sd == NULL)
46     error(SYSTEM, "out of memory in loadBSDF");
47 greg 3.2 if (SDisLoaded(sd)) /* already in memory? */
48 greg 3.1 return(sd);
49 greg 3.2 /* else find and load it */
50     pname = getpath(fname, getrlibpath(), R_OK);
51 greg 3.1 if (pname == NULL) {
52 greg 3.2 sprintf(errmsg, "cannot find BSDF file \"%s\"", fname);
53 greg 3.11 error(SYSTEM, errmsg);
54 greg 3.1 }
55     ec = SDloadFile(sd, pname);
56     if (ec)
57     error(USER, transSDError(ec));
58     /* simple checks */
59 greg 3.2 checkDF(sd->name, sd->rLambFront.cieY, sd->rf, "front reflection");
60     checkDF(sd->name, sd->rLambBack.cieY, sd->rb, "rear reflection");
61 greg 3.13 checkDF(sd->name, sd->tLambFront.cieY, sd->tf, "front transmission");
62     checkDF(sd->name, sd->tLambBack.cieY, sd->tb, "back transmission");
63 greg 3.10 #ifdef DEBUG
64 greg 3.9 {
65     float rgb[3];
66 greg 3.2 fprintf(stderr, "Loaded BSDF '%s' (file \"%s\")\n", sd->name, pname);
67 greg 3.9 ccy2rgb(&sd->rLambFront.spec, sd->rLambFront.cieY, rgb);
68     fprintf(stderr, "Front diffuse RGB: %.4f %.4f %.4f\n", rgb[0], rgb[1], rgb[2]);
69     ccy2rgb(&sd->rLambBack.spec, sd->rLambBack.cieY, rgb);
70     fprintf(stderr, "Back diffuse RGB: %.4f %.4f %.4f\n", rgb[0], rgb[1], rgb[2]);
71 greg 3.13 ccy2rgb(&sd->tLambFront.spec, sd->tLamb.cieY, rgb);
72     fprintf(stderr, "Front diffuse RGB transmittance: %.4f %.4f %.4f\n", rgb[0], rgb[1], rgb[2]);
73     ccy2rgb(&sd->tLambBack.spec, sd->tLamb.cieY, rgb);
74     fprintf(stderr, "Back diffuse RGB transmittance: %.4f %.4f %.4f\n", rgb[0], rgb[1], rgb[2]);
75 greg 3.2 if (sd->rf)
76 greg 3.14 fprintf(stderr, "Maximum direct hemispherical front reflection (less diffuse): %.3f%%\n",
77 greg 3.2 sd->rf->maxHemi*100.);
78     if (sd->rb)
79 greg 3.14 fprintf(stderr, "Maximum direct hemispherical back reflection (less diffuse): %.3f%%\n",
80 greg 3.2 sd->rb->maxHemi*100.);
81     if (sd->tf)
82 greg 3.14 fprintf(stderr, "Maximum direct hemispherical front transmission (less diffuse): %.3f%%\n",
83 greg 3.2 sd->tf->maxHemi*100.);
84 greg 3.7 if (sd->tb)
85 greg 3.14 fprintf(stderr, "Maximum direct hemispherical back transmission (less diffuse): %.3f%%\n",
86 greg 3.7 sd->tb->maxHemi*100.);
87 greg 3.9 }
88 greg 3.3 #endif
89 greg 3.1 SDretainSet = SDretainAll; /* keep data in core */
90 greg 3.12 #ifdef SMLMEM
91     SDmaxCache = 5L*1024*1024;
92     #else
93     SDmaxCache = 250L*1024*1024;
94     #endif
95 greg 3.1 return(sd);
96     }