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 Skin : public Material {
00029 public:
00030 Skin(Reference<Texture<float> > bump) : bumpMap(bump) { }
00031 BSDF *GetBSDF(const DifferentialGeometry &dgGeom, const DifferentialGeometry &dgShading) const;
00032 Reference<Texture<float> > bumpMap;
00033 };
00034
00035
00036 BSDF *Skin::GetBSDF(const DifferentialGeometry &dgGeom, const DifferentialGeometry &dgShading) const {
00037
00038 static float diffuse[3] = { 0.428425f, 0.301341f, 0.331054f};
00039 static float xy0[3] = { -1.131747f, -1.016939f, -0.966018f};
00040 static float z0[3] = { -1.209182f, -1.462488f, -1.222419f};
00041 static float e0[3] = { 6.421658f, 3.699932f, 3.524889f};
00042 static float xy1[3] = { -0.546570f, -0.643533f, -0.638934f};
00043 static float z1[3] = { 0.380123f, 0.410559f, 0.437367f};
00044 static float e1[3] = { 3.685044f, 4.266495f, 4.539742f};
00045 static float xy2[3] = { -0.998888f, -1.020153f, -1.027479f};
00046 static float z2[3] = { 0.857998f, 0.703913f, 0.573625f};
00047 static float e2[3] = { 64.208486f, 63.919687f, 43.809866f};
00048 static Spectrum xy[3] = { Spectrum(xy0), Spectrum(xy1), Spectrum(xy2) };
00049 static Spectrum z[3] = { Spectrum(z0), Spectrum(z1), Spectrum(z2) };
00050 static Spectrum e[3] = { Spectrum(e0), Spectrum(e1), Spectrum(e2) };
00051
00052 DifferentialGeometry dgs;
00053 if (bumpMap)
00054 Bump(bumpMap, dgGeom, dgShading, &dgs);
00055 else
00056 dgs = dgShading;
00057 BSDF *bsdf = BSDF_ALLOC(BSDF)(dgs, dgGeom.nn);
00058 bsdf->Add(BSDF_ALLOC(Lafortune)(Spectrum(diffuse), 3, xy, xy, z, e,
00059 BxDFType(BSDF_REFLECTION | BSDF_DIFFUSE)));
00060 return bsdf;
00061 }
00062 extern "C" DLLEXPORT Material * CreateMaterial(const Transform &xform,
00063 const TextureParams &mp) {
00064 Reference<Texture<float> > bumpMap = mp.GetFloatTexture("bumpmap", 0.f);
00065 return new Skin(bumpMap);
00066 }