00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "pbrt.h"
00026 #include "material.h"
00027
00028 class Clay : public Material {
00029 public:
00030 Clay(Reference<Texture<float> > bump) : bumpMap(bump) { }
00031 BSDF *GetBSDF(const DifferentialGeometry &dgGeom, const DifferentialGeometry &dgShading) const;
00032 private:
00033 Reference<Texture<float> > bumpMap;
00034 };
00035
00036
00037 BSDF *Clay::GetBSDF(const DifferentialGeometry &dgGeom, const DifferentialGeometry &dgShading) const {
00038
00039 static float diffuse[3] = { 0.383626f, 0.260749f, 0.274207f };
00040 static float xy0[3] = { -1.089701f, -1.102701f, -1.107603f };
00041 static float z0[3] = { -1.354682f, -2.714801f, -1.569866f };
00042 static float e0[3] = { 17.968505f, 11.024489f, 21.270282f };
00043 static float xy1[3] = { -0.733381f, -0.793320f, -0.848206f };
00044 static float z1[3] = { 0.676108f, 0.679314f, 0.726031f };
00045 static float e1[3] = { 8.219745f, 9.055139f, 11.261951f };
00046 static float xy2[3] = { -1.010548f, -1.012378f, -1.011263f };
00047 static float z2[3] = { 0.910783f, 0.885239f, 0.892451f };
00048 static float e2[3] = { 152.912795f, 141.937171f, 201.046802f };
00049 static Spectrum xy[3] = { Spectrum(xy0), Spectrum(xy1), Spectrum(xy2) };
00050 static Spectrum z[3] = { Spectrum(z0), Spectrum(z1), Spectrum(z2) };
00051 static Spectrum e[3] = { Spectrum(e0), Spectrum(e1), Spectrum(e2) };
00052
00053 DifferentialGeometry dgs;
00054 if (bumpMap)
00055 Bump(bumpMap, dgGeom, dgShading, &dgs);
00056 else
00057 dgs = dgShading;
00058 BSDF *bsdf = BSDF_ALLOC(BSDF)(dgs, dgGeom.nn);
00059 bsdf->Add(BSDF_ALLOC(Lafortune)(Spectrum(diffuse), 3, xy, xy, z, e,
00060 BxDFType(BSDF_REFLECTION | BSDF_DIFFUSE)));
00061 return bsdf;
00062 }
00063 extern "C" DLLEXPORT Material * CreateMaterial(const Transform &xform,
00064 const TextureParams &mp) {
00065 Reference<Texture<float> > bumpMap = mp.GetFloatTexture("bumpmap", 0.f);
00066 return new Clay(bumpMap);
00067 }