diff --git a/data/tests/test_bsdf.xml b/data/tests/test_bsdf.xml index c0ca33e2..d66d3f41 100644 --- a/data/tests/test_bsdf.xml +++ b/data/tests/test_bsdf.xml @@ -2,6 +2,12 @@ to be tested for consistency. This is done using the testcase 'test_chisquare' --> + + + + + + @@ -130,6 +136,6 @@ - + diff --git a/src/bsdfs/SConscript b/src/bsdfs/SConscript index a6daee23..064f0e40 100644 --- a/src/bsdfs/SConscript +++ b/src/bsdfs/SConscript @@ -11,15 +11,14 @@ plugins += env.SharedLibrary('roughconductor', ['roughconductor.cpp']) plugins += env.SharedLibrary('roughplastic', ['roughplastic.cpp']) # Materials that act as modifiers -#plugins += env.SharedLibrary('coating', ['coating.cpp']) plugins += env.SharedLibrary('twosided', ['twosided.cpp']) plugins += env.SharedLibrary('mask', ['mask.cpp']) plugins += env.SharedLibrary('mixture', ['mixture.cpp']) - +plugins += env.SharedLibrary('coating', ['coating.cpp']) # Other materials -plugins += env.SharedLibrary('phong', ['phong.cpp']) plugins += env.SharedLibrary('ward', ['ward.cpp']) +plugins += env.SharedLibrary('phong', ['phong.cpp']) plugins += env.SharedLibrary('irawan', ['irawan.cpp']) plugins += env.SharedLibrary('difftrans', ['difftrans.cpp']) diff --git a/src/bsdfs/coating.cpp b/src/bsdfs/coating.cpp index 49b4866d..2322de73 100644 --- a/src/bsdfs/coating.cpp +++ b/src/bsdfs/coating.cpp @@ -17,39 +17,43 @@ */ #include -#include +#include +#include "ior.h" MTS_NAMESPACE_BEGIN -/*! \plugin{coating}{Smooth dieletric coating} +/*! \plugin{coating}{Smooth dielectric coating} * \order{9} * * \parameters{ - * \parameter{intIOR}{\Float}{Interior index of refraction \default{1.5046}} - * \parameter{extIOR}{\Float}{Exterior index of refraction \default{1.0}} + * \parameter{intIOR}{\Float\Or\String}{Interior index of refraction specified + * numerically or using a known material name. \default{\texttt{bk7} / 1.5046}} + * \parameter{extIOR}{\Float\Or\String}{Exterior index of refraction specified + * numerically or using a known material name. \default{\texttt{air} / 1.000277}} * } - * This class implements a smooth dielectric coating in the style of \cite{Weidlich2007Arbitrarily}. * - * XXX cancel out cosine factors? - * XXX did I get the measure conversion terms right? - * XXX allow testing interface to verify delta components + * This class implements a smooth dielectric coating in the style of + * Weidlich and Wilkie \cite{Weidlich2007Arbitrarily}. */ -class SmoothVarnish : public BSDF { +class SmoothCoating : public BSDF { public: - SmoothVarnish(const Properties &props) + SmoothCoating(const Properties &props) : BSDF(props) { /* Specifies the internal index of refraction at the interface */ - m_intIOR = props.getFloat("intIOR", 1.5046f); + m_intIOR = lookupIOR(props, "intIOR", "bk7"); + /* Specifies the external index of refraction at the interface */ - m_extIOR = props.getFloat("extIOR", 1); + m_extIOR = lookupIOR(props, "extIOR", "air"); + /* Specifies the layer's thickness using the inverse units of sigmaT */ m_thickness = props.getFloat("thickness", 1); + /* Specifies the attenuation within the varnish layer */ m_sigmaT = new ConstantSpectrumTexture( props.getSpectrum("sigmaT", Spectrum(0.0f))); } - SmoothVarnish(Stream *stream, InstanceManager *manager) + SmoothCoating(Stream *stream, InstanceManager *manager) : BSDF(stream, manager) { m_intIOR = stream->readFloat(); m_extIOR = stream->readFloat(); @@ -59,32 +63,22 @@ public: configure(); } - virtual ~SmoothVarnish() { - delete[] m_type; - } - void configure() { if (!m_nested) Log(EError, "A child BSDF instance is required"); if (m_nested->getType() & BSDF::ETransmission) - Log(EError, "Tried to put a smooth varnish layer on top of a BSDF " + Log(EError, "Tried to put a smooth coating layer on top of a BSDF " "with a transmission component -- this is currently not allowed!"); - if (m_nested->getType() & BSDF::EDelta) - Log(EError, "Tried to put a smooth varnish layer on top of a material with a " - "Dirac delta distribution -- this is currently not allowed!"); - if (m_type) - delete[] m_type; - m_componentCount = 1 + m_nested->getComponentCount(); - m_type = new unsigned int[m_componentCount]; - m_type[0] = EDeltaReflection | EFrontSide; - m_combinedType = m_type[0]; - for (int i=0; igetComponentCount(); ++i) { - m_type[i+1] = m_nested->getType(i); - m_combinedType |= m_type[i+1]; - } + m_components.clear(); + for (int i=0; igetComponentCount(); ++i) + m_components.push_back(m_nested->getType(i)); + m_components.push_back(EDeltaReflection | EFrontSide); + m_usesRayDifferentials = m_nested->usesRayDifferentials() || m_sigmaT->usesRayDifferentials(); + + BSDF::configure(); } void serialize(Stream *stream, InstanceManager *manager) const { @@ -121,8 +115,8 @@ public: return Vector(-eta*wi.x, -eta*wi.y, cosThetaT); } - /// Fully complete local coordinate refraction routine - inline Vector refract(const Vector &wi, Float &Fr) const { + /// Refraction in local coordinates (full version) + inline Vector refract(const Vector &wi, Float &F) const { Float cosThetaI = Frame::cosTheta(wi), etaI = m_extIOR, etaT = m_intIOR; @@ -141,72 +135,138 @@ public: Float cosThetaT = 0; if (sinThetaTSqr >= 1.0f) { /* Total internal reflection */ - Fr = 1.0f; + F = 1.0f; + return Vector(0.0f); } else { cosThetaT = std::sqrt(1.0f - sinThetaTSqr); - /* Compute the Fresnel refletance */ - Fr = fresnelDielectric(std::abs(cosThetaI), - cosThetaT, etaI, etaT); + /* Compute the Fresnel transmittance */ + F = fresnelDielectric(std::abs(Frame::cosTheta(wi)), + cosThetaT, m_extIOR, m_intIOR); - if (entering) - cosThetaT = -cosThetaT; - return Vector(-eta*wi.x, -eta*wi.y, cosThetaT); + return Vector(-eta*wi.x, -eta*wi.y, + entering ? -cosThetaT : cosThetaT); + } + } + + Spectrum eval(const BSDFQueryRecord &bRec, EMeasure measure) const { + if (Frame::cosTheta(bRec.wi) <= 0 || + Frame::cosTheta(bRec.wo) <= 0) + return Spectrum(0.0f); + + bool sampleSpecular = (bRec.typeMask & EDeltaReflection) + && (bRec.component == -1 || bRec.component == (int) m_components.size()-1); + bool sampleNested = (bRec.typeMask & m_nested->getType() & BSDF::EAll) + && (bRec.component == -1 || bRec.component < (int) m_components.size()-1); + + if (measure == EDiscrete && sampleSpecular && + std::abs(1-dot(reflect(bRec.wi), bRec.wo)) < Epsilon) { + return Spectrum(fresnel( + Frame::cosTheta(bRec.wi), m_extIOR, m_intIOR)); + } else if (sampleNested) { + Float R12, R21; + BSDFQueryRecord bRec2(bRec); + bRec2.wi = -refract(bRec.wi, R12); + bRec2.wo = -refract(bRec.wo, R21); + Assert(bRec2.wi.z >= 0); + Assert(bRec2.wo.z >= 0); + + if (R12 == 1 || R21 == 1) /* Total internal reflection */ + return Spectrum(0.0f); + + Spectrum result = m_nested->eval(bRec2, measure) + * ((1-R12) * (1-R21)); + + Spectrum sigmaT = m_sigmaT->getValue(bRec.its) * m_thickness; + if (!sigmaT.isZero()) + result *= (-sigmaT * + (1/std::abs(Frame::cosTheta(bRec2.wi)) + + 1/std::abs(Frame::cosTheta(bRec2.wo)))).exp(); + + if (measure == ESolidAngle) + result *= Frame::cosTheta(bRec2.wo); + + return result; + } + + return Spectrum(0.0f); + } + + Float pdf(const BSDFQueryRecord &bRec, EMeasure measure) const { + if (Frame::cosTheta(bRec.wi) <= 0 || + Frame::cosTheta(bRec.wo) <= 0) + return 0.0f; + + bool sampleSpecular = (bRec.typeMask & EDeltaReflection) + && (bRec.component == -1 || bRec.component == (int) m_components.size()-1); + bool sampleNested = (bRec.typeMask & m_nested->getType() & BSDF::EAll) + && (bRec.component == -1 || bRec.component < (int) m_components.size()-1); + + if (measure == EDiscrete && sampleSpecular && + std::abs(1-dot(reflect(bRec.wi), bRec.wo)) < Epsilon) { + return sampleNested ? fresnel( + Frame::cosTheta(bRec.wi), m_extIOR, m_intIOR) : 1.0f; + } else if (sampleNested) { + Float R12, R21; + BSDFQueryRecord bRec2(bRec); + bRec2.wi = -refract(bRec.wi, R12); + bRec2.wo = -refract(bRec.wo, R21); + + if (R12 == 1 || R21 == 1) /* Total internal reflection */ + return 0.0f; + + Float pdf = m_nested->pdf(bRec2, measure); + if (measure == ESolidAngle) { + Float eta = m_extIOR / m_intIOR; + pdf /= eta * eta; + } + + return sampleSpecular ? (pdf * (1-R12)) : pdf; + } else { + return 0.0f; } } Spectrum sample(BSDFQueryRecord &bRec, Float &pdf, const Point2 &_sample) const { - bool sampleReflection = (bRec.typeMask & EDeltaReflection) - && (bRec.component == -1 || bRec.component == 0); + bool sampleSpecular = (bRec.typeMask & EDeltaReflection) + && (bRec.component == -1 || bRec.component == (int) m_components.size()-1); bool sampleNested = (bRec.typeMask & m_nested->getType() & BSDF::EAll) - && (bRec.component == -1 || (bRec.component > 0 - && bRec.component < m_nested->getComponentCount() + 1)); + && (bRec.component == -1 || bRec.component < (int) m_components.size()-1); - if ((!sampleNested && !sampleReflection) || Frame::cosTheta(bRec.wi) < 0) + if ((!sampleNested && !sampleNested) || Frame::cosTheta(bRec.wi) < 0) return Spectrum(0.0f); - Float cosThetaI = Frame::cosTheta(bRec.wi), - etaI = m_extIOR, - etaT = m_intIOR; + /* Refract the incident direction and compute the Fresnel reflectance */ + Float eta = m_extIOR / m_intIOR, + sinThetaTSqr = eta*eta * Frame::sinTheta2(bRec.wi), + R12, cosThetaT = 0; - /* Using Snell's law, calculate the squared sine of the - angle between the normal and the transmitted ray */ - Float eta = etaI / etaT, - sinThetaTSqr = eta*eta * Frame::sinTheta2(bRec.wi); - - Float Fr, FrOut, cosThetaT = 0; if (sinThetaTSqr >= 1.0f) { - /* Total internal reflection */ - Fr = 1.0f; + R12 = 1.0f; /* Total internal reflection */ } else { - cosThetaT = std::sqrt(1.0f - sinThetaTSqr); - - /* Compute the Fresnel refletance */ - Fr = fresnelDielectric(cosThetaI, - cosThetaT, etaI, etaT); - - cosThetaT = -cosThetaT; + cosThetaT = -std::sqrt(1.0f - sinThetaTSqr); + R12 = fresnelDielectric(Frame::cosTheta(bRec.wi), + -cosThetaT, m_extIOR, m_intIOR); } Point2 sample(_sample); - if (sampleNested && sampleReflection) { - if (sample.x <= Fr) { - bRec.sampledComponent = 0; + if (sampleNested && sampleNested) { + if (sample.x <= R12) { + bRec.sampledComponent = m_components.size()-1; bRec.sampledType = EDeltaReflection; bRec.wo = reflect(bRec.wi); - - pdf = Fr * std::abs(Frame::cosTheta(bRec.wo)); - return Spectrum(Fr); + pdf = R12; + return Spectrum(R12); } else { Vector wiBackup = bRec.wi; - bRec.wi = -refract(bRec.wi, eta, cosThetaT); - sample.x = (sample.x - Fr) / (1 - Fr); + // bRec.wi = -refract(bRec.wi, eta, cosThetaT); + bRec.wi = -refract(bRec.wi, R12); + sample.x = (sample.x - R12) / (1 - R12); Spectrum result = m_nested->sample(bRec, pdf, sample); if (result.isZero()) return Spectrum(0.0f); - bRec.sampledComponent++; Spectrum sigmaT = m_sigmaT->getValue(bRec.its) * m_thickness; if (!sigmaT.isZero()) @@ -214,148 +274,47 @@ public: (1/std::abs(Frame::cosTheta(bRec.wi)) + 1/std::abs(Frame::cosTheta(bRec.wo)))).exp(); - Float cosThetaWoPrime = Frame::cosTheta(bRec.wo); + Float R21, cosThetaWoPrime = Frame::cosTheta(bRec.wo); bRec.wi = wiBackup; - bRec.wo = refract(-bRec.wo, FrOut); - - if (FrOut == 1) + bRec.wo = refract(-bRec.wo, R21); + + if (R21 == 1.0f) /* Total internal reflection */ return Spectrum(0.0f); - pdf *= (1 - Fr) * eta * eta; + pdf *= 1 - R12; + if (BSDF::getMeasure(bRec.sampledType) == ESolidAngle) + pdf /= eta * eta; + + result *= (1 - R12) * (1 - R21) * cosThetaWoPrime; - result *= - (1 - Fr) * (1 - FrOut) - * std::abs(cosThetaWoPrime * - / Frame::cosTheta(bRec.wo)); return result; - } - } else if (sampleReflection) { + } else if (sampleSpecular) { bRec.sampledComponent = 0; bRec.sampledType = EDeltaReflection; bRec.wo = reflect(bRec.wi); - pdf = std::abs(Frame::cosTheta(bRec.wo)); - return Spectrum(Fr); + pdf = 1.0f; + return Spectrum(R12); } else { - if (Fr == 1.0f) /* Total internal reflection */ - return Spectrum(0.0f); - - Vector wiBackup = bRec.wi; - bRec.wi = -refract(bRec.wi, eta, cosThetaT); - sample.x = (sample.x - Fr) / (1 - Fr); - - Spectrum result = m_nested->sample(bRec, pdf, sample); - if (result.isZero()) - return Spectrum(0.0f); - bRec.sampledComponent++; - - Spectrum sigmaT = m_sigmaT->getValue(bRec.its) * m_thickness; - if (!sigmaT.isZero()) - result *= (-sigmaT * - (1/std::abs(Frame::cosTheta(bRec.wi)) + - 1/std::abs(Frame::cosTheta(bRec.wo)))).exp(); - - Float cosThetaWoPrime = Frame::cosTheta(bRec.wo); - bRec.wi = wiBackup; - bRec.wo = refract(-bRec.wo, FrOut); - - if (FrOut == 1) - return Spectrum(0.0f); - - pdf *= (1 - Fr) * eta * eta; - - result *= - (1 - Fr) * (1 - FrOut) - * std::abs(cosThetaWoPrime * - / Frame::cosTheta(bRec.wo)); - - return result; + // XXX not implemented + return Spectrum(0.0f); } } - Float pdfDelta(const BSDFQueryRecord &bRec) const { - bool sampleSpecular = (bRec.typeMask & EDeltaReflection) - && (bRec.component == -1 || bRec.component == 0); + Spectrum sample(BSDFQueryRecord &bRec, const Point2 &sample) const { + Float pdf; + Spectrum result = SmoothCoating::sample(bRec, pdf, sample); - if (Frame::cosTheta(bRec.wi) <= 0 || - Frame::cosTheta(bRec.wo) <= 0 || !sampleSpecular) - return 0.0f; - - bool sampleNested = (bRec.typeMask & m_nested->getType() & BSDF::EAll) - && (bRec.component == -1 || (bRec.component > 0 - && bRec.component < m_nested->getComponentCount() + 1)); - - Float pdf = std::abs(Frame::cosTheta(bRec.wo)); - if (sampleNested) - pdf *= fresnel(Frame::cosTheta(bRec.wi), m_extIOR, m_intIOR); - - return pdf; - } - - Spectrum fDelta(const BSDFQueryRecord &bRec) const { - bool sampleSpecular = (bRec.typeMask & EDeltaReflection) - && (bRec.component == -1 || bRec.component == 0); - - if (Frame::cosTheta(bRec.wi) <= 0 || - Frame::cosTheta(bRec.wo) <= 0 || !sampleSpecular) + if (result.isZero()) return Spectrum(0.0f); - - return Spectrum(fresnel(Frame::cosTheta(bRec.wi), m_extIOR, m_intIOR)); - } - - Float pdf(const BSDFQueryRecord &bRec) const { - bool sampleNested = (bRec.typeMask & m_nested->getType() & BSDF::EAll) - && (bRec.component == -1 || (bRec.component > 0 - && bRec.component < m_nested->getComponentCount() + 1)); - - if (Frame::cosTheta(bRec.wi) <= 0 || - Frame::cosTheta(bRec.wo) <= 0 || !sampleNested) - return 0.0f; - - Float T12, T21; - Vector wiPrime = -refract(bRec.wi, T12); - Vector woPrime = -refract(bRec.wo, T21); - - if (T12 == 1 || T21 == 1) /* Total internal reflection */ - return 0.0f; - - BSDFQueryRecord bRec2(bRec); - if (bRec2.component != -1) - bRec2.component++; - bRec2.wi = wiPrime; - bRec2.wo = woPrime; - - Float eta = m_extIOR / m_intIOR; - return m_nested->pdf(bRec2) * T12 * eta * eta; - } - - Spectrum f(const BSDFQueryRecord &bRec) const { - bool sampleNested = (bRec.typeMask & m_nested->getType() & BSDF::EAll) - && (bRec.component == -1 || (bRec.component > 0 - && bRec.component < m_nested->getComponentCount() + 1)); - - if (Frame::cosTheta(bRec.wi) <= 0 || - Frame::cosTheta(bRec.wo) <= 0 || !sampleNested) - return Spectrum(0.0f); - - Float T12, T21; - Vector wiPrime = -refract(bRec.wi, T12); - Vector woPrime = -refract(bRec.wo, T21); - - if (T12 == 1 || T21 == 1) /* Total internal reflection */ - return Spectrum(0.0f); - - BSDFQueryRecord bRec2(bRec); - if (bRec2.component != -1) - bRec2.component++; - bRec2.wi = wiPrime; - bRec2.wo = woPrime; - return m_nested->f(bRec2) * T12 * T21; + else + return result / pdf; } std::string toString() const { std::ostringstream oss; - oss << "SmoothVarnish[" << endl + oss << "SmoothCoating[" << endl + << " name = \"" << getName() << "\"," << endl << " intIOR = " << m_intIOR << "," << endl << " extIOR = " << m_extIOR << "," << endl << " sigmaT = " << indent(m_sigmaT->toString()) << "," << endl @@ -368,11 +327,11 @@ public: MTS_DECLARE_CLASS() private: Float m_intIOR, m_extIOR; - ref m_nested; ref m_sigmaT; + ref m_nested; Float m_thickness; }; -MTS_IMPLEMENT_CLASS_S(SmoothVarnish, false, BSDF) -MTS_EXPORT_PLUGIN(SmoothVarnish, "Smooth varnish layer"); +MTS_IMPLEMENT_CLASS_S(SmoothCoating, false, BSDF) +MTS_EXPORT_PLUGIN(SmoothCoating, "Smooth varnish layer"); MTS_NAMESPACE_END diff --git a/src/bsdfs/conductor.cpp b/src/bsdfs/conductor.cpp index 84d997bf..75247472 100644 --- a/src/bsdfs/conductor.cpp +++ b/src/bsdfs/conductor.cpp @@ -172,8 +172,6 @@ public: configure(); } - virtual ~SmoothConductor() { } - void configure() { /* Verify the input parameters and fix them if necessary */ m_specularReflectance = ensureEnergyConservation( diff --git a/src/bsdfs/dielectric.cpp b/src/bsdfs/dielectric.cpp index 937627ee..b49a55b9 100644 --- a/src/bsdfs/dielectric.cpp +++ b/src/bsdfs/dielectric.cpp @@ -159,8 +159,6 @@ public: m_specularTransmittance = static_cast(manager->getInstance(stream)); } - virtual ~SmoothDielectric() { } - void serialize(Stream *stream, InstanceManager *manager) const { BSDF::serialize(stream, manager); @@ -228,18 +226,15 @@ public: Float eta = etaI / etaT, sinThetaTSqr = eta*eta * Frame::sinTheta2(wi); - Float cosThetaT = 0; if (sinThetaTSqr >= 1.0f) { /* Total internal reflection */ return Vector(0.0f); } else { - cosThetaT = std::sqrt(1.0f - sinThetaTSqr); + Float cosThetaT = std::sqrt(1.0f - sinThetaTSqr); - if (entering) - cosThetaT = -cosThetaT; + return Vector(-eta*wi.x, -eta*wi.y, + entering ? -cosThetaT : cosThetaT); } - - return Vector(-eta*wi.x, -eta*wi.y, cosThetaT); } Spectrum eval(const BSDFQueryRecord &bRec, EMeasure measure) const { diff --git a/src/bsdfs/difftrans.cpp b/src/bsdfs/difftrans.cpp index a8761a12..96bc4722 100644 --- a/src/bsdfs/difftrans.cpp +++ b/src/bsdfs/difftrans.cpp @@ -50,24 +50,22 @@ public: m_transmittance = new ConstantSpectrumTexture(props.getSpectrum( props.hasProperty("transmittance") ? "transmittance" : "diffuseTransmittance", Spectrum(.5f))); - m_components.push_back(EDiffuseTransmission | EFrontSide | EBackSide); m_usesRayDifferentials = false; } DiffuseTransmitter(Stream *stream, InstanceManager *manager) : BSDF(stream, manager) { m_transmittance = static_cast(manager->getInstance(stream)); - m_components.push_back(EDiffuseTransmission | EFrontSide | EBackSide); m_usesRayDifferentials = m_transmittance->usesRayDifferentials(); } - virtual ~DiffuseTransmitter() { } - void configure() { - BSDF::configure(); - /* Verify the input parameters and fix them if necessary */ m_transmittance = ensureEnergyConservation(m_transmittance, "transmittance", 1.0f); + + m_components.clear(); + m_components.push_back(EDiffuseTransmission | EFrontSide | EBackSide); + BSDF::configure(); } Spectrum eval(const BSDFQueryRecord &bRec, EMeasure measure) const { diff --git a/src/bsdfs/diffuse.cpp b/src/bsdfs/diffuse.cpp index 7001bd8f..39c3ddf4 100644 --- a/src/bsdfs/diffuse.cpp +++ b/src/bsdfs/diffuse.cpp @@ -88,8 +88,6 @@ public: configure(); } - virtual ~SmoothDiffuse() { } - void configure() { /* Verify the input parameter and fix them if necessary */ m_reflectance = ensureEnergyConservation(m_reflectance, "reflectance", 1.0f); diff --git a/src/bsdfs/irawan.cpp b/src/bsdfs/irawan.cpp index 81e977d7..13154fb7 100644 --- a/src/bsdfs/irawan.cpp +++ b/src/bsdfs/irawan.cpp @@ -121,8 +121,6 @@ public: m_ksMultiplier = stream->readFloat(); } - virtual ~IrawanClothBRDF() { } - void configure() { m_components.clear(); m_components.push_back(EGlossyReflection | EAnisotropic | EFrontSide); diff --git a/src/bsdfs/mask.cpp b/src/bsdfs/mask.cpp index 8cb01788..af0cff2a 100644 --- a/src/bsdfs/mask.cpp +++ b/src/bsdfs/mask.cpp @@ -31,13 +31,14 @@ MTS_NAMESPACE_BEGIN * \rendering{Rendering without an opacity mask} * {bsdf_mask_before.jpg} * \rendering{Rendering \emph{with} an opacity mask (\lstref{mask-leaf})} - * {bsdf_mask_before.jpg} + * {bsdf_mask_after.jpg} * } * This plugin applies an opacity mask to add nested BSDF instance. It interpolates * between perfectly transparent and completely opaque based on the \code{opacity} * parameter. * * The transparency is implemented as a forward-facing Diract delta distribution. + * \vspace{5mm} * * \begin{xml}[caption=Material configuration for a transparent leaf, * label=lst:mask-leaf] @@ -72,8 +73,6 @@ public: configure(); } - virtual ~Mask() { } - void serialize(Stream *stream, InstanceManager *manager) const { BSDF::serialize(stream, manager); @@ -84,6 +83,7 @@ public: void configure() { if (!m_nestedBSDF) Log(EError, "A child BSDF is required"); + m_components.clear(); for (int i=0; igetComponentCount(); ++i) m_components.push_back(m_nestedBSDF->getType(i)); m_components.push_back(EDeltaTransmission | EFrontSide | EBackSide); diff --git a/src/bsdfs/phong.cpp b/src/bsdfs/phong.cpp index da54c168..97729071 100644 --- a/src/bsdfs/phong.cpp +++ b/src/bsdfs/phong.cpp @@ -51,8 +51,8 @@ MTS_NAMESPACE_BEGIN * * When using this plugin, note that the diffuse and specular reflectance * components should add up to a value less than or equal to one (for each - * color channel). Otherwise, they will be scaled appropriately to ensure - * energy conservation. + * color channel). Otherwise, they will automatically be scaled appropriately + * to ensure energy conservation. */ class Phong : public BSDF { public: @@ -75,8 +75,6 @@ public: configure(); } - virtual ~Phong() { } - void configure() { m_components.clear(); m_components.push_back(EGlossyReflection | EFrontSide); diff --git a/src/bsdfs/plastic.cpp b/src/bsdfs/plastic.cpp index 9501ef0f..ee1c2133 100644 --- a/src/bsdfs/plastic.cpp +++ b/src/bsdfs/plastic.cpp @@ -85,8 +85,6 @@ public: configure(); } - virtual ~SmoothPlastic() { } - void configure() { /* Verify the input parameters and fix them if necessary */ m_specularReflectance = ensureEnergyConservation( diff --git a/src/bsdfs/roughconductor.cpp b/src/bsdfs/roughconductor.cpp index 155182e1..74eb5f61 100644 --- a/src/bsdfs/roughconductor.cpp +++ b/src/bsdfs/roughconductor.cpp @@ -222,8 +222,6 @@ public: BSDF::configure(); } - virtual ~RoughConductor() { } - /// Helper function: reflect \c wi with respect to a given surface normal inline Vector reflect(const Vector &wi, const Normal &m) const { return 2 * dot(wi, m) * Vector(m) - wi; diff --git a/src/bsdfs/roughdielectric.cpp b/src/bsdfs/roughdielectric.cpp index 1e669e7d..156fac94 100644 --- a/src/bsdfs/roughdielectric.cpp +++ b/src/bsdfs/roughdielectric.cpp @@ -248,8 +248,6 @@ public: BSDF::configure(); } - virtual ~RoughDielectric() { } - inline Float signum(Float value) const { return (value < 0) ? -1.0f : 1.0f; } diff --git a/src/bsdfs/roughdiffuse.cpp b/src/bsdfs/roughdiffuse.cpp index 308d656a..c3e311ae 100644 --- a/src/bsdfs/roughdiffuse.cpp +++ b/src/bsdfs/roughdiffuse.cpp @@ -104,8 +104,6 @@ public: configure(); } - virtual ~RoughDiffuse() { } - void configure() { /* Verify the input parameter and fix them if necessary */ m_reflectance = ensureEnergyConservation(m_reflectance, "reflectance", 1.0f); diff --git a/src/bsdfs/roughplastic.cpp b/src/bsdfs/roughplastic.cpp index e8820b23..c107f6e5 100644 --- a/src/bsdfs/roughplastic.cpp +++ b/src/bsdfs/roughplastic.cpp @@ -202,8 +202,6 @@ public: BSDF::configure(); } - virtual ~RoughPlastic() { } - Spectrum getDiffuseReflectance(const Intersection &its) const { return m_diffuseReflectance->getValue(its); } diff --git a/src/bsdfs/twosided.cpp b/src/bsdfs/twosided.cpp index 0c78e416..b4a0903a 100644 --- a/src/bsdfs/twosided.cpp +++ b/src/bsdfs/twosided.cpp @@ -64,8 +64,6 @@ public: configure(); } - virtual ~TwoSidedBRDF() { } - void serialize(Stream *stream, InstanceManager *manager) const { BSDF::serialize(stream, manager); diff --git a/src/bsdfs/ward.cpp b/src/bsdfs/ward.cpp index d934f58e..471041c9 100644 --- a/src/bsdfs/ward.cpp +++ b/src/bsdfs/ward.cpp @@ -58,7 +58,7 @@ MTS_NAMESPACE_BEGIN * \begin{enumerate}[(i)] * \item ``Measuring and Modeling Anisotropic Reflection'' * by Greg Ward \cite{Ward1992Measuring} - * \item ``Notes on the Ward BRDF'' by Bruce Walter\cite{Walter2005Notes} + * \item ``Notes on the Ward BRDF'' by Bruce Walter \cite{Walter2005Notes} * \item ``An Improved Normalization for the Ward Reflectance Model'' * by Arne D\"ur \cite{Dur2006Improved} * \item ``A New Ward BRDF Model with Bounded Albedo'' by @@ -78,8 +78,8 @@ MTS_NAMESPACE_BEGIN * * When using this plugin, note that the diffuse and specular reflectance * components should add up to a value less than or equal to one (for each - * color channel). Otherwise, they will be scaled appropriately to ensure - * energy conservation. + * color channel). Otherwise, they will automatically be scaled appropriately + * to ensure energy conservation. */ class Ward : public BSDF { public: @@ -134,8 +134,6 @@ public: configure(); } - virtual ~Ward() { } - void configure() { unsigned int extraFlags = 0; if (m_alphaU != m_alphaV) diff --git a/src/libcore/util.cpp b/src/libcore/util.cpp index 36b3e521..b5fc0f32 100644 --- a/src/libcore/util.cpp +++ b/src/libcore/util.cpp @@ -849,11 +849,11 @@ double normalQuantile(double p) { Float hypot2(Float a, Float b) { Float r; if (std::abs(a) > std::abs(b)) { - r = b/a; - r = std::abs(a)*std::sqrt(1+r*r); + r = b / a; + r = std::abs(a) * std::sqrt(1 + r*r); } else if (b != 0) { - r = a/b; - r = std::abs(b)*std::sqrt(1+r*r); + r = a / b; + r = std::abs(b) * std::sqrt(1 + r*r); } else { r = 0; }