/******************************************************************/ /* 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 "reflectanceShader_base.h" #include "coordinateTransform.h" ///////////// // Methods // ///////////// color reflectanceShader_base::shade(const intersectionPoint& ip, const vec3d& light_dir) const { // create shading frame (note: in and out point away!) coordinateTransformation ct = ip.shadingFrame(); vec3d local_out = ct.inverseTransformDirection(-ip.direction()); vec3d local_in = ct.inverseTransformDirection(light_dir); // get brdf std::unique_ptr brdf = make_brdf(ip.textureCoordinate()); // eval return brdf->shade(local_in, local_out); } color reflectanceShader_base::reflectance(const intersectionPoint& ip, const vec3d& light_dir) const { // create shading frame (note: in and out point away!) coordinateTransformation ct = ip.shadingFrame(); vec3d local_out = ct.inverseTransformDirection(-ip.direction()); vec3d local_in = ct.inverseTransformDirection(light_dir); // get brdf std::unique_ptr brdf = make_brdf(ip.textureCoordinate()); // eval return brdf->reflectance(local_in, local_out); } brdfSample reflectanceShader_base::sample(const intersectionPoint& ip, float r1, float r2) const { // create shading frame (note: in and out point away!) coordinateTransformation ct = ip.shadingFrame(); vec3d local_out = ct.inverseTransformDirection(-ip.direction()); // get brdf std::unique_ptr brdf = make_brdf(ip.textureCoordinate()); // sample (local shading frame) brdfSample sample = brdf->sample(local_out, r1, r2); // transform back to global shading frame return sample.transform(ct); } float reflectanceShader_base::reflectivity(const intersectionPoint& ip) const { // get brdf std::unique_ptr brdf = make_brdf(ip.textureCoordinate()); // get reflectivity return brdf->reflectivity(); } shaderProperties reflectanceShader_base::properties(const intersectionPoint& ip) const { // get brdf std::unique_ptr brdf = make_brdf(ip.textureCoordinate()); // get properties return shaderProperties(brdf->isDiffuse(), brdf->isSpecular()); } color reflectanceShader_base::emittance(const intersectionPoint& ip) const { return color(); }