summaryrefslogtreecommitdiff
path: root/hw6/src/bilinearTexture.cpp
diff options
context:
space:
mode:
author53hornet <53hornet@gmail.com>2019-02-02 23:33:15 -0500
committer53hornet <53hornet@gmail.com>2019-02-02 23:33:15 -0500
commitdb072ad4dc181eca5a1458656b130beb43f475bf (patch)
treea3c03c7f5497cb70503e2486662fa85cfb53415a /hw6/src/bilinearTexture.cpp
downloadcsci427-master.tar.xz
csci427-master.zip
Diffstat (limited to 'hw6/src/bilinearTexture.cpp')
-rw-r--r--hw6/src/bilinearTexture.cpp69
1 files changed, 69 insertions, 0 deletions
diff --git a/hw6/src/bilinearTexture.cpp b/hw6/src/bilinearTexture.cpp
new file mode 100644
index 0000000..f9697bf
--- /dev/null
+++ b/hw6/src/bilinearTexture.cpp
@@ -0,0 +1,69 @@
+/******************************************************************/
+/* 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 "bilinearTexture.h"
+
+
+//////////////////
+// Constructors //
+//////////////////
+bilinearTexture::bilinearTexture(bool repeat)
+ : texture_base(repeat)
+{
+ // Do nothing.
+}
+
+
+bilinearTexture::bilinearTexture(const bilinearTexture& src)
+ : texture_base(src)
+{
+ // Do nothing
+}
+
+
+///////////////
+// Operators //
+///////////////
+bilinearTexture& bilinearTexture::operator=(const bilinearTexture& src)
+{
+ _assign(src);
+ return *this;
+}
+
+
+image::value_type bilinearTexture::operator()(const vec2d& textureCoord) const
+{
+ float scaled_u = textureCoord.u*(width()-1);
+ float scaled_v = textureCoord.v*(height()-1);
+
+ // compute corners
+ signed int left = floor(scaled_u);
+ signed int right = ceil(scaled_u);
+ signed int top = floor(scaled_v);
+ signed int bottom = ceil(scaled_v);
+
+ // compute weights
+ float hw = fabs(right - scaled_u);
+ float vw = fabs(bottom - scaled_v);
+
+ // compute horizontal interpolated colors
+ color topColor = hw * _at(left, top) + (1.0f - hw) * _at(right, top);
+ color bottomColor = hw * _at(left, bottom) + (1.0f - hw) * _at(right, bottom);
+
+ // interpolate vertically
+ return vw * topColor + (1.0f - vw) * bottomColor;
+}
+
+
+/////////////////////
+// Private Methods //
+/////////////////////
+void bilinearTexture::_print(std::ostream& s) const
+{
+ s << "Bilinear texture (" << this->width() << "x" << this->height() << ")";
+}