diff --git a/src/bsdfs/transparent.cpp b/src/bsdfs/transparent.cpp new file mode 100644 index 00000000..b053b6ce --- /dev/null +++ b/src/bsdfs/transparent.cpp @@ -0,0 +1,87 @@ +#include + +MTS_NAMESPACE_BEGIN + +/** + * Ideal transparent BRDF + */ +class Transparent : public BSDF { +public: + Transparent(const Properties &props) + : BSDF(props) { + m_transmission = props.getSpectrum("transmission", Spectrum(0.8f)); + m_componentCount = 1; + m_type = new unsigned int[m_componentCount]; + m_type[0] = EDeltaTransmission; + m_combinedType = m_type[0]; + m_usesRayDifferentials = false; + } + + Transparent(Stream *stream, InstanceManager *manager) + : BSDF(stream, manager) { + m_transmission = Spectrum(stream); + m_componentCount = 1; + m_type = new unsigned int[m_componentCount]; + m_type[0] = EDeltaTransmission; + m_combinedType = m_type[0]; + m_usesRayDifferentials = false; + } + + virtual ~Transparent() { + delete[] m_type; + } + + void serialize(Stream *stream, InstanceManager *manager) const { + BSDF::serialize(stream, manager); + + m_transmission.serialize(stream); + } + + Spectrum getDiffuseReflectance(const Intersection &its) const { + return Spectrum(0.0f); + } + + Spectrum f(const BSDFQueryRecord &bRec) const { + return Spectrum(0.0f); + } + + Float pdf(const BSDFQueryRecord &bRec) const { + return 0.0f; + } + + inline void transmit(const Vector &wi, Vector &wo) const { + wo = Vector(wi.x, wi.y, -wi.z); + } + + inline Spectrum sample(BSDFQueryRecord &bRec) const { + Float pdf; + return Transparent::sample(bRec, pdf); + } + + Spectrum sample(BSDFQueryRecord &bRec, Float &pdf) const { + if (!(bRec.typeMask & m_combinedType)) + return Spectrum(0.0f); + transmit(bRec.wi, bRec.wo); + bRec.sampledComponent = 0; + bRec.sampledType = EDeltaTransmission; + pdf = std::abs(Frame::cosTheta(bRec.wo)); + return m_transmission; + } + + Float pdfDelta(const BSDFQueryRecord &bRec) const { + return std::abs(Frame::cosTheta(bRec.wo)); + } + + Spectrum fDelta(const BSDFQueryRecord &bRec) const { + return m_transmission; + } + + MTS_DECLARE_CLASS() +protected: + Spectrum m_transmission; +}; + + +MTS_IMPLEMENT_CLASS_S(Transparent, false, BSDF) +MTS_EXPORT_PLUGIN(Transparent, "Transparent BRDF"); +MTS_NAMESPACE_END