From c1019143de71db54e215902f02421b728005adc6 Mon Sep 17 00:00:00 2001 From: Faerbit Date: Wed, 3 Jun 2020 00:06:53 +0200 Subject: [PATCH] Initial commit. --- .gitignore | 3 ++ Makefile | 24 ++++++++++++ color.h | 14 +++++++ vec3.h | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++ wtracer.cpp | 22 +++++++++++ 5 files changed, 168 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 color.h create mode 100644 vec3.h create mode 100644 wtracer.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b127847 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.o +wtracer +image.ppm diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6068de4 --- /dev/null +++ b/Makefile @@ -0,0 +1,24 @@ +CXX = g++ + +CXXFLAGS = -Wall -Wextra -O2 -std=c++14 + +DEPS = vec3.h color.h +OBJ = wtracer.o + +TARGET = wtracer + +all: $(TARGET) run + +run: + ./wtracer > image.ppm + eog image.ppm + +%.o: %.cpp $(DEPS) + $(CXX) $(CXXFLAGS) -c -o $@ $< + +$(TARGET): $(OBJ) + $(CXX) $(CXXFLAGS) -o $@ $^ + +clean: + $(RM) $(TARGET) $(OBJ) image.ppm + diff --git a/color.h b/color.h new file mode 100644 index 0000000..582b0c1 --- /dev/null +++ b/color.h @@ -0,0 +1,14 @@ +#ifndef COLOR_H +#define COLOR_H + +#include + +#include "vec3.h" + +void write_color(std::ostream &out, Color pixel_color) { + out << static_cast(255.999 * pixel_color.x()) << " " + << static_cast(255.999 * pixel_color.y()) << " " + << static_cast(255.999 * pixel_color.z()) << "\n"; +} + +#endif // COLOR_H diff --git a/vec3.h b/vec3.h new file mode 100644 index 0000000..48dfe9c --- /dev/null +++ b/vec3.h @@ -0,0 +1,105 @@ +#ifndef VEC3_H +#define VEC3_H + +#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(length_squared()); } + + double length_squared() const { + return e[0] * e[0] + e[1] * e[1] + e[2] * e[2]; + } + + private: + double e[3]; + + friend std::ostream& operator<<(std::ostream&, const Vec3&); + friend Vec3 operator+(const Vec3&, const Vec3&); + friend Vec3 operator-(const Vec3&, const Vec3&); + friend Vec3 operator*(const Vec3&, const Vec3&); + friend Vec3 operator*(double, const Vec3&); + friend Vec3 operator*(const Vec3&, double); + friend Vec3 operator/(const Vec3&, double); + friend double dot(const Vec3&, const Vec3&); + friend Vec3 cross(const Vec3&, const Vec3&); + friend Vec3 unit_vector(const Vec3); +}; + +using Point3 = Vec3; +using Color = Vec3; + +// Vec3 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 Vec3(t * v.e[0], t * v.e[1], t * v.e[2]); +} + +inline Vec3 operator/(const 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[1]; +} + +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 unit_vector(Vec3 v) { + return v / v.length(); +} + +#endif // VEC3_H diff --git a/wtracer.cpp b/wtracer.cpp new file mode 100644 index 0000000..c0de864 --- /dev/null +++ b/wtracer.cpp @@ -0,0 +1,22 @@ +#include + +#include "color.h" +#include "vec3.h" + +int main() { + const int image_width = 256; + const int image_height = 256; + + std::cout << "P3\n" << image_width << " " << image_height << "\n255\n"; + + for (int j = image_height - 1; j >= 0; --j) { + std::cerr << "\rScanlines remaining: " << j << " " << std::flush; + for (int i = 0; i < image_width; ++i) { + Color pixel_color(double(i) / (image_width - 1), + double(j) / (image_height - 1), + 0.25); + write_color(std::cout, pixel_color); + } + } + std::cerr << "\nDone.\n"; +}