/******************************************************************/ /* This file is part of the homework assignments for CSCI-427/527 */ /* at The College of William & Mary and authored by Pieter Peers. */ /* No part of this file, whether altered or in original form, can */ /* be distributed or used outside the context of CSCI-427/527 */ /* without consent of either the College of William & Mary or */ /* Pieter Peers. */ /******************************************************************/ #include #include "constants.h" #include "diffuseBrdf.h" ////////////////// // Constructors // ////////////////// diffuseBrdf::diffuseBrdf(const color& albedo) { _albedo = albedo; } diffuseBrdf::diffuseBrdf(const diffuseBrdf& src) { _albedo = src._albedo; } /////////////// // Operators // /////////////// diffuseBrdf& diffuseBrdf::operator=(const diffuseBrdf& src) { _assign(src); return *this; } ///////////// // Methods // ///////////// color diffuseBrdf::shade(const vec3d& in, const vec3d& out) const { if(in.z < 0.0f || out.z < 0.0f) return color(); else return _albedo * in.z; } color diffuseBrdf::reflectance(const vec3d& in, const vec3d& out) const { if(in.z < 0.0f || out.z < 0.0f) return color(0.0f); return _albedo / PI; } brdfSample diffuseBrdf::sample(const vec3d& in, float r1, float r2) const { // check if below surface. if(in.z < EPSILON) return brdfSample(); // sample hemisphere proportional to the cosine vec3d out( cos(2.0f * PI * r1) * sqrt(std::max(1.0f - r2, 0.0f)), sin(2.0f * PI * r1) * sqrt(std::max(1.0f - r2, 0.0f)), sqrt(r2) ); // set pdf float pdf = out.z / PI; // Done. return brdfSample(out, out.z / PI, // PDF proportional to cosine _albedo / PI // reflectance ); } bool diffuseBrdf::isSpecular(void) const { return false; } bool diffuseBrdf::isDiffuse(void) const { return true; } float diffuseBrdf::reflectivity(void) const { return (_albedo.r + _albedo.g + _albedo.b) / 3.0f; } ///////////////////// // Private Methods // ///////////////////// void diffuseBrdf::_assign(const diffuseBrdf& src) { _albedo = src._albedo; } void diffuseBrdf::_swap(diffuseBrdf& src) { swap(_albedo, src._albedo); } void diffuseBrdf::_print(std::ostream& s) const { s << "Diffuse BRDF: albedo=" << _albedo; }