summaryrefslogtreecommitdiff
path: root/hw5/src/texture_base.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'hw5/src/texture_base.cpp')
-rw-r--r--hw5/src/texture_base.cpp133
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;
+}