diff options
Diffstat (limited to 'hw6/src/bilinearTexture.cpp')
-rw-r--r-- | hw6/src/bilinearTexture.cpp | 69 |
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() << ")"; +} |