2023-12-23 22:56:27 +01:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <cassert>
|
|
|
|
|
#include <iomanip>
|
|
|
|
|
#include <ios>
|
2023-12-27 17:23:35 +01:00
|
|
|
#include <iostream>
|
2023-12-23 22:56:27 +01:00
|
|
|
#include <ostream>
|
2023-12-27 17:23:35 +01:00
|
|
|
#include <sstream>
|
|
|
|
|
#include <string>
|
2023-12-23 22:56:27 +01:00
|
|
|
|
2023-12-27 17:23:35 +01:00
|
|
|
#include "raytracer.h"
|
|
|
|
|
#include "vec3.h"
|
2023-12-23 22:56:27 +01:00
|
|
|
|
|
|
|
|
class Colour {
|
|
|
|
|
public:
|
|
|
|
|
static const Colour kBlack;
|
|
|
|
|
static const Colour kWhite;
|
|
|
|
|
|
|
|
|
|
constexpr Colour() = default;
|
|
|
|
|
constexpr Colour(double r, double g, double b) : r_{r}, g_{g}, b_{b} {
|
|
|
|
|
assert(0.0 <= r && r <= 1.0);
|
|
|
|
|
assert(0.0 <= g && g <= 1.0);
|
|
|
|
|
assert(0.0 <= b && b <= 1.0);
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-27 17:23:35 +01:00
|
|
|
constexpr explicit Colour(Vec3 v) : Colour{v.x(), v.y(), v.z()} {}
|
|
|
|
|
|
2023-12-23 22:56:27 +01:00
|
|
|
constexpr double& r() { return r_; }
|
|
|
|
|
constexpr double& g() { return g_; }
|
|
|
|
|
constexpr double& b() { return b_; }
|
|
|
|
|
|
|
|
|
|
constexpr double r() const { return r_; }
|
|
|
|
|
constexpr double g() const { return g_; }
|
|
|
|
|
constexpr double b() const { return b_; }
|
|
|
|
|
|
2023-12-27 17:23:35 +01:00
|
|
|
std::string to_string() const {
|
|
|
|
|
std::stringstream ss;
|
|
|
|
|
|
|
|
|
|
ss << '#';
|
|
|
|
|
|
|
|
|
|
ss << std::hex << std::setfill('0') << std::setw(2) << FToU8(r());
|
|
|
|
|
ss << std::hex << std::setfill('0') << std::setw(2) << FToU8(g());
|
|
|
|
|
ss << std::hex << std::setfill('0') << std::setw(2) << FToU8(b());
|
|
|
|
|
|
|
|
|
|
return ss.str();
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-23 22:56:27 +01:00
|
|
|
private:
|
|
|
|
|
double r_;
|
|
|
|
|
double g_;
|
|
|
|
|
double b_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
constexpr Colour Colour::kBlack{0.0, 0.0, 0.0};
|
|
|
|
|
|
2023-12-27 17:23:35 +01:00
|
|
|
constexpr Colour operator*(double t, Colour col) { return {t * col.r(), t * col.g(), t * col.b()}; }
|
2023-12-23 22:56:27 +01:00
|
|
|
|
|
|
|
|
constexpr Colour operator+(Colour c1, Colour c2) {
|
|
|
|
|
return {c1.r() + c2.r(), c1.g() + c2.g(), c1.b() + c2.b()};
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-27 17:23:35 +01:00
|
|
|
inline std::ostream& operator<<(std::ostream& os, Colour colour) {
|
|
|
|
|
os << FToU8(colour.r()) << ' ' << FToU8(colour.g()) << ' ' << FToU8(colour.b());
|
2023-12-23 22:56:27 +01:00
|
|
|
|
2023-12-27 17:23:35 +01:00
|
|
|
return os;
|
|
|
|
|
}
|