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 Mirror : public Material {
00029 public:
00030
00031 Mirror(Reference<Texture<Spectrum> > r, Reference<Texture<float> > bump) {
00032 Kr = r;
00033 bumpMap = bump;
00034 }
00035 BSDF *GetBSDF(const DifferentialGeometry &dgGeom, const DifferentialGeometry &dgShading) const;
00036 private:
00037
00038 Reference<Texture<Spectrum> > Kr;
00039 Reference<Texture<float> > bumpMap;
00040 };
00041
00042 BSDF *Mirror::GetBSDF(const DifferentialGeometry &dgGeom, const DifferentialGeometry &dgShading) const {
00043
00044 DifferentialGeometry dgs;
00045 if (bumpMap)
00046 Bump(bumpMap, dgGeom, dgShading, &dgs);
00047 else
00048 dgs = dgShading;
00049 BSDF *bsdf = BSDF_ALLOC(BSDF)(dgs, dgGeom.nn);
00050 Spectrum R = Kr->Evaluate(dgs).Clamp();
00051 if (!R.Black())
00052 bsdf->Add(BSDF_ALLOC(SpecularReflection)(R,
00053 BSDF_ALLOC(FresnelNoOp)()));
00054 return bsdf;
00055 }
00056 extern "C" DLLEXPORT Material * CreateMaterial(const Transform &xform,
00057 const TextureParams &mp) {
00058 Reference<Texture<Spectrum> > Kr = mp.GetSpectrumTexture("Kr", Spectrum(1.f));
00059 Reference<Texture<float> > bumpMap = mp.GetFloatTexture("bumpmap", 0.f);
00060 return new Mirror(Kr, bumpMap);
00061 }