ray-tracer/src/colour.h

66 lines
1.6 KiB
C
Raw Normal View History

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;
}