00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "glass.h"
00025 #include "bxdf.h"
00026 #include "specularreflection.h"
00027 #include "speculartransmission.h"
00028 #include "fresneldielectric.h"
00029 #include "paramset.h"
00030 #include "dynload.h"
00031
00032 using namespace lux;
00033
00034
00035 BSDF *Glass::GetBSDF(const TsPack *tspack, const DifferentialGeometry &dgGeom, const DifferentialGeometry &dgShading) const {
00036
00037 DifferentialGeometry dgs;
00038 if (bumpMap)
00039 Bump(bumpMap, dgGeom, dgShading, &dgs);
00040 else
00041 dgs = dgShading;
00042
00043 float ior = index->Evaluate(tspack, dgs);
00044 float cb = cauchyb->Evaluate(tspack, dgs);
00045
00046 float flm = film->Evaluate(tspack, dgs);
00047 float flmindex = filmindex->Evaluate(tspack, dgs);
00048
00049 MultiBSDF *bsdf = BSDF_ALLOC(tspack, MultiBSDF)(dgs, dgGeom.nn, ior);
00050
00051 SWCSpectrum R = Kr->Evaluate(tspack, dgs).Clamp(0.f, 1.f);
00052 SWCSpectrum T = Kt->Evaluate(tspack, dgs).Clamp(0.f, 1.f);
00053 Fresnel *fresnel = BSDF_ALLOC(tspack, FresnelDielectric)(1.f, ior, cb);
00054 if (!R.Black()) {
00055 if (architectural)
00056 bsdf->Add(BSDF_ALLOC(tspack, ArchitecturalReflection)(R,
00057 fresnel, flm, flmindex));
00058 else
00059 bsdf->Add(BSDF_ALLOC(tspack, SpecularReflection)(R,
00060 fresnel, flm, flmindex));
00061 }
00062 if (!T.Black())
00063 bsdf->Add(BSDF_ALLOC(tspack, SpecularTransmission)(T, fresnel, cb != 0.f, architectural));
00064
00065
00066 bsdf->SetCompositingParams(compParams);
00067
00068 return bsdf;
00069 }
00070 Material* Glass::CreateMaterial(const Transform &xform,
00071 const TextureParams &mp) {
00072 boost::shared_ptr<Texture<SWCSpectrum> > Kr = mp.GetSWCSpectrumTexture("Kr", RGBColor(1.f));
00073 boost::shared_ptr<Texture<SWCSpectrum> > Kt = mp.GetSWCSpectrumTexture("Kt", RGBColor(1.f));
00074 boost::shared_ptr<Texture<float> > index = mp.GetFloatTexture("index", 1.5f);
00075 boost::shared_ptr<Texture<float> > cbf = mp.GetFloatTexture("cauchyb", 0.f);
00076 boost::shared_ptr<Texture<float> > film = mp.GetFloatTexture("film", 0.f);
00077 boost::shared_ptr<Texture<float> > filmindex = mp.GetFloatTexture("filmindex", 1.5f);
00078 bool archi = mp.FindBool("architectural", false);
00079 boost::shared_ptr<Texture<float> > bumpMap = mp.GetFloatTexture("bumpmap");
00080
00081
00082 CompositingParams cP;
00083 FindCompositingParams(mp, &cP);
00084
00085 return new Glass(Kr, Kt, index, cbf, film, filmindex, archi, bumpMap, cP);
00086 }
00087
00088 static DynamicLoader::RegisterMaterial<Glass> r("glass");