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
00026 #include "stdafx.h"
00027 #include "materials/mixmat.h"
00028 #include "materials/matte.h"
00029 #include "spectrum.h"
00030 #include "reflection.h"
00031 #include "paramset.h"
00032 #include "texture.h"
00033
00034
00035 BSDF *MixMaterial::GetBSDF(const DifferentialGeometry &dgGeom,
00036 const DifferentialGeometry &dgShading,
00037 MemoryArena &arena) const {
00038 BSDF *b1 = m1->GetBSDF(dgGeom, dgShading, arena);
00039 BSDF *b2 = m2->GetBSDF(dgGeom, dgShading, arena);
00040 Spectrum s1 = scale->Evaluate(dgShading).Clamp();
00041 Spectrum s2 = (Spectrum(1.f) - s1).Clamp();
00042 int n1 = b1->NumComponents(), n2 = b2->NumComponents();
00043 for (int i = 0; i < n1; ++i)
00044 b1->bxdfs[i] = BSDF_ALLOC(arena, ScaledBxDF)(b1->bxdfs[i], s1);
00045 for (int i = 0; i < n2; ++i)
00046 b1->Add(BSDF_ALLOC(arena, ScaledBxDF)(b2->bxdfs[i], s2));
00047 return b1;
00048 }
00049
00050
00051 MixMaterial *CreateMixMaterial(const Transform &xform,
00052 const TextureParams &mp, const Reference<Material> &m1,
00053 const Reference<Material> &m2) {
00054 Reference<Texture<Spectrum> > scale = mp.GetSpectrumTexture("amount",
00055 Spectrum(0.5f));
00056 return new MixMaterial(m1, m2, scale);
00057 }
00058
00059