Path Tracer
color.hpp
1 #pragma once
2 //
3 #include <color/specutils.hpp>
4 #include <common.hpp>
5 #include <math3d/vec3.hpp>
6 using namespace ptracey;
7 namespace ptracey {
8 
9 struct color {
10  SpectrumType type;
11  vec3 vdata;
12  Power pdata;
13  color() {}
14  color(const SpectrumType &t, const vec3 &v,
15  const Power &p)
16  : type(t), vdata(v), pdata(p) {}
17  color(const Power &p)
18  : type(SpectrumType::Illuminant), vdata(p), pdata(p) {
19  }
20  color(const Real &p1, const Real &p2, const Real &p3)
21  : type(SpectrumType::RGB), vdata(p1, p2, p3),
22  pdata(0) {}
23  color(const vec3 &rgb)
24  : type(SpectrumType::RGB), vdata(rgb), pdata(0) {}
25 
26  static vec3 random() { return vec3::random(); }
27  static vec3 random(Real t1, Real t2) {
28  return vec3::random(t1, t2);
29  }
30  color &operator*=(const Real &t) {
31  pdata *= t;
32  vdata *= t;
33  return *this;
34  }
35  color operator*(const color &c) const {
36  auto nvdata = vdata * c.vdata;
37  auto npdata = pdata * c.pdata;
38  color nc;
39  nc.type = type;
40  nc.vdata = nvdata;
41  nc.pdata = npdata;
42  return nc;
43  }
44  color operator/(const color &c) const {
45  auto nvdata = vdata / c.vdata;
46  auto npdata = pdata / c.pdata;
47  color nc(type, nvdata, npdata);
48  return nc;
49  }
50  color operator/(const Real &c) const {
51  auto nvdata = vdata / c;
52  auto npdata = pdata / c;
53  color nc(type, nvdata, npdata);
54  return nc;
55  }
56  color operator+(const Real &c) const {
57  auto nvdata = vdata + c;
58  auto npdata = pdata + c;
59  color nc(type, nvdata, npdata);
60  return nc;
61  }
62  color operator+(const color &c) const {
63  auto nvdata = vdata + c.vdata;
64  auto npdata = pdata + c.pdata;
65  color nc(type, nvdata, npdata);
66  return nc;
67  }
68 };
69 inline std::ostream &operator<<(std::ostream &out,
70  const color &c) {
71  return out << " color v: " << c.vdata << " p: " << c.pdata
72  << " t: " << c.type << std::endl;
73 }
74 }
ptracey::vec3
Definition: vec3.hpp:7
ptracey::color
Definition: color.hpp:9