summaryrefslogtreecommitdiff
path: root/hw5/src/phongBrdf.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'hw5/src/phongBrdf.cpp')
-rw-r--r--hw5/src/phongBrdf.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/hw5/src/phongBrdf.cpp b/hw5/src/phongBrdf.cpp
new file mode 100644
index 0000000..a4d29bd
--- /dev/null
+++ b/hw5/src/phongBrdf.cpp
@@ -0,0 +1,90 @@
+/******************************************************************/
+/* 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 <cmath>
+#include "constants.h"
+#include "phongBrdf.h"
+
+//////////////////
+// Constructors //
+//////////////////
+phongBrdf::phongBrdf(const color& albedo, float sharpness)
+{
+ _albedo = albedo;
+ _sharpness = sharpness;
+}
+
+
+phongBrdf::phongBrdf(const phongBrdf& src)
+{
+ _albedo = src._albedo;
+ _sharpness = src._sharpness;
+}
+
+
+///////////////
+// Operators //
+///////////////
+phongBrdf& phongBrdf::operator=(const phongBrdf& src)
+{
+ _assign(src);
+ return *this;
+}
+
+
+/////////////
+// Methods //
+/////////////
+color phongBrdf::shade(const vec3d& in, const vec3d& out) const
+{
+ // sanity check (below horizon)
+ if(in.z < 0.0f || out.z < 0.0f) return color(0.0f);
+
+ // compute reflected direction (simplies when n=(0,0,1))
+ vec3d reflected(-in.x, -in.y, in.z);
+
+ // evaluate phong
+ return _albedo * std::pow(std::max( reflected.dot(out), 0.0f), _sharpness);
+}
+
+
+bool phongBrdf::isSpecular(void) const
+{
+ // Consider low roughness to be diffuse.
+ // Use 5.0f as an arbitrary threshold.
+ return (_sharpness > 5.0f);
+}
+
+
+bool phongBrdf::isDiffuse(void) const
+{
+ return !isSpecular();
+}
+
+
+/////////////////////
+// Private Methods //
+/////////////////////
+void phongBrdf::_assign(const phongBrdf& src)
+{
+ _albedo = src._albedo;
+ _sharpness = src._sharpness;
+}
+
+
+void phongBrdf::_swap(phongBrdf& src)
+{
+ swap(_albedo, src._albedo);
+ std::swap(_sharpness, src._sharpness);
+}
+
+
+void phongBrdf::_print(std::ostream& s) const
+{
+ s << "Phong BRDF: albedo=" << _albedo << ", sharpness=" << _sharpness;
+}