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 "felt.h"
00025 #include "bxdf.h"
00026 #include "lafortune.h"
00027 #include "paramset.h"
00028
00029 using namespace lux;
00030
00031
00032 BSDF *Felt::GetBSDF(const DifferentialGeometry &dgGeom, const DifferentialGeometry &dgShading) const {
00033
00034 static float diffuse[3] = { 0.025865f, 0.025865f, 0.025865f};
00035 static float xy0[3] = { -0.304075f, -0.304075f, -0.304075f};
00036 static float z0[3] = { -0.065992f, -0.065992f, -0.065992f};
00037 static float e0[3] = { 3.047892f, 3.047892f, 3.047892f};
00038 static float xy1[3] = { -0.749561f, -0.749561f, -0.749561f};
00039 static float z1[3] = { -1.167929f, -1.167929f, -1.167929f};
00040 static float e1[3] = { 6.931827f, 6.931827f, 6.931827f};
00041 static float xy2[3] = { 1.004921f, 1.004921f, 1.004921f};
00042 static float z2[3] = { -0.205529f, -0.205529f, -0.205529f};
00043 static float e2[3] = { 94.117332f, 94.117332f, 94.117332f};
00044 static SWCSpectrum xy[3] = { SWCSpectrum(Spectrum(xy0)), SWCSpectrum(Spectrum(xy1)), SWCSpectrum(Spectrum(xy2)) };
00045 static SWCSpectrum z[3] = { SWCSpectrum(Spectrum(z0)), SWCSpectrum(Spectrum(z1)), SWCSpectrum(Spectrum(z2)) };
00046 static SWCSpectrum e[3] = { SWCSpectrum(Spectrum(e0)), SWCSpectrum(Spectrum(e1)), SWCSpectrum(Spectrum(e2)) };
00047
00048 DifferentialGeometry dgs;
00049 if (bumpMap)
00050 Bump(bumpMap, dgGeom, dgShading, &dgs);
00051 else
00052 dgs = dgShading;
00053 BSDF *bsdf = BSDF_ALLOC( BSDF)(dgs, dgGeom.nn);
00054 bsdf->Add(BSDF_ALLOC( Lafortune)(Spectrum(diffuse), 3, xy, xy, z, e,
00055 BxDFType(BSDF_REFLECTION | BSDF_DIFFUSE)));
00056 return bsdf;
00057 }
00058 Material* Felt::CreateMaterial(const Transform &xform,
00059 const TextureParams &mp) {
00060 boost::shared_ptr<Texture<float> > bumpMap = mp.GetFloatTexture("bumpmap", 0.f);
00061 return new Felt(bumpMap);
00062 }