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 BluePaint : public Material {
00029 public:
00030 BluePaint(Reference<Texture<float> > bump) : bumpMap(bump) { }
00031 BSDF *GetBSDF(const DifferentialGeometry &dgGeom, const DifferentialGeometry &dgShading) const;
00032 Reference<Texture<float> > bumpMap;
00033 };
00034
00035 BSDF *BluePaint::GetBSDF(const DifferentialGeometry &dgGeom, const DifferentialGeometry &dgShading) const {
00036
00037 static float diffuse[3] = { 0.3094f, 0.39667f, 0.70837f };
00038 static float xy0[3] = { 0.870567f, 0.857255f, 0.670982f };
00039 static float z0[3] = { 0.803624f, 0.774290f, 0.586674f };
00040 static float e0[3] = { 21.820103f, 18.597755f, 7.472717f };
00041 static float xy1[3] = { -0.451218f, -0.406681f, -0.477976f };
00042 static float z1[3] = { 0.023123f, 0.017625f, 0.227295f };
00043 static float e1[3] = { 2.774499f, 2.581499f, 3.677653f };
00044 static float xy2[3] = { -1.031545f, -1.029426f, -1.026588f };
00045 static float z2[3] = { 0.706734f, 0.696530f, 0.687715f };
00046 static float e2[3] = { 66.899060f, 63.767912f, 57.489181f };
00047 static Spectrum xy[3] = { Spectrum(xy0), Spectrum(xy1), Spectrum(xy2) };
00048 static Spectrum z[3] = { Spectrum(z0), Spectrum(z1), Spectrum(z2) };
00049 static Spectrum e[3] = { Spectrum(e0), Spectrum(e1), Spectrum(e2) };
00050
00051 DifferentialGeometry dgs;
00052 if (bumpMap)
00053 Bump(bumpMap, dgGeom, dgShading, &dgs);
00054 else
00055 dgs = dgShading;
00056 BSDF *bsdf = BSDF_ALLOC(BSDF)(dgs, dgGeom.nn);
00057 bsdf->Add(BSDF_ALLOC(Lafortune)(Spectrum(diffuse), 3, xy, xy, z, e,
00058 BxDFType(BSDF_REFLECTION | BSDF_DIFFUSE)));
00059 return bsdf;
00060 }
00061 extern "C" DLLEXPORT Material * CreateMaterial(const Transform &xform,
00062 const TextureParams &mp) {
00063 Reference<Texture<float> > bumpMap = mp.GetFloatTexture("bumpmap", 0.f);
00064 return new BluePaint(bumpMap);
00065 }