144 |
|
|
145 |
|
/* Load and convert a matrix BTDF from the given XML file */ |
146 |
|
CMATRIX * |
147 |
< |
cm_loadBTDF(char *fname) |
147 |
> |
cm_loadBTDF(const char *fname) |
148 |
|
{ |
149 |
|
CMATRIX *Tmat; |
150 |
|
int recip; |
151 |
|
SDError ec; |
152 |
|
SDData myBSDF; |
153 |
|
SDSpectralDF *tdf; |
154 |
< |
COLOR diffBSDF; |
154 |
> |
COLOR diffBTDF; |
155 |
|
|
156 |
|
SDclearBSDF(&myBSDF, fname); /* load XML and check type */ |
157 |
|
ec = SDloadFile(&myBSDF, fname); |
158 |
|
if (ec) |
159 |
|
error(USER, transSDError(ec)); |
160 |
– |
ccy2rgb(&myBSDF.tLamb.spec, myBSDF.tLamb.cieY/PI, diffBSDF); |
160 |
|
recip = (myBSDF.tb == NULL); |
161 |
+ |
if (recip) |
162 |
+ |
ccy2rgb(&myBSDF.tLambFront.spec, myBSDF.tLambFront.cieY/PI, diffBTDF); |
163 |
+ |
else |
164 |
+ |
ccy2rgb(&myBSDF.tLambBack.spec, myBSDF.tLambBack.cieY/PI, diffBTDF); |
165 |
|
tdf = recip ? myBSDF.tf : myBSDF.tb; |
166 |
|
if (tdf == NULL) { /* no non-Lambertian transmission? */ |
167 |
|
SDfreeBSDF(&myBSDF); |
168 |
< |
return(cm_bsdf_Lamb(diffBSDF)); |
168 |
> |
return(cm_bsdf_Lamb(diffBTDF)); |
169 |
|
} |
170 |
|
if (tdf->ncomp != 1 || tdf->comp[0].func != &SDhandleMtx) { |
171 |
|
sprintf(errmsg, "unsupported BSDF '%s'", fname); |
172 |
|
error(USER, errmsg); |
173 |
|
} |
174 |
|
/* convert BTDF to matrix */ |
175 |
< |
Tmat = recip ? cm_bsdf_recip(diffBSDF, (SDMat *)tdf->comp[0].dist) |
176 |
< |
: cm_bsdf(diffBSDF, (SDMat *)tdf->comp[0].dist); |
175 |
> |
Tmat = recip ? cm_bsdf_recip(diffBTDF, (SDMat *)tdf->comp[0].dist) |
176 |
> |
: cm_bsdf(diffBTDF, (SDMat *)tdf->comp[0].dist); |
177 |
|
/* free BSDF and return */ |
178 |
|
SDfreeBSDF(&myBSDF); |
179 |
|
return(Tmat); |
180 |
+ |
} |
181 |
+ |
|
182 |
+ |
/* Load and convert a matrix BRDF from the given XML file */ |
183 |
+ |
CMATRIX * |
184 |
+ |
cm_loadBRDF(const char *fname, int backside) |
185 |
+ |
{ |
186 |
+ |
CMATRIX *Rmat; |
187 |
+ |
SDError ec; |
188 |
+ |
SDData myBSDF; |
189 |
+ |
SDSpectralDF *rdf; |
190 |
+ |
COLOR diffBRDF; |
191 |
+ |
|
192 |
+ |
SDclearBSDF(&myBSDF, fname); /* load XML and check type */ |
193 |
+ |
ec = SDloadFile(&myBSDF, fname); |
194 |
+ |
if (ec) |
195 |
+ |
error(USER, transSDError(ec)); |
196 |
+ |
if (backside) { |
197 |
+ |
ccy2rgb(&myBSDF.rLambBack.spec, myBSDF.rLambBack.cieY/PI, diffBRDF); |
198 |
+ |
rdf = myBSDF.rb; |
199 |
+ |
} else { |
200 |
+ |
ccy2rgb(&myBSDF.rLambFront.spec, myBSDF.rLambFront.cieY/PI, diffBRDF); |
201 |
+ |
rdf = myBSDF.rf; |
202 |
+ |
} |
203 |
+ |
if (rdf == NULL) { /* no non-Lambertian reflection? */ |
204 |
+ |
SDfreeBSDF(&myBSDF); |
205 |
+ |
return(cm_bsdf_Lamb(diffBRDF)); |
206 |
+ |
} |
207 |
+ |
if (rdf->ncomp != 1 || rdf->comp[0].func != &SDhandleMtx) { |
208 |
+ |
sprintf(errmsg, "unsupported BSDF '%s'", fname); |
209 |
+ |
error(USER, errmsg); |
210 |
+ |
} |
211 |
+ |
/* convert BRDF to matrix */ |
212 |
+ |
Rmat = cm_bsdf(diffBRDF, (SDMat *)rdf->comp[0].dist); |
213 |
+ |
/* free BSDF and return */ |
214 |
+ |
SDfreeBSDF(&myBSDF); |
215 |
+ |
return(Rmat); |
216 |
|
} |