Path Tracer
aabb.hpp
1 #pragma once
2 
3 #include <common.hpp>
4 #include <camera/ray.hpp>
5 #include <utils.hpp>
6 #include <math3d/vec3.hpp>
7 
8 using namespace ptracey;
9 
10 namespace ptracey {
11 
12 class aabb {
13 public:
14  aabb() {}
15  aabb(const point3 &a, const point3 &b) {
16  minimum = a;
17  maximum = b;
18  }
19 
20  point3 min() const { return minimum; }
21  point3 max() const { return maximum; }
22  bool hit(const ray &r, double t_min, double t_max) const {
23  for (int a = 0; a < 3; a++) {
24  auto t0 = fmin(
25  (minimum[a] - r.origin()[a]) / r.direction()[a],
26  (maximum[a] - r.origin()[a]) / r.direction()[a]);
27  auto t1 = fmax(
28  (minimum[a] - r.origin()[a]) / r.direction()[a],
29  (maximum[a] - r.origin()[a]) / r.direction()[a]);
30  t_min = fmax(t0, t_min);
31  t_max = fmin(t1, t_max);
32  if (t_max <= t_min)
33  return false;
34  }
35  return true;
36  }
37  double area() const {
38  auto a = maximum.x() - minimum.x();
39  auto b = maximum.y() - minimum.y();
40  auto c = maximum.z() - minimum.z();
41  return 2 * (a * b + b * c + c * a);
42  }
43  int longest_axis() const {
44  auto a = maximum.x() - minimum.x();
45  auto b = maximum.y() - minimum.y();
46  auto c = maximum.z() - minimum.z();
47  if (a > b && a > c)
48  return 0;
49  else if (b > c)
50  return 1;
51  else
52  return 2;
53  }
54 
55 public:
56  point3 minimum;
57  point3 maximum;
58 };
59 
60 aabb surrounding_box(aabb box0, aabb box1) {
61  vec3 small(fmin(box0.min().x(), box1.min().x()),
62  fmin(box0.min().y(), box1.min().y()),
63  fmin(box0.min().z(), box1.min().z()));
64 
65  vec3 big(fmax(box0.max().x(), box1.max().x()),
66  fmax(box0.max().y(), box1.max().y()),
67  fmax(box0.max().z(), box1.max().z()));
68 
69  return aabb(small, big);
70 }
71 }
ptracey::ray
Definition: ray.hpp:8
ptracey::vec3
Definition: vec3.hpp:7
ptracey::aabb
Definition: aabb.hpp:12