Path Tracer
rgb_model.hpp
1 #pragma once
2 #include <color/color.hpp>
3 #include <color/colorable.hpp>
4 #include <color/spd.hpp>
5 #include <color/specutils.hpp>
6 #include <common.hpp>
7 #include <utils.hpp>
8 #include <math3d/vec3.hpp>
9 
10 using namespace ptracey;
11 namespace ptracey {
12 
13 class rgb_model : public vec3, public colorable {
14 public:
15  SpectrumType type = SpectrumType::RGB;
16 
17 public:
18  rgb_model() : vec3() {}
19  rgb_model(Real e0, Real e1, Real e2) : vec3(e0, e1, e2) {}
20  rgb_model(Real e0) : vec3(e0) {}
21  rgb_model(const Real e1[3]) : vec3(e1) {}
22  rgb_model(const vec3 &v) : vec3(v.x(), v.y(), v.z()) {}
23  rgb_model(
24  const path &path_to_csv,
25  const std::string &wave_col_name,
26  const std::string &power_col_name,
27  const char &sep = ',', const uint stride = SPD_STRIDE,
28  SpectrumType stype = SpectrumType::Reflectance) {
29  spd csv_spect = spd(path_to_csv, wave_col_name,
30  power_col_name, sep, stride);
31  vec3 xyz;
32  get_cie_values(csv_spect, xyz);
33  vec3 rgb = xyz2rgb_cie(xyz);
34  e[0] = rgb.x();
35  e[1] = rgb.y();
36  e[2] = rgb.z();
37  }
38  vec3 to_xyz() const override {
39  return rgb2xyz_cie(vec3(x(), y(), z()));
40  }
41  vec3 to_vec3() const { return vec3(x(), y(), z()); }
42  vec3 to_rgb() const override {
43  return vec3(x(), y(), z());
44  }
45  vec3 evaluate(const WaveLength &w) const {
46  return vec3(x(), y(), z());
47  }
48  void add(const color &c, const WaveLength &w) {
49  e[0] += c.vdata.x();
50  e[1] += c.vdata.y();
51  e[2] += c.vdata.z();
52  }
53  rgb_model operator*(Real coeff) const {
54  auto ps = to_vec3() * coeff;
55  auto rm = rgb_model(ps);
56  return rm;
57  }
58  void scale(Real coeff) {
59  e[0] *= coeff;
60  e[1] *= coeff;
61  e[2] *= coeff;
62  }
63 };
64 }
ptracey::colorable
Definition: colorable.hpp:9
ptracey::vec3
Definition: vec3.hpp:7
ptracey::spd
Definition: spd.hpp:13
ptracey::color
Definition: color.hpp:9
ptracey::rgb_model
Definition: rgb_model.hpp:13