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 "substrate.h"
00025 #include "bxdf.h"
00026 #include "fresnelblend.h"
00027 #include "blinn.h"
00028 #include "anisotropic.h"
00029 #include "paramset.h"
00030
00031 using namespace lux;
00032
00033
00034 BSDF *Substrate::GetBSDF(const DifferentialGeometry &dgGeom, const DifferentialGeometry &dgShading, float) const {
00035
00036 DifferentialGeometry dgs;
00037 if (bumpMap)
00038 Bump(bumpMap, dgGeom, dgShading, &dgs);
00039 else
00040 dgs = dgShading;
00041 BSDF *bsdf = BSDF_ALLOC( BSDF)(dgs, dgGeom.nn);
00042
00043 SWCSpectrum d(Kd->Evaluate(dgs).Clamp(0.f, 1.f));
00044 SWCSpectrum s(Ks->Evaluate(dgs).Clamp(0.f, 1.f));
00045
00046 float u = nu->Evaluate(dgs);
00047 float v = nv->Evaluate(dgs);
00048
00049 if(u == v)
00050 bsdf->Add(BSDF_ALLOC( FresnelBlend)(d, s, BSDF_ALLOC( Blinn)(1.f/u)));
00051 else
00052 bsdf->Add(BSDF_ALLOC( FresnelBlend)(d, s, BSDF_ALLOC( Anisotropic)(1.f/u, 1.f/v)));
00053
00054 return bsdf;
00055 }
00056 Material* Substrate::CreateMaterial(const Transform &xform,
00057 const TextureParams &mp) {
00058 boost::shared_ptr<Texture<Spectrum> > Kd = mp.GetSpectrumTexture("Kd", Spectrum(.5f));
00059 boost::shared_ptr<Texture<Spectrum> > Ks = mp.GetSpectrumTexture("Ks", Spectrum(.5f));
00060 boost::shared_ptr<Texture<float> > uroughness = mp.GetFloatTexture("uroughness", .1f);
00061 boost::shared_ptr<Texture<float> > vroughness = mp.GetFloatTexture("vroughness", .1f);
00062 boost::shared_ptr<Texture<float> > bumpMap = mp.GetFloatTexture("bumpmap", 0.f);
00063 return new Substrate(Kd, Ks, uroughness, vroughness, bumpMap);
00064 }