diff options
Diffstat (limited to 'hw5/src/texture_base.cpp')
-rw-r--r-- | hw5/src/texture_base.cpp | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/hw5/src/texture_base.cpp b/hw5/src/texture_base.cpp new file mode 100644 index 0000000..39a2a63 --- /dev/null +++ b/hw5/src/texture_base.cpp @@ -0,0 +1,133 @@ +/******************************************************************/ +/* 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 "texture_base.h" + + +////////////////// +// Constructors // +////////////////// +texture_base::texture_base(bool repeat) + : image() +{ + _repeat = repeat; +} + +texture_base::texture_base(const texture_base& src) + : image(src) +{ + _repeat = src._repeat; +} + + +/////////////// +// Operators // +/////////////// +texture_base& texture_base::operator=(const texture_base& src) +{ + _assign(src); + return *this; +} + + +///////////////////// +// Private Methods // +///////////////////// +void texture_base::_assign(const texture_base& src) +{ + image::_assign(src); + _repeat = src._repeat; +} + + +color& texture_base::_at(signed int x, signed int y) +{ + // HW5: Implement this. Retrieve the texel at coordinate + // (x,y) (in texel coordinates, not texture coordinates!) + // taking in account the boundary conditions: + // if _repeat == true, then the texel coordinates outside + // the images are mapped to the nearest edge. E.g., for a + // 10x10 image, a coordinate of (1,1) returns the + // texel at (1,1), at (12,1) -> (9,1), at + // (13,14) -> (9,9), (5,12) -> (5,9), and (-4,1)->(0,1). + // If _repeat is false then the coordinates wrap around: + // (1,1) -> (1,1), (12,1) -> (2,1), and (13,14) -> (3,4). + // Modifies: nothing + // Returns: a reference to the color the image. + signed int xRef, yRef; + + if (_repeat) { + + if (x < 0) { + xRef = 0; + } + else if (x >= 0 && x < image::width()) { + xRef = x; + } + else { // x >= image::width() + xRef = image::width() - 1; + } + + if (y < 0) { + yRef = 0; + } + else if (y >= 0 && y < image::height()) { + yRef = y; + } + else { // y >= image::width() + yRef = image::height() - 1; + } + + } + else { // !_repeat + xRef = x % image::width(); + yRef = y % image::height(); + } + + image::reference texel = image::operator()(xRef, yRef); + return texel; +} + + +const color& texture_base::_at(signed int x, signed int y) const +{ + // HW5: Same as above, except that it returns a const color reference. + // Normally just copying the code from above should work. + signed int xRef, yRef; + + if (_repeat) { + + if (x < 0) { + xRef = 0; + } + else if (x >= 0 && x < image::width()) { + xRef = x; + } + else { // x >= image::width() + xRef = image::width() - 1; + } + + if (y < 0) { + yRef = 0; + } + else if (y >= 0 && y < image::height()) { + yRef = y; + } + else { // y >= image::width() + yRef = image::height() - 1; + } + + } + else { // !_repeat + xRef = x % image::width(); + yRef = y % image::height(); + } + + image::const_reference texel = image::operator()(xRef, yRef); + return texel; +} |