summaryrefslogtreecommitdiff
path: root/hw2/include
diff options
context:
space:
mode:
Diffstat (limited to 'hw2/include')
-rw-r--r--hw2/include/boundingBox.h77
-rw-r--r--hw2/include/camera.h80
-rw-r--r--hw2/include/color.h105
-rw-r--r--hw2/include/constants.h15
-rw-r--r--hw2/include/errorMessage.h17
-rw-r--r--hw2/include/image.h89
-rw-r--r--hw2/include/imageIO.h19
-rw-r--r--hw2/include/imageIO.pfm.h18
-rw-r--r--hw2/include/imageIO.ppm.h18
-rw-r--r--hw2/include/interval.h77
-rw-r--r--hw2/include/mat3d.h112
-rw-r--r--hw2/include/ray.h69
-rw-r--r--hw2/include/transformation3d.h77
-rw-r--r--hw2/include/triangle.h115
-rw-r--r--hw2/include/util.h19
-rw-r--r--hw2/include/vec2d.h117
-rw-r--r--hw2/include/vec3d.h120
17 files changed, 1144 insertions, 0 deletions
diff --git a/hw2/include/boundingBox.h b/hw2/include/boundingBox.h
new file mode 100644
index 0000000..522672e
--- /dev/null
+++ b/hw2/include/boundingBox.h
@@ -0,0 +1,77 @@
+/******************************************************************/
+/* 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. */
+/******************************************************************/
+#ifndef _BOUNDINGBOX_H_
+#define _BOUNDINGBOX_H_
+
+#include <ostream>
+
+#include "ray.h"
+#include "vec3d.h"
+#include "transformation3d.h"
+
+class boundingBox {
+ public:
+ /////////////////
+ // Constructor //
+ /////////////////
+ boundingBox(void);
+ boundingBox(const vec3d& lfb, const vec3d& rbt);
+ boundingBox(const boundingBox& bb);
+
+ //////////////
+ // Operator //
+ //////////////
+ boundingBox& operator=(const boundingBox& src);
+
+ boundingBox& operator+=(const boundingBox& bb);
+ boundingBox& operator+=(const vec3d& point);
+
+ boundingBox operator+(const boundingBox& bb) const;
+
+ /////////////
+ // Methods //
+ /////////////
+ bool isHit(const ray& r) const;
+
+ vec3d center(void) const;
+ vec3d corner(bool left, bool front, bool bottom) const;
+
+ //////////////
+ // Mutators //
+ //////////////
+ boundingBox& transform(const transformation3d& t);
+ boundingBox& inverseTransform(const transformation3d& t);
+
+ /////////////
+ // Friends //
+ /////////////
+ friend void swap(boundingBox& a, boundingBox& b) { a._swap(b); }
+ friend boundingBox transform(const boundingBox& bb, const transformation3d& t) { return boundingBox(bb).transform(t); }
+ friend boundingBox inverseTransform(const boundingBox& bb, const transformation3d& t) { return boundingBox(bb).inverseTransform(t); }
+ friend std::ostream& operator<<(std::ostream& s, const boundingBox& bb)
+ {
+ s << bb._lfb << " - " << bb._rbt;
+ return s;
+ }
+
+ private:
+ /////////////////////
+ // Private Methods //
+ /////////////////////
+ void _swap(boundingBox& bb);
+ void _assign(const boundingBox& bb);
+
+ //////////////////
+ // Data Members //
+ //////////////////
+ vec3d _lfb, _rbt;
+};
+
+
+#endif /* _BOUNDINGBOX_H_ */
diff --git a/hw2/include/camera.h b/hw2/include/camera.h
new file mode 100644
index 0000000..9e3be04
--- /dev/null
+++ b/hw2/include/camera.h
@@ -0,0 +1,80 @@
+/******************************************************************/
+/* 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. */
+/******************************************************************/
+#ifndef _CAMERA_H_
+#define _CAMERA_H_
+
+#include <ostream>
+
+#include "ray.h"
+#include "vec2d.h"
+#include "boundingBox.h"
+
+/**************************************************************/
+/* Note: Field of View (fov) is expressed in degrees, and */
+/* represents the angular spread in the horizontal direction. */
+/**************************************************************/
+class camera {
+ public:
+ /////////////////
+ // Constructor //
+ /////////////////
+ camera(void);
+ camera(const vec3d& eye, const vec3d& viewDirection, const vec3d& up, float fov, size_t xres, size_t yres);
+ camera(const camera& cam);
+
+ ///////////////
+ // Operators //
+ ///////////////
+ camera& operator=(const camera& cam);
+
+ ray operator()(float x, float y) const;
+
+ ////////////////
+ // Inspectors //
+ ////////////////
+ size_t width(void) const { return _width; }
+ size_t height(void) const { return _height; }
+
+ //////////////
+ // Mutators //
+ //////////////
+ void frameBoundingBox(const boundingBox& bb);
+
+ /////////////
+ // Friends //
+ /////////////
+ friend void swap(camera& a, camera& b) { a._swap(b); }
+ friend std::ostream& operator<<(std::ostream& s, const camera& cam)
+ {
+ s << "Camera: {";
+ s << "eye=" << cam._eye << ", ";
+ s << "view=" << cam._view << ", ";
+ s << "up=" << cam._up << "}, ";
+ s << "fov=" << cam._fov << ", ";
+ s << "resolution=[" << cam._width << "x" << cam._height << "]";
+ return s;
+ }
+
+ private:
+ /////////////////////
+ // Private Methods //
+ /////////////////////
+ void _swap(camera& cam);
+ void _assign(const camera& cam);
+
+ //////////////////
+ // Data Members //
+ //////////////////
+ vec3d _eye, _view, _up;
+ float _fov;
+ size_t _width, _height;
+};
+
+#endif /* _CAMERA_H_ */
+
diff --git a/hw2/include/color.h b/hw2/include/color.h
new file mode 100644
index 0000000..b2ca490
--- /dev/null
+++ b/hw2/include/color.h
@@ -0,0 +1,105 @@
+/******************************************************************/
+/* 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. */
+/******************************************************************/
+#ifndef _COLOR_H_
+#define _COLOR_H_
+
+#include <ostream>
+
+class color {
+ public:
+ /////////////
+ // Typedef //
+ /////////////
+ typedef float value_type;
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
+ typedef value_type* iterator;
+ typedef const value_type* const_iterator;
+
+ //////////////////
+ // Data Members //
+ //////////////////
+ union {
+ struct { value_type r, g, b; };
+ struct { value_type red, green, blue; };
+ value_type data[3];
+ };
+
+ public:
+ /////////////////
+ // Constructor //
+ /////////////////
+ explicit color(const_reference value=0.0f);
+ color(const_reference r, const_reference g, const_reference b);
+ color(const color& col);
+
+ ////////////////
+ // Inspectors //
+ ////////////////
+ const_reference operator[](size_t index) const;
+ reference operator[](size_t index);
+
+ size_t size(void) const { return 3; }
+
+ iterator begin(void);
+ const_iterator begin(void) const;
+ iterator end(void);
+ const_iterator end(void) const;
+
+ ///////////////
+ // Operators //
+ ///////////////
+ color& operator=(const color& col);
+
+ bool operator==(const color& col) const;
+ bool operator!=(const color& col) const;
+
+ color operator+(const color& col) const;
+ color operator-(const color& col) const;
+ color operator*(const color& col) const;
+ color operator*(const_reference scale) const;
+ color operator/(const color& col) const;
+ color operator/(const_reference scale) const;
+
+ color& operator+=(const color& col);
+ color& operator-=(const color& col);
+ color& operator*=(const color& col);
+ color& operator*=(const_reference scale);
+ color& operator/=(const color& col);
+ color& operator/=(const_reference scale);
+
+ ///////////////
+ // Modifiers //
+ ///////////////
+ color& abs(void);
+ color& clamp(const_reference lowerBound=0.0f, const_reference upperBounds=1.0f);
+
+ /////////////
+ // Friends //
+ /////////////
+ friend void swap(color& a, color& b) { return a._swap(b); }
+ friend color abs(const color& c) { return color(c).abs(); }
+ friend color clamp(const color& c, const_reference lowerBound=0.0f, const_reference upperBound=1.0f) { return color(c).clamp(lowerBound, upperBound); }
+ friend color operator*(const_reference scale, const color& col) { return (col*scale); }
+
+ friend std::ostream& operator<<(std::ostream& s, const color& col)
+ {
+ s << "(" << col.r << "," << col.g << "," << col.b << ")";
+ return s;
+ }
+
+ private:
+ /////////////////////
+ // Private Methods //
+ /////////////////////
+ void _assign(const color& col);
+ void _swap(color& col);
+};
+
+#endif /* _COLOR_H_ */
diff --git a/hw2/include/constants.h b/hw2/include/constants.h
new file mode 100644
index 0000000..330e89e
--- /dev/null
+++ b/hw2/include/constants.h
@@ -0,0 +1,15 @@
+/******************************************************************/
+/* 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. */
+/******************************************************************/
+#ifndef _CONSTANTS_H_
+#define _CONSTANTS_H_
+
+static const float EPSILON = 10e-6;
+static const float LARGE = 10e10;
+
+#endif /* _CONSTANTS_H_ */
diff --git a/hw2/include/errorMessage.h b/hw2/include/errorMessage.h
new file mode 100644
index 0000000..7ec99d1
--- /dev/null
+++ b/hw2/include/errorMessage.h
@@ -0,0 +1,17 @@
+/******************************************************************/
+/* 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. */
+/******************************************************************/
+#ifndef _ERROR_MESSAGE_H_
+#define _ERROR_MESSAGE_H_
+
+#include <cstdarg>
+
+void errorMessage(const char* msg, ...);
+void warningMessage(const char* msg, ...);
+
+#endif /* _ERROR_MESSAGE_H_ */
diff --git a/hw2/include/image.h b/hw2/include/image.h
new file mode 100644
index 0000000..938e6c0
--- /dev/null
+++ b/hw2/include/image.h
@@ -0,0 +1,89 @@
+/******************************************************************/
+/* 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. */
+/******************************************************************/
+#ifndef _IMAGE_H_
+#define _IMAGE_H_
+
+#include <string>
+#include <memory>
+#include <ostream>
+
+#include "color.h"
+
+class image {
+ public:
+ //////////////
+ // Typedefs //
+ //////////////
+ typedef color value_type;
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
+ typedef std::unique_ptr<value_type[]>::pointer iterator;
+ typedef std::unique_ptr<const value_type[]>::pointer const_iterator;
+ typedef size_t difference_type;
+ typedef size_t size_type;
+
+ //////////////////
+ // Constructors //
+ //////////////////
+ image(size_type width=0, size_type height=0);
+ image(size_type width, size_type height, const_reference col);
+ image(const image& src);
+ image(image&& src);
+
+ virtual ~image(void) { _data.reset(); }
+
+ ////////////////
+ // Inspectors //
+ ////////////////
+ iterator begin(void);
+ const_iterator begin(void) const;
+
+ iterator end(void);
+ const_iterator end(void) const;
+
+ size_type size(void) const { return width()*height(); }
+ size_type width(void) const { return _width; }
+ size_type height(void) const { return _height; }
+
+
+ ///////////////
+ // Operators //
+ ///////////////
+ image& operator=(const image& src);
+ image& operator=(image&& src);
+
+ reference operator()(size_type x, size_type y);
+ const_reference operator()(size_type x, size_type y) const;
+
+ /////////////
+ // Friends //
+ /////////////
+ friend void swap(image& a, image& b) { a._swap(b); }
+ friend std::ostream& operator<<(std::ostream& s, const image& img)
+ {
+ s << "Image: (" << img.width() << ", " << img.height() << ")";
+ return s;
+ }
+
+protected:
+ /////////////////////
+ // Private Methods //
+ /////////////////////
+ void _swap(image& img);
+ void _assign(const image& src);
+
+private:
+ //////////////////////////
+ // Private Data Members //
+ //////////////////////////
+ size_type _width, _height;
+ std::unique_ptr<value_type[]> _data;
+};
+
+#endif /* _IMAGE_H_ */
diff --git a/hw2/include/imageIO.h b/hw2/include/imageIO.h
new file mode 100644
index 0000000..9e1ecfa
--- /dev/null
+++ b/hw2/include/imageIO.h
@@ -0,0 +1,19 @@
+/******************************************************************/
+/* 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. */
+/******************************************************************/
+#ifndef _IMAGEIO_H_
+#define _IMAGEIO_H_
+
+#include <string>
+#include "image.h"
+
+void importImage(const std::string& name, image& img);
+void exportImage(const std::string& name, const image& img);
+
+#endif /* _IMAGEIO_H_ */
+
diff --git a/hw2/include/imageIO.pfm.h b/hw2/include/imageIO.pfm.h
new file mode 100644
index 0000000..d09531a
--- /dev/null
+++ b/hw2/include/imageIO.pfm.h
@@ -0,0 +1,18 @@
+/******************************************************************/
+/* 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. */
+/******************************************************************/
+#ifndef _IMAGEIO_PFM_H_
+#define _IMAGEIO_PFM_H_
+
+#include <string>
+#include "image.h"
+
+void importPFM(const std::string& name, image& img);
+void exportPFM(const std::string& name, const image& img);
+
+#endif /* _IMAGEIO_PFM_H_ */
diff --git a/hw2/include/imageIO.ppm.h b/hw2/include/imageIO.ppm.h
new file mode 100644
index 0000000..7a8db42
--- /dev/null
+++ b/hw2/include/imageIO.ppm.h
@@ -0,0 +1,18 @@
+/******************************************************************/
+/* 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. */
+/******************************************************************/
+#ifndef _IMAGEIO_PPM_H_
+#define _IMAGEIO_PPM_H_
+
+#include <string>
+#include "image.h"
+
+void importPPM(const std::string& name, image& img);
+void exportPPM(const std::string& name, const image& img);
+
+#endif /* _IMAGEIO_PPM_H_ */
diff --git a/hw2/include/interval.h b/hw2/include/interval.h
new file mode 100644
index 0000000..ccb720a
--- /dev/null
+++ b/hw2/include/interval.h
@@ -0,0 +1,77 @@
+/******************************************************************/
+/* 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. */
+/******************************************************************/
+#ifndef _INTERVAL_H_
+#define _INTERVAL_H_
+
+#include <ostream>
+
+#include "constants.h"
+
+class interval
+{
+ public:
+ //////////////////
+ // Constrructor //
+ //////////////////
+ interval(float lower=-LARGE, float upper=+LARGE);
+ interval(const interval& i);
+
+ ///////////////
+ // Operators //
+ ///////////////
+ interval& operator=(const interval& i);
+
+ interval operator+(float v) const;
+ interval operator-(float v) const;
+ interval operator*(float v) const;
+ interval operator/(float v) const;
+
+ interval& operator+=(float v);
+ interval& operator-=(float v);
+ interval& operator*=(float v);
+ interval& operator/=(float v);
+
+ ////////////////
+ // Inspectors //
+ ////////////////
+ float lower(void) const;
+ float upper(void) const;
+
+ bool empty(void) const;
+
+ //////////////
+ // Mutators //
+ //////////////
+ void intersect(const interval& i);
+
+ /////////////
+ // Friends //
+ /////////////
+ friend void swap(interval& a, interval& b) { a._swap(b); }
+
+ friend std::ostream& operator<<(std::ostream& s, const interval& i)
+ {
+ s << "[" << i.lower() << ", " << i.upper() << "]";
+ return s;
+ }
+
+ private:
+ /////////////////////
+ // Private Methods //
+ /////////////////////
+ void _assign(const interval& i);
+ void _swap(interval& i);
+
+ //////////////////////////
+ // Private Data Members //
+ //////////////////////////
+ float _lower, _upper;
+};
+
+#endif /* _INTERVAL_H_ */
diff --git a/hw2/include/mat3d.h b/hw2/include/mat3d.h
new file mode 100644
index 0000000..e70ece4
--- /dev/null
+++ b/hw2/include/mat3d.h
@@ -0,0 +1,112 @@
+/******************************************************************/
+/* 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. */
+/******************************************************************/
+#ifndef _MAT3D_H_
+#define _MAT3D_H_
+
+#include <array>
+#include <ostream>
+
+#include "vec3d.h"
+
+class mat3d {
+ public:
+ /////////////
+ // Typedef //
+ /////////////
+ typedef float value_type;
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
+ typedef std::array<value_type,9>::iterator iterator;
+ typedef std::array<value_type,9>::const_iterator const_iterator;
+ typedef std::size_t difference;
+ typedef std::size_t size_type;
+
+ /////////////////
+ // Constructor //
+ /////////////////
+ mat3d(void); // all elements are set to 0
+ explicit mat3d(value_type diag); // all elements are set to 0, the diagonal elements are set to 'diag'
+ mat3d(const vec3d& X, const vec3d& Y, const vec3d& Z); // set columns to X, Y, and Z
+ mat3d(const mat3d& m); // copy constructor
+
+ ////////////////
+ // Inspectors //
+ ////////////////
+ static size_type width(void) { return 3; }
+ static size_type height(void) { return 3; }
+ static size_type size(void) { return 9; }
+
+ iterator begin(void);
+ const_iterator begin(void) const;
+ iterator end(void);
+ const_iterator end(void) const;
+
+ //////////////
+ // Mutators //
+ //////////////
+ void clear(value_type value=0.0f);
+ void setDiagonal(value_type value=1.0f);
+
+ mat3d& transpose(void);
+
+ ///////////////
+ // Operators //
+ ///////////////
+ mat3d& operator=(const mat3d& m);
+
+ reference operator()(size_type row, size_type col);
+ const_reference operator()(size_type row, size_type col) const;
+
+ mat3d operator+(const mat3d& m) const;
+ mat3d operator-(const mat3d& m) const;
+ mat3d operator*(const mat3d& m) const;
+ vec3d operator*(const vec3d& v) const;
+ mat3d operator*(value_type scale) const;
+ mat3d operator/(value_type scale) const;
+
+ mat3d& operator+=(const mat3d& m);
+ mat3d& operator-=(const mat3d& m);
+ mat3d& operator*=(const mat3d& m);
+ mat3d& operator*=(value_type scale);
+ mat3d& operator/=(value_type scale);
+
+ /////////////
+ // Friends //
+ /////////////
+ friend void swap(mat3d& a, mat3d& b) { a._swap(b); }
+
+ friend vec3d operator*(const vec3d& v, const mat3d& m) { return m._premultiply(v); }
+ friend mat3d operator*(value_type scale, const mat3d& m) { return (m * scale); }
+
+ friend mat3d transpose(mat3d& m) { mat3d n(m); return n.transpose(); }
+
+ friend std::ostream& operator<<(std::ostream& s, const mat3d& m)
+ {
+ s << "[[" << m(0,0) << ", " << m(0,1) << ", " << m(0,2) << "],[";
+ s << m(1,0) << ", " << m(1,1) << ", " << m(1,2) << "],[";
+ s << m(2,0) << ", " << m(2,1) << ", " << m(2,2) << "]]";
+ return s;
+ }
+
+ private:
+ /////////////////////
+ // Private Methods //
+ /////////////////////
+ void _swap(mat3d& m);
+ void _assign(const mat3d& m);
+
+ vec3d _premultiply(const vec3d& v) const;
+
+ //////////////////////////
+ // Private Data Members //
+ //////////////////////////
+ std::array<value_type, 9> _data;
+};
+
+#endif /* _MAT3D_H_ */
diff --git a/hw2/include/ray.h b/hw2/include/ray.h
new file mode 100644
index 0000000..743375f
--- /dev/null
+++ b/hw2/include/ray.h
@@ -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. */
+/******************************************************************/
+#ifndef _RAY_H_
+#define _RAY_H_
+
+#include <ostream>
+#include "vec3d.h"
+#include "transformation3d.h"
+
+class ray {
+ public:
+ //////////////////
+ // Constructors //
+ //////////////////
+ ray(const vec3d& origin = vec3d(), const vec3d& direction = vec3d());
+ ray(const ray& src);
+
+ ////////////////
+ // Inspectors //
+ ////////////////
+ const vec3d& origin(void) const { return _origin; }
+ const vec3d& direction(void) const { return _direction; }
+
+ ///////////////
+ // Operators //
+ ///////////////
+ ray& operator=(const ray& r);
+ vec3d operator()(float t) const;
+ float operator()(const vec3d& point) const;
+
+ //////////////
+ // Mutators //
+ //////////////
+ ray& transform(const transformation3d& t);
+ ray& inverseTransform(const transformation3d& t);
+
+ /////////////
+ // Friends //
+ /////////////
+ friend void swap(ray& a, ray& b) { a._swap(b); }
+ friend ray transform(const ray& r, const transformation3d& t) { return ray(r).transform(t); }
+ friend ray inverseTransform(const ray& r, const transformation3d& t) { return ray(r).inverseTransform(t); }
+ friend std::ostream& operator<<(std::ostream& s, const ray& r)
+ {
+ s << r.origin() << "->" << r.direction();
+ return s;
+ }
+
+ private:
+ /////////////////////
+ // Private Methods //
+ /////////////////////
+ void _swap(ray& r);
+ void _assign(const ray& r);
+
+ //////////////////
+ // Data Members //
+ //////////////////
+ vec3d _origin;
+ vec3d _direction;
+};
+
+#endif /* _RAY_H_ */
diff --git a/hw2/include/transformation3d.h b/hw2/include/transformation3d.h
new file mode 100644
index 0000000..7b61ecc
--- /dev/null
+++ b/hw2/include/transformation3d.h
@@ -0,0 +1,77 @@
+/******************************************************************/
+/* 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. */
+/******************************************************************/
+#ifndef _TRANSFORMATION3D_H_
+#define _TRANSFORMATION3D_H_
+
+#include "vec3d.h"
+#include "mat3d.h"
+
+class transformation3d {
+ public:
+ //////////////////
+ // Constructors //
+ //////////////////
+ transformation3d(void);
+ transformation3d(const vec3d& translation, const mat3d& transformation, const mat3d& inverseTransform);
+ transformation3d(const transformation3d& t);
+
+ //////////////
+ // Operator //
+ //////////////
+ transformation3d& operator=(const transformation3d& t);
+
+ transformation3d operator*(const transformation3d& t) const;
+ transformation3d& operator*=(const transformation3d& t);
+
+ //////////////
+ // Mutators //
+ //////////////
+ transformation3d& invert(void);
+
+ /////////////
+ // Methods //
+ /////////////
+ vec3d transformPoint(const vec3d& p) const;
+ vec3d transformDirection(const vec3d& d) const;
+ vec3d transformNormal(const vec3d& n) const;
+
+ vec3d inverseTransformPoint(const vec3d& p) const;
+ vec3d inverseTransformDirection(const vec3d& d) const;
+ vec3d inverseTransformNormal(const vec3d& n) const;
+
+ /////////////
+ // Friends //
+ /////////////
+ friend void swap(transformation3d& a, transformation3d& b) { a._swap(b); }
+
+ friend transformation3d inverse(const transformation3d& t) { transformation3d i(t); return i.invert(); }
+
+ friend std::ostream& operator<<(std::ostream& s, const transformation3d& t)
+ {
+ t._print(s);
+ return s;
+ }
+
+ protected:
+ ///////////////////////
+ // Protected Methods //
+ ///////////////////////
+ void _swap(transformation3d& t);
+ void _assign(const transformation3d& t);
+ virtual void _print(std::ostream& s) const;
+
+ ////////////////////////////
+ // Protected Data Members //
+ ////////////////////////////
+ vec3d _translation;
+ mat3d _transformation;
+ mat3d _inverseTransformation;
+};
+
+#endif /* _TRANSFORMATION3D_H_ */
diff --git a/hw2/include/triangle.h b/hw2/include/triangle.h
new file mode 100644
index 0000000..f7d85bf
--- /dev/null
+++ b/hw2/include/triangle.h
@@ -0,0 +1,115 @@
+/******************************************************************/
+/* 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. */
+/******************************************************************/
+#ifndef _TRIANGLE_H_
+#define _TRIANGLE_H_
+
+#include <array>
+#include <vector>
+#include <memory>
+#include <ostream>
+
+#include "ray.h"
+#include "vec2d.h"
+#include "vec3d.h"
+#include "boundingBox.h"
+
+class triangle {
+ public:
+ //////////////////
+ // Constructors //
+ //////////////////
+ triangle(void);
+ triangle(const triangle& t);
+ triangle(triangle&& t);
+
+ triangle(const vec3d& v1, const vec3d& v2, const vec3d& v3);
+ triangle(size_t v1_idx, size_t v2_idx, size_t v3_idx, const std::shared_ptr<const std::vector<vec3d>>& vertex_list);
+
+ triangle(const vec3d& v1, const vec3d& v2, const vec3d& v3,
+ const vec3d& n1, const vec3d& n2, const vec3d& n3);
+ triangle(size_t v1_idx, size_t v2_idx, size_t v3_idx, const std::shared_ptr<const std::vector<vec3d>>& vertex_list,
+ size_t n1_idx, size_t n2_idx, size_t n3_idx, const std::shared_ptr<const std::vector<vec3d>>& normal_list);
+
+ triangle(const vec3d& v1, const vec3d& v2, const vec3d& v3,
+ const vec2d& t1, const vec2d& t2, const vec2d& t3);
+ triangle(size_t v1_idx, size_t v2_idx, size_t v3_idx, const std::shared_ptr<const std::vector<vec3d>>& vertex_list,
+ size_t t1_idx, size_t t2_idx, size_t t3_idx, const std::shared_ptr<const std::vector<vec2d>>& texcoord_list);
+
+ triangle(const vec3d& v1, const vec3d& v2, const vec3d& v3,
+ const vec3d& n1, const vec3d& n2, const vec3d& n3,
+ const vec2d& t1, const vec2d& t2, const vec2d& t3);
+ triangle(size_t v1_idx, size_t v2_idx, size_t v3_idx, const std::shared_ptr<const std::vector<vec3d>>& vertex_list,
+ size_t n1_idx, size_t n2_idx, size_t n3_idx, const std::shared_ptr<const std::vector<vec3d>>& normal_list,
+ size_t t1_idx, size_t t2_idx, size_t t3_idx, const std::shared_ptr<const std::vector<vec2d>>& texcoord_list);
+
+ ////////////////
+ // Inspectors //
+ ////////////////
+ const vec3d& vertex(size_t index) const;
+ const vec3d& normal(size_t index) const;
+ const vec2d& textureCoordinate(size_t index) const;
+
+ bool hasPerVertexNormals(void) const;
+ bool hasPerVertexTextureCoordinates(void) const;
+
+ ///////////////
+ // Operators //
+ ///////////////
+ triangle& operator=(const triangle& t);
+ triangle& operator=(triangle&& t);
+
+ /////////////
+ // Methods //
+ /////////////
+ bool intersect(const ray& r, vec3d& barycentricCoord, float& t) const;
+
+ boundingBox boundingbox(void) const;
+ vec3d vertex(const vec3d& barycentricCoord) const;
+ vec3d normal(void) const;
+ vec3d shadingAxis(void) const;
+ vec3d normal(const vec3d& barycentricCoord) const;
+ vec2d textureCoordinate(const vec3d& barycentricCoord) const;
+
+ vec3d sample(float r1, float r2, vec3d& barycentricCoord, float& pdf) const;
+ float area(void) const;
+
+ /////////////
+ // Friends //
+ /////////////
+ friend void swap(triangle& a, triangle& b) { a._swap(b); }
+
+ friend std::ostream& operator<<(std::ostream& s, const triangle& t)
+ {
+ s << "Triangle: v=(" << t.vertex(0) << "," << t.vertex(1) << "," << t.vertex(2) << ")";
+ if(t._normal_list)
+ s << ", n=(" << t.normal(0) << "," << t.normal(1) << "," << t.normal(2) << ")";
+ if(t._textureCoord_list)
+ s << ", t=(" << t.textureCoordinate(0) << "," << t.textureCoordinate(1) << "," << t.textureCoordinate(2) << ")";
+ return s;
+ }
+
+private:
+ /////////////////////
+ // Private Methods //
+ /////////////////////
+ void _assign(const triangle& t);
+ void _swap(triangle& t);
+
+ //////////////////
+ // Data Members //
+ //////////////////
+ std::array<size_t, 3> _vertex_idx;
+ std::array<size_t, 3> _normal_idx;
+ std::array<size_t,3 > _textureCoord_idx;
+ std::shared_ptr<const std::vector<vec3d>> _vertex_list;
+ std::shared_ptr<const std::vector<vec3d>> _normal_list;
+ std::shared_ptr<const std::vector<vec2d>> _textureCoord_list;
+};
+
+#endif /* _TRIANGLE_H_ */
diff --git a/hw2/include/util.h b/hw2/include/util.h
new file mode 100644
index 0000000..2146464
--- /dev/null
+++ b/hw2/include/util.h
@@ -0,0 +1,19 @@
+/******************************************************************/
+/* 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. */
+/******************************************************************/
+
+#ifndef _UTIL_H_
+#define _UTIL_H_
+
+#include <string>
+
+std::string getFilename(const std::string& path);
+std::string getExtension(const std::string& path);
+std::string getDirectory(const std::string& path);
+
+#endif /* _UTIL_H_ */
diff --git a/hw2/include/vec2d.h b/hw2/include/vec2d.h
new file mode 100644
index 0000000..36e0e5c
--- /dev/null
+++ b/hw2/include/vec2d.h
@@ -0,0 +1,117 @@
+/******************************************************************/
+/* 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. */
+/******************************************************************/
+#ifndef _VEC2D_H_
+#define _VEC2D_H_
+
+#include <ostream>
+#include <cmath>
+
+class vec2d {
+ public:
+ /////////////
+ // Typedef //
+ /////////////
+ typedef float value_type;
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
+ typedef value_type* iterator;
+ typedef const value_type* const_iterator;
+
+ //////////////////
+ // Data Members //
+ //////////////////
+ union {
+ struct { value_type x, y; };
+ struct { value_type u, v; };
+ value_type data[2];
+ };
+
+ public:
+ /////////////////
+ // Constructor //
+ /////////////////
+ explicit vec2d(const_reference value=0.0f);
+ vec2d(const_reference x, const_reference y);
+ vec2d(const vec2d& v);
+
+ ////////////////
+ // Inspectors //
+ ////////////////
+ static size_t size(void) { return 2; }
+
+ iterator begin(void);
+ const_iterator begin(void) const;
+ iterator end(void);
+ const_iterator end(void) const;
+
+ const_reference operator[](size_t index) const;
+ reference operator[](size_t index);
+
+ ///////////////
+ // Operators //
+ ///////////////
+ vec2d& operator=(const vec2d& v);
+
+ bool operator==(const vec2d& v) const;
+ bool operator!=(const vec2d& v) const;
+
+ vec2d operator-(void) const;
+
+ vec2d operator+(const vec2d& v) const;
+ vec2d operator-(const vec2d& v) const;
+ vec2d operator*(const vec2d& v) const;
+ vec2d operator*(const_reference scale) const;
+ vec2d operator/(const vec2d& v) const;
+ vec2d operator/(const_reference scale) const;
+
+ vec2d& operator+=(const vec2d& v);
+ vec2d& operator-=(const vec2d& v);
+ vec2d& operator*=(const vec2d& v);
+ vec2d& operator*=(const_reference scale);
+ vec2d& operator/=(const vec2d& v);
+ vec2d& operator/=(const_reference scale);
+
+ /////////////
+ // Methods //
+ /////////////
+ value_type dot(const vec2d& v) const;
+ value_type squared_length(void) const;
+ value_type length(void) const;
+ value_type squared_distance(const vec2d& v) const;
+ value_type distance(const vec2d& v) const;
+
+ ///////////////
+ // Modifiers //
+ ///////////////
+ vec2d& abs(void);
+ vec2d& normalize(void);
+
+ /////////////
+ // Friends //
+ /////////////
+ friend void swap(vec2d& a, vec2d& b) { return a._swap(b); }
+ friend vec2d normalize(const vec2d& v) { return vec2d(v).normalize(); }
+ friend vec2d abs(const vec2d& v) { return vec2d(v).abs(); }
+ friend vec2d operator*(const_reference scale, const vec2d& v) { return (v*scale); }
+
+ friend std::ostream& operator<<(std::ostream& s, const vec2d& v)
+ {
+ s << "[" << v.x << "," << v.y << "]";
+ return s;
+ }
+
+ private:
+ /////////////////////
+ // Private Methods //
+ /////////////////////
+ void _assign(const vec2d& v);
+ void _swap(vec2d& v);
+};
+
+#endif /* _VEC2D_H_ */
diff --git a/hw2/include/vec3d.h b/hw2/include/vec3d.h
new file mode 100644
index 0000000..50d918f
--- /dev/null
+++ b/hw2/include/vec3d.h
@@ -0,0 +1,120 @@
+/******************************************************************/
+/* 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. */
+/******************************************************************/
+#ifndef _VEC3D_H_
+#define _VEC3D_H_
+
+#include <ostream>
+#include <cmath>
+
+class vec3d {
+ public:
+ /////////////
+ // Typedef //
+ /////////////
+ typedef float value_type;
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
+ typedef value_type* iterator;
+ typedef const value_type* const_iterator;
+
+ //////////////////
+ // Data Members //
+ //////////////////
+ union {
+ struct { value_type x, y, z; };
+ value_type data[3];
+ };
+
+ public:
+ /////////////////
+ // Constructor //
+ /////////////////
+ explicit vec3d(const_reference value=0.0f);
+ vec3d(const_reference x, const_reference y, const_reference z);
+ vec3d(const vec3d& v);
+
+ ////////////////
+ // Inspectors //
+ ////////////////
+ static size_t size(void) { return 3; }
+
+ iterator begin(void);
+ const_iterator begin(void) const;
+ iterator end(void);
+ const_iterator end(void) const;
+
+ const_reference operator[](size_t index) const;
+ reference operator[](size_t index);
+
+ ///////////////
+ // Operators //
+ ///////////////
+ vec3d& operator=(const vec3d& v);
+
+ bool operator==(const vec3d& v) const;
+ bool operator!=(const vec3d& v) const;
+
+ vec3d operator-(void) const;
+
+ vec3d operator+(const vec3d& v) const;
+ vec3d operator-(const vec3d& v) const;
+ vec3d operator*(const vec3d& v) const;
+ vec3d operator*(const_reference scale) const;
+ vec3d operator/(const vec3d& v) const;
+ vec3d operator/(const_reference scale) const;
+
+ vec3d& operator+=(const vec3d& v);
+ vec3d& operator-=(const vec3d& v);
+ vec3d& operator*=(const vec3d& v);
+ vec3d& operator*=(const_reference scale);
+ vec3d& operator/=(const vec3d& v);
+ vec3d& operator/=(const_reference scale);
+
+ /////////////
+ // Methods //
+ /////////////
+ value_type dot(const vec3d& v) const;
+ value_type squared_length(void) const;
+ value_type length(void) const;
+ value_type squared_distance(const vec3d& v) const;
+ value_type distance(const vec3d& v) const;
+
+ vec3d cross(const vec3d& v) const;
+
+ ///////////////
+ // Modifiers //
+ ///////////////
+ vec3d& abs(void);
+ vec3d& clamp(value_type lower=0.0f, value_type upper=1.0f);
+ vec3d& normalize(void);
+
+ /////////////
+ // Friends //
+ /////////////
+ friend void swap(vec3d& a, vec3d& b) { return a._swap(b); }
+ friend vec3d normalize(const vec3d& v) { return vec3d(v).normalize(); }
+ friend vec3d abs(const vec3d& v) { return vec3d(v).abs(); }
+ friend vec3d clamp(const vec3d& v, value_type lower=0.0f, value_type upper=1.0f) { return vec3d(v).clamp(lower, upper); }
+ friend vec3d operator*(const_reference scale, const vec3d& v) { return (v*scale); }
+
+ friend std::ostream& operator<<(std::ostream& s, const vec3d& v)
+ {
+ s << "[" << v.x << "," << v.y << "," << v.z << "]";
+ return s;
+ }
+
+ private:
+ /////////////////////
+ // Private Methods //
+ /////////////////////
+ void _assign(const vec3d& v);
+ void _swap(vec3d& v);
+};
+
+#endif /* _VEC3D_H_ */