ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/loadbsdf.c
Revision: 3.1
Committed: Fri Feb 18 02:41:55 2011 UTC (13 years, 3 months ago) by greg
Content type: text/plain
Branch: MAIN
Log Message:
Minor fixes and adjustments

File Contents

# User Rev Content
1 greg 3.1 #ifndef lint
2     static const char RCSid[] = "$Id$";
3     #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     static char mymess[128];
18    
19     if (!SDerrorDetail[0])
20     return(strcpy(mymess, SDerrorEnglish[ec]));
21     sprintf(mymess, "%s: %s", SDerrorEnglish[ec], SDerrorDetail);
22     return(mymess);
23     }
24    
25     /* Make sure we're not over 100% scattering for this component */
26     static void
27     checkDF(const char *nm, double amt, const SDSpectralDF *dfp, const char *desc)
28     {
29     if (dfp != NULL)
30     amt += dfp->maxHemi;
31     if (amt <= 1.01)
32     return;
33     sprintf(errmsg, "BSDF \"%s\" has %.1f%% %s", nm, amt*100., desc);
34     error(WARNING, errmsg);
35     }
36    
37     /* Load a BSDF file and perform some basic checks */
38     SDData *
39     loadBSDF(char *name)
40     {
41     SDData *sd = SDgetCache(name);
42     SDError ec;
43     char *pname;
44    
45     if (sd == NULL)
46     error(SYSTEM, "out of memory in loadBSDF");
47     if (SDisLoaded(sd))
48     return(sd);
49    
50     pname = getpath(name, getrlibpath(), R_OK);
51     if (pname == NULL) {
52     sprintf(errmsg, "cannot find BSDF file \"%s\"", name);
53     error(USER, errmsg);
54     }
55     ec = SDloadFile(sd, pname);
56     if (ec)
57     error(USER, transSDError(ec));
58     /* simple checks */
59     checkDF(name, sd->rLambFront.cieY, sd->rf, "front reflection");
60     checkDF(name, sd->rLambBack.cieY, sd->rb, "rear reflection");
61     checkDF(name, sd->tLamb.cieY, sd->tf, "transmission");
62    
63     SDretainSet = SDretainAll; /* keep data in core */
64     return(sd);
65     }