/******************************************************************/ /* 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() << ")"; }