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 "shinymetal.h"
00025 #include "bxdf.h"
00026 #include "fresnelgeneral.h"
00027 #include "blinn.h"
00028 #include "anisotropic.h"
00029 #include "microfacet.h"
00030 #include "specularreflection.h"
00031 #include "paramset.h"
00032 #include "dynload.h"
00033
00034 using namespace lux;
00035
00036
00037 BSDF *ShinyMetal::GetBSDF(const TsPack *tspack, const DifferentialGeometry &dgGeom, const DifferentialGeometry &dgShading) const {
00038
00039 DifferentialGeometry dgs;
00040 if (bumpMap)
00041 Bump(bumpMap, dgGeom, dgShading, &dgs);
00042 else
00043 dgs = dgShading;
00044 MultiBSDF *bsdf = BSDF_ALLOC(tspack, MultiBSDF)(dgs, dgGeom.nn);
00045 SWCSpectrum spec = Ks->Evaluate(tspack, dgs).Clamp();
00046 SWCSpectrum R = Kr->Evaluate(tspack, dgs).Clamp();
00047
00048 float u = nu->Evaluate(tspack, dgs);
00049 float v = nv->Evaluate(tspack, dgs);
00050
00051 float flm = film->Evaluate(tspack, dgs);
00052 float flmindex = filmindex->Evaluate(tspack, dgs);
00053
00054 MicrofacetDistribution *md;
00055 if(u == v)
00056 md = BSDF_ALLOC(tspack, Blinn)(1.f / u);
00057 else
00058 md = BSDF_ALLOC(tspack, Anisotropic)(1.f/u, 1.f/v);
00059
00060 Fresnel *frMf = BSDF_ALLOC(tspack, FresnelGeneral)(FresnelApproxEta(spec), FresnelApproxK(spec));
00061 Fresnel *frSr = BSDF_ALLOC(tspack, FresnelGeneral)(FresnelApproxEta(R), FresnelApproxK(R));
00062 bsdf->Add(BSDF_ALLOC(tspack, Microfacet)(1., frMf, md));
00063 bsdf->Add(BSDF_ALLOC(tspack, SpecularReflection)(1., frSr, flm, flmindex));
00064
00065
00066 bsdf->SetCompositingParams(compParams);
00067
00068 return bsdf;
00069 }
00070 Material* ShinyMetal::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> > Ks = mp.GetSWCSpectrumTexture("Ks", RGBColor(1.f));
00074 boost::shared_ptr<Texture<float> > uroughness = mp.GetFloatTexture("uroughness", .1f);
00075 boost::shared_ptr<Texture<float> > vroughness = mp.GetFloatTexture("vroughness", .1f);
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 boost::shared_ptr<Texture<float> > bumpMap = mp.GetFloatTexture("bumpmap");
00079
00080
00081 CompositingParams cP;
00082 FindCompositingParams(mp, &cP);
00083
00084 return new ShinyMetal(Ks, uroughness, vroughness, film, filmindex, Kr, bumpMap, cP);
00085 }
00086
00087 static DynamicLoader::RegisterMaterial<ShinyMetal> r("shinymetal");