Spectrum sample(BSDFSamplingRecord &bRec, Float &pdf, const Point2 &sample) const { const Intersection& its = bRec.its; Intersection perturbed(its); perturbed.shFrame = getFrame(its); BSDFSamplingRecord perturbedQuery(perturbed, bRec.sampler, bRec.mode); perturbedQuery.wi = perturbed.toLocal(its.toWorld(bRec.wi)); perturbedQuery.typeMask = bRec.typeMask; perturbedQuery.component = bRec.component; Float temporaryPdf = (Float)0; Spectrum result = m_nested->sample(perturbedQuery, temporaryPdf, sample); if (temporaryPdf > 0) { bRec.sampledComponent = perturbedQuery.sampledComponent; bRec.sampledType = perturbedQuery.sampledType; bRec.wo = its.toLocal(perturbed.toWorld(perturbedQuery.wo)); bRec.eta = perturbedQuery.eta; if (Frame::cosTheta(bRec.wo) * Frame::cosTheta(perturbedQuery.wo) <= 0) return Spectrum(0.0f); pdf = temporaryPdf; } return result; }
Spectrum eval(const BSDFSamplingRecord &bRec, EMeasure measure) const { const Intersection& its = bRec.its; Intersection perturbed(its); perturbed.shFrame = getFrame(its); BSDFSamplingRecord perturbedQuery(perturbed, perturbed.toLocal(its.toWorld(bRec.wi)), perturbed.toLocal(its.toWorld(bRec.wo)), bRec.mode); if (Frame::cosTheta(bRec.wo) * Frame::cosTheta(perturbedQuery.wo) <= 0) return Spectrum(0.0f); perturbedQuery.sampler = bRec.sampler; perturbedQuery.typeMask = bRec.typeMask; perturbedQuery.component = bRec.component; return m_nested->eval(perturbedQuery, measure); }