summaryrefslogtreecommitdiff
path: root/hw6/src/shadingFrameTransformation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'hw6/src/shadingFrameTransformation.cpp')
-rw-r--r--hw6/src/shadingFrameTransformation.cpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/hw6/src/shadingFrameTransformation.cpp b/hw6/src/shadingFrameTransformation.cpp
new file mode 100644
index 0000000..8dfb589
--- /dev/null
+++ b/hw6/src/shadingFrameTransformation.cpp
@@ -0,0 +1,82 @@
+/******************************************************************/
+/* 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 "shadingFrameTransformation.h"
+
+
+//////////////////
+// Constructors //
+//////////////////
+shadingFrameTransformation::shadingFrameTransformation(const std::shared_ptr<const shader_base>& shader)
+ : shader_base()
+{
+ _shader = shader;
+}
+
+
+/////////////
+// Methods //
+/////////////
+color shadingFrameTransformation::shade(const intersectionPoint& ip, const vec3d& light_dir) const
+{
+ // transform to local shading frame
+ intersectionPoint localIp(ip);
+ localIp.inverseTransformShadingFrame( _transformation(ip.textureCoordinate()) );
+
+ // Done.
+ return _shader->shade(localIp, light_dir);
+}
+
+
+color shadingFrameTransformation::reflectance(const intersectionPoint& ip, const vec3d& light_dir) const
+{
+ // transform to local shading frame
+ intersectionPoint localIp(ip);
+ localIp.inverseTransformShadingFrame( _transformation(ip.textureCoordinate()) );
+
+ // Done.
+ return _shader->reflectance(localIp, light_dir);
+}
+
+
+brdfSample shadingFrameTransformation::sample(const intersectionPoint& ip, float r1, float r2) const
+{
+ // transform to local shading frame
+ intersectionPoint localIp(ip);
+ transformation3d ct = _transformation(ip.textureCoordinate());
+ localIp.inverseTransformShadingFrame(ct);
+
+ //get sample (in local shading frame)
+ brdfSample sample = _shader->sample(localIp, r1, r2);
+
+ // transform to global shading frame
+ return sample.transform(ct);
+}
+
+
+float shadingFrameTransformation::reflectivity(const intersectionPoint& ip) const
+{
+ return _shader->reflectivity(ip);
+}
+
+
+color shadingFrameTransformation::emittance(const intersectionPoint& ip) const
+{
+ // transform to local shading frame
+ intersectionPoint localIp(ip);
+ localIp.inverseTransformShadingFrame( _transformation(ip.textureCoordinate()) );
+
+ // Done.
+ return _shader->emittance(localIp);
+}
+
+
+shaderProperties shadingFrameTransformation::properties(const intersectionPoint& ip) const
+{
+ return _shader->properties(ip);
+}