Simulant  21.12-574
A portable game engine for Windows, OSX, Linux, Dreamcast, and PSP
aabb.h
1 #pragma once
2 
3 #include <cmath>
4 #include <array>
5 #include "vec3.h"
6 
7 namespace smlt {
8 
9 class VertexData;
10 
11 enum AABBCorner {
12  AABB_CORNER_NEG_X_NEG_Y_NEG_Z = 0,
13  AABB_CORNER_POS_X_NEG_Y_NEG_Z = 1,
14  AABB_CORNER_POS_X_NEG_Y_POS_Z = 2,
15  AABB_CORNER_NEG_X_NEG_Y_POS_Z = 3,
16  AABB_CORNER_NEG_X_POS_Y_NEG_Z = 4,
17  AABB_CORNER_POS_X_POS_Y_NEG_Z = 5,
18  AABB_CORNER_POS_X_POS_Y_POS_Z = 6,
19  AABB_CORNER_NEG_X_POS_Y_POS_Z = 7
20 };
21 
22 class AABB {
23  Vec3 center_;
24  Vec3 extents_;
25 
26 public:
27  void set_min_max(const Vec3& min, const Vec3& max) {
28  extents_ = (max - min) * 0.5f;
29  center_ = min + extents_;
30  }
31 
32  Vec3 min() const {
33  return center_ - extents_;
34  }
35 
36  Vec3 max() const {
37  return center_ + extents_;
38  }
39 
40  AABB() = default;
41 
42  AABB(const Vec3& center, const Vec3& extents):
43  center_(center), extents_(extents) {}
44 
45  AABB(const Vec3& centre, float width);
46  AABB(const Vec3& centre, float xsize, float ysize, float zsize);
47  AABB(const Vec3* vertices, const std::size_t count);
48  AABB(const VertexData& vertex_data);
49 
50  float width() const {
51  return extents_.x * 2.0f;
52  }
53 
54  float height() const {
55  return extents_.y * 2.0f;
56  }
57 
58  float depth() const {
59  return extents_.z * 2.0f;
60  }
61 
62  const Vec3 half_dimensions() const {
63  return extents_;
64  }
65 
66  const Vec3 dimensions() const {
67  return Vec3(width(), height(), depth());
68  }
69 
70  float max_dimension() const {
71  return fast_max(width(), fast_max(height(), depth()));
72  }
73 
74  float min_dimension() const {
75  return fast_min(width(), fast_min(height(), depth()));
76  }
77 
78  bool intersects_aabb(const AABB& other) const;
79  bool intersects_sphere(const smlt::Vec3& center, float radius) const;
80 
81  Vec3 centre() const {
82  return center_;
83  }
84 
85  bool has_zero_area() const {
86  /*
87  * Returns True if the AABB has two or more zero dimensions
88  */
89  bool empty_x = width() == 0.0f;
90  bool empty_y = height() == 0.0f;
91  bool empty_z = depth() == 0.0f;
92 
93  return (empty_x && empty_y) || (empty_x && empty_z) || (empty_y && empty_z);
94  }
95 
96  bool contains_point(const Vec3& p) const {
97  // FIXME: Use extents_ directly
98  if(p.x >= min().x && p.x <= max().x &&
99  p.y >= min().y && p.y <= max().y &&
100  p.z >= min().z && p.z <= max().z) {
101  return true;
102  }
103 
104  return false;
105  }
106 
107  bool contains_points(const Vec3* vertices, std::size_t count) const {
108  for(std::size_t i = 0; i < count; ++i) {
109  if(!contains_point(vertices[i])) {
110  return false;
111  }
112  }
113 
114  return true;
115  }
116 
117  Vec3 closest_point(const Vec3& p) const {
118  Vec3 closest;
119 
120  closest.x = fast_max(min().x, fast_min(p.x, max().x));
121  closest.y = fast_max(min().y, fast_min(p.y, max().y));
122  closest.z = fast_max(min().z, fast_min(p.z, max().z));
123 
124  return closest;
125  }
126 
127  bool contains_points(const std::vector<Vec3>& points) const {
128  return contains_points(&points[0], points.size());
129  }
130 
131  std::array<Vec3, 8> corners() const {
132  return {
133  center_ + Vec3(-extents_.x, -extents_.y, -extents_.z),
134  center_ + Vec3( extents_.x, -extents_.y, -extents_.z),
135  center_ + Vec3( extents_.x, -extents_.y, extents_.z),
136  center_ + Vec3(-extents_.x, -extents_.y, extents_.z),
137  center_ + Vec3(-extents_.x, extents_.y, -extents_.z),
138  center_ + Vec3( extents_.x, extents_.y, -extents_.z),
139  center_ + Vec3( extents_.x, extents_.y, extents_.z),
140  center_ + Vec3(-extents_.x, extents_.y, extents_.z),
141  };
142  }
143 
144  void encapsulate(const AABB& other);
145  void encapsulate(const Vec3& point);
146 
147  bool operator==(const AABB& rhs) const {
148  return min().equals(rhs.min()) && max().equals(rhs.max());
149  }
150 
151  bool operator!=(const AABB& rhs) const {
152  return !(*this == rhs);
153  }
154 
155  friend std::ostream& operator<<(std::ostream& stream, const AABB& aabb);
156 };
157 
158 std::ostream& operator<<(std::ostream& stream, const AABB& aabb);
159 
160 }
smlt::VertexData
Definition: vertex_data.h:57
smlt::Vec3
Definition: vec3.h:23
smlt
Definition: animation.cpp:25
smlt::AABB
Definition: aabb.h:22