From 53326d6ff1c67cf909259a4ac9b941d0b0992454 Mon Sep 17 00:00:00 2001 From: K Tyl Date: Mon, 1 Jun 2020 01:49:50 +0100 Subject: [PATCH] add vec3 and colour --- CMakeLists.txt | 2 +- colour.h | 13 ++++++ main.cpp | 14 +++--- vec3.h | 113 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 132 insertions(+), 10 deletions(-) create mode 100644 colour.h create mode 100644 vec3.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d6dd14..12e2483 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,5 +2,5 @@ cmake_minimum_required(VERSION 3.10) project(flark) -add_executable(flark main.cpp) +add_executable(flark main.cpp vec3.h colour.h) diff --git a/colour.h b/colour.h new file mode 100644 index 0000000..8f19595 --- /dev/null +++ b/colour.h @@ -0,0 +1,13 @@ +#pragma once + +#include "vec3.h" + +#include + +void writeColour(std::ostream &out, colour pixelColour) +{ + // write the translated [0,255] value of each colour component. + out << static_cast(255.999 * pixelColour.x()) << ' ' + << static_cast(255.999 * pixelColour.y()) << ' ' + << static_cast(255.999 * pixelColour.z()) << '\n'; +} diff --git a/main.cpp b/main.cpp index ac5f9e0..88385a1 100644 --- a/main.cpp +++ b/main.cpp @@ -1,3 +1,6 @@ +#include "colour.h" +#include "vec3.h" + #include const int WIDTH = 256; @@ -14,15 +17,8 @@ int main() for (int x = 0; x < WIDTH; ++x) { - double r = double(x) / (WIDTH - 1); - double g = double(y) / (HEIGHT - 1); - double b = 0.25; - - int ir = static_cast(255.999 * r); - int ig = static_cast(255.999 * g); - int ib = static_cast(255.999 * b); - - std::cout << ir << ' ' << ig << ' ' << ib << std::endl; + colour pixelColour(double(x)/(WIDTH-1), double(y)/(HEIGHT-1), 0.25); + writeColour(std::cout, pixelColour); } } diff --git a/vec3.h b/vec3.h new file mode 100644 index 0000000..5045353 --- /dev/null +++ b/vec3.h @@ -0,0 +1,113 @@ +#pragma once + +#include +#include + +class vec3 +{ +public: + vec3() : e{0,0,0} {} + vec3(double e0, double e1, double e2) : e{e0, e1, e2} {} + + double x() const { return e[0]; } + double y() const { return e[1]; } + double z() const { return e[2]; } + + vec3 operator-() const { return vec3(-e[0], -e[1], -e[2]); } + double operator[](int i) const { return e[i]; } + double& operator[](int i) { return e[i]; } + + vec3& operator+=(const vec3 &v) + { + e[0] += v.e[0]; + e[1] += v.e[1]; + e[2] += v.e[2]; + return *this; + } + + vec3& operator*=(const double t) + { + e[0] *= t; + e[1] *= t; + e[2] *= t; + return *this; + } + + vec3& operator/=(const double t) + { + return *this *= 1 / t; + } + + double length() const + { + return std::sqrt(lengthSquared()); + } + + double lengthSquared() const + { + return e[0]*e[0] + e[1]*e[1] + e[2]*e[2]; + } + +public: + double e[3]; +}; + +// type aliases for vec3 +using point3 = vec3; // 3D point +using colour = vec3; // RGB colour + +// utility functions + +inline std::ostream& operator<<(std::ostream &out, const vec3 &v) +{ + return out << v.e[0] << ' ' << v.e[1] << ' ' << v.e[2]; +} + +inline vec3 operator+(const vec3 &u, const vec3 &v) +{ + return vec3(u.e[0] + v.e[0], u.e[1] + v.e[1], u.e[2] + v.e[2]); +} + +inline vec3 operator-(const vec3 &u, const vec3 &v) +{ + return vec3(u.e[0] - v.e[0], u.e[1] - v.e[1], u.e[2] - v.e[2]); +} + +inline vec3 operator*(const vec3 &u, const vec3 &v) +{ + return vec3(u.e[0] * v.e[0], u.e[1] * v.e[1], u.e[2] * v.e[2]); +} + +inline vec3 operator*(double t, const vec3 &v) +{ + return vec3(t * v.e[0], t * v.e[1], t * v.e[2]); +} + +inline vec3 operator*(const vec3 &v, double t) +{ + return t * v; +} + +inline vec3 operator/(vec3 v, double t) +{ + return (1 / t) * v; +} + +inline double dot(const vec3 &u, const vec3 &v) +{ + return u.e[0] * v.e[0] + + u.e[1] * v.e[1] + + u.e[2] * v.e[2]; +} + +inline vec3 cross(const vec3 &u, const vec3 &v) +{ + return vec3(u.e[1] * v.e[2] - u.e[2] * v.e[1], + u.e[2] * v.e[0] - u.e[0] * v.e[2], + u.e[0] * v.e[1] - u.e[1] * v.e[0]); +} + +inline vec3 unitVector(vec3 v) +{ + return v / v.length(); +}