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 (20 months, 3 weeks 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

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: loadbsdf.c,v 3.13 2021/03/27 17:50:18 greg Exp $";
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 if (!SDerrorDetail[0])
18 return(strcpy(errmsg, SDerrorList[ec]));
19
20 sprintf(errmsg, "%s: %s", SDerrorList[ec], SDerrorDetail);
21 return(errmsg);
22 }
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 loadBSDF(char *fname)
39 {
40 SDData *sd;
41 SDError ec;
42 char *pname;
43
44 sd = SDgetCache(fname); /* look up or allocate */
45 if (sd == NULL)
46 error(SYSTEM, "out of memory in loadBSDF");
47 if (SDisLoaded(sd)) /* already in memory? */
48 return(sd);
49 /* else find and load it */
50 pname = getpath(fname, getrlibpath(), R_OK);
51 if (pname == NULL) {
52 sprintf(errmsg, "cannot find BSDF file \"%s\"", fname);
53 error(SYSTEM, errmsg);
54 }
55 ec = SDloadFile(sd, pname);
56 if (ec)
57 error(USER, transSDError(ec));
58 /* simple checks */
59 checkDF(sd->name, sd->rLambFront.cieY, sd->rf, "front reflection");
60 checkDF(sd->name, sd->rLambBack.cieY, sd->rb, "rear reflection");
61 checkDF(sd->name, sd->tLambFront.cieY, sd->tf, "front transmission");
62 checkDF(sd->name, sd->tLambBack.cieY, sd->tb, "back transmission");
63 #ifdef DEBUG
64 {
65 float rgb[3];
66 fprintf(stderr, "Loaded BSDF '%s' (file \"%s\")\n", sd->name, pname);
67 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 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 if (sd->rf)
76 fprintf(stderr, "Maximum direct hemispherical front reflection (less diffuse): %.3f%%\n",
77 sd->rf->maxHemi*100.);
78 if (sd->rb)
79 fprintf(stderr, "Maximum direct hemispherical back reflection (less diffuse): %.3f%%\n",
80 sd->rb->maxHemi*100.);
81 if (sd->tf)
82 fprintf(stderr, "Maximum direct hemispherical front transmission (less diffuse): %.3f%%\n",
83 sd->tf->maxHemi*100.);
84 if (sd->tb)
85 fprintf(stderr, "Maximum direct hemispherical back transmission (less diffuse): %.3f%%\n",
86 sd->tb->maxHemi*100.);
87 }
88 #endif
89 SDretainSet = SDretainAll; /* keep data in core */
90 #ifdef SMLMEM
91 SDmaxCache = 5L*1024*1024;
92 #else
93 SDmaxCache = 250L*1024*1024;
94 #endif
95 return(sd);
96 }